ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PMSM星形改三角形后FOC与SVPWM的相位补偿与扇区重构

PMSM星形改三角形后FOC与SVPWM的相位补偿与扇区重构 把一台星形接法的永磁同步电机改成三角形接法听起来就是把三个绕组端子重新组合一下的事。但真正动手调过的人都知道改完绕组之后原来跑得好好的FOC代码会突然开始闹脾气电流波形发乱、电机声音发闷、转矩变小甚至动不动过流报警。问题出在哪绝大多数情况下不是你PI参数没调好而是你的坐标变换和SVPWM还停留在星形接法的坐标系里。这篇文章想把这件事彻底讲透从星形到三角形FOC加SVPWM控制里到底哪里变了相位偏移是怎么来的扇区为什么会重构以及代码上应该怎么改。如果你正准备把一台PMSM从星形改成三角形接法来适配低压大电流场景或者你的驱动器需要兼容两种绕组接法这篇内容会很有用。1. 星形到三角形改的不只是三个端子1.1 两种接法的电气关系先说清楚电机定子绕组有两种基本接法星形Y和三角形Δ。它们的区别如果只看接线图就是三个绕组的一端是聚在一起还是首尾相连。但放到控制器眼中差异直接改变线电压、线电流、绕组电压和绕组电流之间的比例关系。星形接法下三个绕组一端连接在一起形成中性点另外三个端子接逆变器。这时候线电流就是绕组相电流线电压等于√3倍的相电压。三角形接法下三个绕组首尾相连形成闭合回路三个连接点接逆变器。这时候绕组两端直接承受线电压但线电流是绕组相电流的√3倍。对照项目星形接法Y三角形接法Δ绕组相电压与线电压关系相电压 线电压 / √3相电压 线电压绕组相电流与线电流关系相电流 线电流相电流 线电流 / √3中性点存在一般不外接不存在绕组内部回路各相独立无内部环流通道三相闭合存在环流通道相同线电压下绕组承受电压较低较高典型应用场景高电压、低电流低电压、大电流这两组关系大家可能在电机学里都学过但在FOC工程调试里它不是一个“知道就行”的理论点而是会影响你每一个电流波形、每一行控制代码的工程前提。你想想原来星形接法时电流采样电阻上采到的电流直接就是绕组相电流Clark变换、Park变换全部按这个前提展开。换成三角形之后你采到的是线电流绕组里面实际流的是另一组电流幅值差√3倍相位还偏了30°。如果控制代码不识别这个差异那电流环就是在拿错误的反馈做闭环性能自然乱套。1.2 FOC为什么这么在意绕组接法FOC的核心思路是把三相交流电流转换到转子dq坐标系下变成类似直流电机的励磁分量和转矩分量然后分别做PI调节。这个变换链路上第一步是Clark变换它把三相静止坐标下的电流映射到两相静止αβ坐标系。这一步默认三相电流满足基尔霍夫电流定律并且三个电流的物理含义是一致的。星形接法下三个线电流就是三个绕组电流采样得到的数值直接满足Clark变换的输入要求。三角形接法下你通过采样电阻或电流传感器得到的三个线电流并不等于三个绕组电流。绕组内部的相电流与外部线电流之间存在30°的相位差和√3倍幅值差。这就相当于你原本对着一台机器用中文发指令对方听得懂现在你换了一台接线的机器还在用同一套语言但双方对“电流”这个词的定义已经不一样了。如果强行用线电流做FOC虽然从控制框图上看id、iq都有值电流环也能收敛但实际作用在电机上的磁场矢量方向和大小全不对表现出来就是转矩变小、效率下降、电流畸变。另外SVPWM模块内部通过Uα、Uβ判断参考电压矢量落在哪个扇区并计算相邻两个基础电压矢量的作用时间。当你把绕组从星形改成三角形后逆变器输出同样的PWM状态绕组上实际获得的电压相对于原来的星形接法已经变了。如果不修正SVPWM的输入扇区判断自然也会跟着出错。这就是“扇区重构”问题的来源。2. 相位偏移先从电流反馈和电压基准说起2.1 线电流和绕组相电流之间差了一个30°三角形接法下线电流和绕组相电流的关系不是简单缩放。假设三相绕组电流为i_ab Iph × cos(ωt)i_bc Iph × cos(ωt - 120°)i_ca Iph × cos(ωt 120°)那么流进A端子的线电流i_A i_ab - i_ca Iph × [cos(ωt) - cos(ωt 120°)]用三角函数公式展开后得到i_A √3 × Iph × cos(ωt - 30°)也就是说A相线电流的幅值是绕组相电流的√3倍相位比绕组相电流滞后30°。B相、C相也是同样的关系各自滞后30°。这个30°的相位差就是标题里说的“相位偏移”的根源之一。你在采样端看到的是线电流但真正决定电机转矩和磁场的是绕组相电流。要让FOC内部看到正确的相电流矢量必须把采到的线电流空间矢量旋转30°再把幅值缩小√3倍。方向别搞反。线电流滞后相电流30°所以从线电流还原相电流要把角度往前补30°也就是逆时针旋转30°。如果你补反了相当于把误差从30°放大到60°电机会抖得更厉害。2.2 电压基准那边方向是反过来的电流反馈要修正电压前向同样要修正而且方向相反。先看星形接法下SVPWM干了什么。FOC电流环输出Vd、Vq经过逆Park变换得到Vα、Vβ再送进SVPWM。SVPWM根据Vα、Vβ生成桥臂开关状态。从逆变器桥臂中点看输出的是线电压而星形接法下绕组相电压等于线电压除以√3并且相位比线电压滞后30°。也就是说星形接法下FOC控制层期望的Vα、Vβ经过SVPWM之后真正加在每相绕组上的电压比期望值小√3倍角度还滞后30°。电流环闭环工作时PI调节器会自动把这一部分差额补回来所以星形模式下整个控制环还是能正常工作。改成三角形接法之后就不同了。绕组两端直接承受线电压同一个PWM状态在绕组上产生的电压比星形时高了√3倍相位关系也不一样。如果继续沿用原来的Vα、Vβ作为SVPWM输入绕组会过压电流环会拼命往下调占空比系统很快进入非线性区波形自然好不了。所以正确的做法是在逆Park变换之后、SVPWM计算扇区之前对Vα、Vβ做一次固定变换把控制层的相电压参考转换成三角形接法所需的逆变器输出目标。这个变换就是缩放1/√3并旋转-30°。到这里你会发现电流反馈是线电流旋转30°还原成相电流电压前向是相电压参考旋转-30°转换成线电压需求。两条路径的方向是相反的别记混。2.3 一个能直接用的旋转矩阵如果不想深究坐标变换推导可以直接用下面两组矩阵公式。电流反馈补偿把采样到的线电流转换成等效绕组相电流Iα_ph (Iα_line × cos30° - Iβ_line × sin30°) / √3Iβ_ph (Iα_line × sin30° Iβ_line × cos30°) / √3电压前向补偿把FOC输出的相电压参考转换为三角形模式下的SVPWM输入Vα_svpwm (Vα_ref × cos30° Vβ_ref × sin30°) / √3Vβ_svpwm (-Vα_ref × sin30° Vβ_ref × cos30°) / √3这两个矩阵一个是30°旋转一个是-30°旋转都乘以1/√3。之所以电流和电压方向相反根本原因在于线电流滞后绕组相电流而线电压超前绕组相电压。你从外部端子上看到的电流和电压与绕组内部真实的电流和电压偏差方向是反的。3. 扇区重构补偿之后SVPWM真的会自动重新分配扇区吗3.1 SVPWM扇区判断背后的物理SVPWM的工作原理是把逆变器的六个非零开关状态当作六个方向不同的基础电压矢量把零矢量当作原点。任意一个目标电压矢量都可以由所在扇区相邻的两个基础矢量按时间比例合成。扇区判断通常不是直接算角度而是用Vα、Vβ构造三个判断量。比如常见代码里的写法U1 VβU2 0.5 × Vβ 0.866 × VαU3 0.5 × Vβ - 0.866 × Vα根据这三个量的正负组合就可以确定参考电压矢量落在哪个60°扇区。然后在该扇区内选择对应的两个非零基础矢量计算它们各自的作用时间T1、T2剩余时间插入零矢量。当你对Vα、Vβ做了-30°旋转和1/√3缩放之后送入SVPWM的参考矢量已经变成另一个矢量。原来在0°到60°之间的矢量补偿后可能落到300°到360°区间对应的扇区编号、基础矢量选择、作用时间全部跟着变。这个过程不是人为去改扇区表而是因为输入矢量本身变了SVPWM天然会“重构”扇区分配。这里所谓的“扇区重构”指的是参考矢量在补偿之后落在了一个新的扇区位置导致整个PWM调制策略自动切换到另一组相邻基础矢量上。理解这一点很重要SVPWM算法本身不需要大改只要保证送入它的Vα、Vβ已经是修正后的值就对了。3.2 一个实际例子补偿前扇区I补偿后扇区VI举个具体数字帮助理解。假设某一时刻逆Park变换输出的Vα 100Vβ 50。按照上面的电压补偿公式计算Vα_svpwm (100 × 0.866 50 × 0.5) / √3 ≈ 64.4Vβ_svpwm (-100 × 0.5 50 × 0.866) / √3 ≈ -3.9补偿前的参考矢量角度是atan2(50, 100) ≈ 26.6°落在扇区I0°到60°。补偿后的矢量角度是atan2(-3.9, 64.4) ≈ -3.5°也就是约356.5°落在扇区VI300°到360°。同一个控制周期内星形模式下SVPWM用V1和V2合成电压矢量三角形模式下它会自动改用V6和V1。基础矢量变了作用时间比例也变了但最终在绕组上产生的电压却能和原来星形模式保持一致。这就是扇区重构的实际效果。3.3 作用时间公共量的推导思路很多做SVPWM的工程师看过代码里的X、Y、Z公共量但不清楚它是怎么来的。这里以扇区I为例简单推一下。扇区I由基础矢量V1角度0°和V2角度60°合成。设PWM周期为TsV1作用时间为T1V2作用时间为T2两个基础矢量的幅值都为K。按照伏秒平衡Vα × Ts T1 × K T2 × K × cos60° K × (T1 0.5 × T2)Vβ × Ts T2 × K × sin60° K × T2 × 0.866从第二个式子可以直接解出T2代回第一个式子解出T1。最后得到T2 Vβ × Ts / (K × 0.866)T1 (Vα × Ts / K) - 0.5 × T2实际代码里不会每次都做除法和三角函数而是把K、Ts都折算成系数提取出X、Y、Z三个公共量再根据扇区编号查表得到T1、T2。不同代码里X、Y、Z的定义和符号可能略有差异但本质都是上面这个伏秒平衡推导出来的。你把这一节看懂之后再去看手头代码的扇区表会清晰很多。4. 代码落地星形FOC工程迁移到三角形的修改清单4.1 电流反馈补偿Clark之后Park之前最常见的做法是在Clark变换得到Iα、Iβ之后马上调用一个补偿函数。代码放在电流环采样处理流程里调用位置很关键必须在Park变换之前。#define MOTOR_DELTA_CONNECTED 1 #define SQRT3_DIV3 0.5773502691896258f #define COS_30 0.8660254037844387f #define SIN_30 0.5f // 线电流 - 等效相电流 // 在 Clark 变换之后、Park 变换之前调用 static void delta_current_compensate(float *i_alpha, float *i_beta) { float ia *i_alpha; float ib *i_beta; *i_alpha SQRT3_DIV3 * (ia * COS_30 - ib * SIN_30); *i_beta SQRT3_DIV3 * (ia * SIN_30 ib * COS_30); }这段代码做的事情就是把电流空间矢量逆时针旋转30°同时把幅值缩小√3倍。它是把采样线电流还原成绕组相电流让后续Park变换看到的id、iq反映真实的电磁转矩状态。4.2 电压前向补偿逆Park之后SVPWM之前电压补偿放在逆Park变换之后、SVPWM计算之前。初始化代码里的常量定义可以和电流补偿共用这里主要展示补偿函数本身。// 相电压参考 - 三角形接法所需的SVPWM输入 // 在逆Park变换之后、SVPWM扇区判断之前调用 static void delta_voltage_compensate(float *v_alpha, float *v_beta) { float va *v_alpha; float vb *v_beta; *v_alpha SQRT3_DIV3 * (va * COS_30 vb * SIN_30); *v_beta SQRT3_DIV3 * (-va * SIN_30 vb * COS_30); }注意这个函数的旋转方向和电流补偿是反的。电流补偿是30°电压补偿是-30°。如果你用的是这种写法函数名务必带清楚别两个都用同一个方向否则系统不稳定是必然的。调用顺序示意// 电流环中断服务函数里 clark_transform(ia, ib, ic, i_alpha, i_beta); #if MOTOR_DELTA_CONNECTED delta_current_compensate(i_alpha, i_beta); #endif park_transform(theta, i_alpha, i_beta, id, iq); // 电流PI计算... // 电压前馈计算... inv_park_transform(theta, vd, vq, v_alpha, v_beta); #if MOTOR_DELTA_CONNECTED delta_voltage_compensate(v_alpha, v_beta); #endif svpwm_calc(v_alpha, v_beta, duty_a, duty_b, duty_c);从代码结构上看只增加了两个函数调用工程量不大。但这两个调用点如果放错位置整个坐标系就全乱了。4.3 其它要同步处理的项初始位置、PI参数、Kt标定改完上面两个补偿函数只是把最核心的坐标系问题解决了。实际项目里还有几件事要一起做否则上电测试依然可能出问题。第一转子初始位置检测。如果你用的是编码器建议重新做一次零位标定。因为绕组接法变了之后同一个编码器零位对应的电角度关系已经变了特别是无感FOC里的高频注入或脉冲电压法估算出来的磁极位置与绕组的实际连接方式有关需要现场确认是否还有30°偏差。第二电流环PI参数。三角形接法下电流环控制对象从绕组相电流变成了经过修正的等效相电流。虽然补偿函数消除了角度和幅值偏差但PWM输出电压和绕组电压之间的比例关系变了电流环开环增益大概率会变化。原有PI参数可能偏大或偏松建议先按原参数的0.5到0.8倍起步再逐步加大。第三转矩常数Kt和反电动势常数Ke要重新标定。三角形接法下绕组承受电压能力提高但同样电流下产生的转矩和反电动势与星形接法不同。如果你的代码里有Kt前馈转矩控制或者观测器里有Ke参数这两个数值必须更新否则高速段会出现电压前馈不准、观测器估算偏差的问题。5. 调试中的坑波形、噪声、过流都是常见的信号5.1 典型问题速查表我整理了一份三角形接法FOC调试中比较典型的故障对照表给正在调试的人做个参考。现象可能原因检查方法电流波形整体偏大母线电流飙升没有做电压前向缩放绕组承受的电压变为原来的√3倍确认delta_voltage_compensate已启用SVPWM输入前Vα、Vβ是否乘以0.577电机声音发闷输出转矩比预期小电流反馈没有补30°id、iq方向不对励磁分量过大用示波器对比线电流和绕组相电流确认相位差低速正常高速过流或失步初始位置/编码器零位没有重新标定电角度偏差累积重新标定编码器零位或软件里加角度偏移量三相线电流采样之和不为零三角形绕组存在环流或PWM采样时刻不对调整电流采样窗口检查死区设置必要时加环流抑制Iq为正但转矩明显不足转矩常数Kt没有重新标定电流换算关系错误空载运行记录Iq和转速重新拟合Kt从表格可以看出绝大多数问题都不是代码运行逻辑错误而是星形和三角形之间的物理关系没有换算到位。5.2 说个容易被忽略的坑三角形绕组内部环流三角形接法有一个星形接法没有的问题绕组本身是闭合回路。逆变器输出的共模电压会在三角形回路里激励出零序环流。这个环流不体现在线电流里但会在绕组内部实实在在流动产生额外发热和转矩波动。如果项目要求比较高比如驱动器要做高频PWM或者长时间满负载运行建议在绕组某一相上增加额外的电流采样或者使用两路采样加软件观测器来估计环流。成本敏感的项目至少要在软件里注意不能简单用两路线电流推算出第三相绕组电流因为线电流满足i_A i_B i_C 0但绕组相电流不满足这个关系。这个坑最容易在调试后期暴露低速运行一切正常高频或重载时电机表面温度明显偏高线电流波形看起来良好但电机就是比星形接法更容易发热。很多人会想到是铁损或铜损却忽略了环流这个隐形消耗。5.3 排查步骤建议如果你现在手头就有一台改接线的电机在调试不知道从哪下手我建议按下面的顺序来。第一步断电状态确认绕组接线。用万用表或电桥量三个端子之间的电阻三角形接法任意两端测到的都是两段绕组串联再并联一段绕组后的阻值星形接法测到的是两段绕组串联的阻值两者差异明显。确认接线无误再上电。第二步手动盘车看反电动势。示波器探头接在电机两个端子上匀速转动电机记录反电动势波形。三角形接法下端子之间测得的就是绕组反电动势星形接法下需要对比线电动势和虚拟中性点的关系。这一步能帮你确认相位基准。第三步空载低速运行采集电流波形。开启电流补偿和电压补偿之后看id是否收敛到设定值附近。表贴式PMSM通常让id趋近于0内嵌式PMSM则按MTPA曲线给定。如果id偏得厉害优先怀疑电流补偿方向。第四步逐步加载观察转矩和电流的线性关系。在额定转速以下转矩与Iq大致成正比。如果加载后Iq明显高于预期而转矩偏低说明Kt标定不对或者电角度还有偏差。这一套流程走下来大部分问题都能定位到具体环节。6. 再分享一点我的个人体会我在实际项目中做过一次类似的星形转三角形适配最深刻的感受是这个问题的难点不在算法而在你愿不愿意把绕组接法带来的物理差异重新过一遍坐标系。很多人一开始都想偷懒想着“电机是改接线了但我软件里随便补偿一下不就行了”。结果不是电流环发散就是高速失步浪费的时间反而更多。只要你老老实实把电流反馈和电压前向两个补偿函数加上把初始位置重新标定一遍SVPWM扇区会自动重构整个系统会比你想象的稳定得多。还有一个小技巧调试时可以在代码里加一个运行模式切换开关比如MOTOR_DELTA_CONNECTED这个宏星形和三角形共用一套代码切换时只需要改宏定义方便现场对比验证。别把星形补偿和三角形补偿混在一起写那样出问题的时候你根本分不清是哪条路径在起作用。最后提醒一句改完接线之后第一次上电千万别直接给大负载先把母线电压限到一半空载低速跑通再逐步提升。无论是星形还是三角形安全调试的习惯永远比调参技巧更重要。
返回列表