尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SVPWM过调制原理与实现:提升FOC电压利用率的关键技术

SVPWM过调制原理与实现:提升FOC电压利用率的关键技术 做无感FOC的人迟早会撞上这个场景母线电压明明没变电机转速却卡在一截上不去极对数、反电动势系数都核对过电流环带宽也往上推了转速就是差那么几百转。这时候老工程师会提醒一句话——去看看SVPWM是不是该进过调制了。SVPWM过调制是FOC矢量控制里把母线电压利用率从线性区天花板继续往上顶的一种手段。简单说常规SVPWM的线性输出范围被限制在六边形内切圆里最大相电压基波幅值只有Udc/√3换算下来大概0.577倍母线电压。对电池供电、母线电压抠抠搜搜的项目来说这层天花板挡了不少转速和功率。过调制就是把这层天花板砸掉让输出电压矢量的轨迹从内切圆扩展到六边形边界极限情况下逼近六步阶梯波电压利用率还能再往上走10%左右。这篇文章就把过调制的原理、I区II区怎么划分、代码怎么写、实测会踩什么坑一次性讲透适合正在调无感FOC或者在做电动工具、无人机电调、家电压缩机驱动的朋友。1. SVPWM为什么需要过调制线性区的天花板在哪1.1 SVPWM的合成原理与内切圆边界要搞懂过调制先得把SVPWM“喂不够”这件事看明白。SVPWM的核心是用六个非零开关状态和一个零开关状态在一个PWM周期内做伏秒平衡让合成电压矢量等于你想要的参考矢量Uref。六个非零矢量的顶点相连正好形成一个正六边形边长是2Udc/3。问题就出在这个“合成”上。一个PWM周期里你能拿来做伏秒平衡的时间只有Ts两个相邻非零矢量的作用时间T1和T2加起来不能超过Ts剩下的时间必须用零矢量补齐。所以参考电压矢量的幅值一旦超过某个值就合成不出来了。这个临界值就是六边形的内切圆半径等于Udc/√3。用几何话说内切圆以内的任何矢量都能由相邻两个非零矢量加零矢量精确合成输出是线性的基波电压和参考电压成正比。出了这个圆幅值就超出可用范围你再怎么调占空比实际输出也只能沿着六边形边界走。这个Udc/√3看着不起眼实际上决定了SVPWM比SPWM强在哪。SPWM线性区最大相电压幅值是Udc/2SVPWM能到Udc/√3高了大概15.47%。很多资料里说“SVPWM电压利用率比SPWM高15%”说的就是这一段。但到了Udc/√3SVPWM自己也到头了想再往上走就必须进过调制。1.2 过调制的价值到底有多大过调制能带来的增量经常被两类极端说法带偏。一类说“过调制很猛电机动能暴涨”另一类说“过调制就是让波形变难看的没啥用”。实测下来两边都不准确。从理论极限看六步阶梯波的相电压基波幅值是2Udc/π约等于0.637Udc。对比SVPWM线性区极限0.577Udc极限提升约10.3%。也就是说你费劲把过调制调到底电压利用率也就再多10%出头不可能翻倍。10%在电机控制里是什么概念在反电动势允许的前提下转速上限基本跟着电压走10%的电压提升约等于10%的转速提升。对无人机电调来说可能意味着多几百转的动力余量对电动工具来说意味着电池快没电时还能保持住额定转速对压缩机来说可能决定了能不能越过某个负载峰值点。这些场景下10%的电压利用率提升是实打实的价值。但反过来也要浇盆冷水过调制不是弱磁它不解决反电动势超过母线电压的问题。如果电机在高速区是因为反电动势太大、电流环输出已经饱和到极限过调制只能帮你多压榨出一小段转速区间真想大幅扩速还是要配合弱磁控制。过调制和弱磁是两套互补的手段别指望单靠过调制把转速顶上天。2. 过调制I区和II区到底怎么分算法怎么选2.1 I区限幅保相位波形第一刀过调制不是一个开关而是一个过渡过程。业内习惯把过调制分成两个阶段叫I区和II区分界线在“单纯限幅还能不能继续提升基波电压”这个临界点上。先看I区。参考电压矢量超出内切圆但超出不多。这时候最直观的做法是保持参考矢量的角度不变把幅值压到六边形边界上。内切圆半径是Udc/√3六边形边界到原点的距离在夹角30°处最短也是Udc/√3在顶点方向最长是2Udc/3。所以相位固定之后幅值能放到多大取决于当前角度下六边形边界离原点有多远。I区限幅的效果是波形开始出现削顶但基波电压仍然随着参考电压增大而增大。直到某个临界点限幅法产生的实际基波电压不再明显增长增益开始掉头这时候就摸到I区上限了。工程上这个临界点折算到不同归一化口径下差不多是0.95左右我调试时习惯用输出基波电压的FFT来判断比记数值更直观。I区的实现代价很低很多人的SVPWM代码里其实已经自带了这个功能——只要你写了“T1T2大于Ts就按比例缩小”这行保护本质上就是I区过调制。后面代码部分我详细说。2.2 II区牺牲相位换幅值逼近六步波单靠限幅法能榨出的基波电压是有上限的大概在1.05倍线性区极限附近就饱和了。再往上限幅法产生的输出电压基波分量开始跟不上参考值这时候必须换思路主动牺牲一些相位精度换取更大的基波幅值。II区的做法是在每个扇区的起始位置插入一个“保持角”。扇区开始后参考矢量角度还没走到六边形顶点附近就提前强制输出本扇区的起始顶点矢量保持一段时间再切换到沿边界跟踪。保持角越大输出电压波形越接近六步阶梯波基波电压也越高当然相位失真和低次谐波也越明显。极限情况下整个扇区60°全部处于保持状态输出就是六步阶梯波每个60°只输出一个基本矢量基波幅值达到2Udc/π。这就是过调制的物理极限。II区的保持角和调制深度不是线性关系。工程上最省事的方式是查表事前在仿真里扫点把“调制度→保持角”的对应关系标定出来写进一张表运行时查一下就行。标定方法后面实测部分会讲。2.3 常用过调制算法横向对比不同过调制算法本质上是在“复杂度”和“波形质量”之间做取舍。最小幅值误差法每个角度都把幅值钳到六边形边界上实现最简单谐波略大只在I区效果不错II区饱和后没辙。适合MCU算力紧张、只想浅尝辄止的项目。最小相位误差法限幅的同时尽量把相位误差控制在最小比纯限幅法波形好一点但实现上要多算一些角度补偿I区性能接近最优II区仍不够。保持角法查表修正法I区和II区统一处理通过保持角边界跟踪逼近最优轨迹基波电压可达极限低次谐波控制得也不错代价是需要标定表和额外的扇区判断逻辑。目前商用驱动器和高端电调用得最多的是这类。工程简化限幅法就是T1T2等比例缩放那行代码。它在整个过调制范围内都有效但效果不是最优属于“保底方案”。我个人的习惯是第一版先把这行写进去保证任何情况下不会输出超范围的占空比后面再根据项目需要决定要不要升级成保持角法。算法实现复杂度谐波水平基波提升上限适用场景最小幅值误差法低偏高I区上限算力紧张、浅度过调制最小相位误差法中中I区上限附近一般FOC项目I区为主保持角法高较低六步波极限需要压榨极限转速、高端驱动工程限幅法极低偏高约I区上限任何SVPWM代码的保底保护3. FOC中接入过调制的具体代码与参数3.1 先搞懂T1、T2和公共量X、Y、Z的推导讨论过调制代码之前得先把SVPWM作用时间那块捋明白因为过调制的一切动作都发生在T1、T2身上。看第I扇区参考电压Uref在αβ坐标系下写成Vα和Vβ它由相邻的两个非零矢量V1(100)和V2(110)共同作用T1、T2合成。伏秒平衡方程是T1×V1 T2×V2 Ts×Uref把V1、V2换成αβ坐标V1(2Udc/3, 0)V2(Udc/3, √3Udc/3)分开写成两个方程Vα×Ts (2Udc/3)×T1 (Udc/3)×T2Vβ×Ts (√3Udc/3)×T2解这个二元一次方程得到T2 √3VβTs/UdcT1 (1.5Vα - 0.866Vβ)Ts/Udc这就是第I扇区的T1、T2。你会发现六个扇区解出来的T1、T2造型很相似都能表示成三个公共量的组合。这三个公共量定义成X √3VβTs/UdcY (1.5Vα 0.866Vβ)Ts/UdcZ (-1.5Vα 0.866Vβ)Ts/Udc第I扇区正好对应T1-Z、T2X。其它扇区也是查表组合。这就是论坛里总有人问的“公共量推导”本质就是解伏秒平衡方程然后提取公因子。代码里先算X、Y、Z再按扇区switch给T1、T2赋值避免每个扇区都重新算一遍三角函数省了很大一块计算量。3.2 最省事的过调制实现T1、T2等比例限幅过调制的工程第一刀就是在T1、T2算完之后加一行饱和保护。如果T1加T2超过了PWM周期Ts说明参考电压矢量幅值已经越过了当前角度下的六边形边界。这时候把T1、T2按同一个比例缩小让T1T2刚好等于Ts等效于把电压矢量压回到边界上相位保持不变T1和T2的相对比例不变。这就是前面说的I区过调制也是“最小相位误差法”的简化版本。// SVPWM作用时间计算之后进入过调制保护 if (t1 t2 TS) { float scale (float)TS / (t1 t2); t1 (int16_t)(t1 * scale); t2 (int16_t)(t2 * scale); }这段代码值得十二分重视它同时干了两件事一是保证输出占空比永远不会超范围二是自动实现了过调制I区的电压提升。很多人调FOC电机转速上不去查到最后发现SVPWM里压根没有这行保护PWM寄存器写进去的超大比较值被硬件截断波形已经畸形了还不知道。我见过不止一个案例加上这行之后同一颗电机、同一块板子转速直接就上去了。等比例缩放看起来简单但要注意一个细节缩放之后T0零矢量时间变成0这时电流采样窗口会急剧缩小。如果FOC用的是单电阻或双电阻重构电流这部分要格外小心后面排查部分细说。3.3 进阶实现保持角法II区过调制想把过调制往深了做光靠限幅是不够的得把保持角加进去。II区过调制的核心逻辑是当前扇区内的参考矢量角度如果在保持角范围内就直接输出本扇区起始顶点矢量不让SVPWM去跟踪参考角超出保持角后才恢复正常的边界跟踪和限幅。保持角的大小和期望调制度直接相关。工程上不建议用公式硬算因为理论曲线在I区/II区交界处有非线性的过渡不同电机参数下也会有差异最好在仿真里标定一张表。// 保持角查表deep为0~1之间0表示刚进入II区1表示接近六步波极限 static float calc_hold_angle(float deep) { // 简化线性近似实际项目建议用标定表 return deep * 30.0f; // 单位度 } // II区过调制处理 float theta_s sector_angle; // 当前扇区内角度0~60度 float hold_deg calc_hold_angle(deep); if (theta_s hold_deg) { // 保持状态输出本扇区起始顶点矢量 // 至于是T1占满还是T2占满取决于你的扇区起始矢量定义 apply_sector_start_vector(sector); } else { // 跟踪状态正常算T1、T2超范围就等比例限幅 svpwm_normal_or_clamp(...); }这里有几个容易出问题的点。第一保持角从0开始增大时输出波形会在“保持”和“跟踪”两个状态之间来回切换如果切换点没有做平滑电流里会出现明显的6次谐波毛刺。第二不同扇区的起始矢量不一样正反转时扇区编号逻辑也要跟着变写代码时要格外细心。第三保持角一旦设起来相位误差是实打实存在的无感FOC在过调制II区容易发生观测器跟丢这点后面实测会举例子。3.4 过调制和电流环、死区补偿、弱磁怎么配合过调制不是孤立的一块功能它嵌在FOC的电压输出链路里前面连着电流环后面连着PWM和死区。配合不好波形会很难看。先说电流环。过调制意味着电压指令经常超出实际输出能力电流环PI的输出会长时间处于饱和状态。如果积分项不做抗饱和处理等参考电压回落到线性区时积分器还憋着一大堆累积值输出会猛地往下砸轻则电流过冲重则触发过流保护。我这里建议用back-calculation做积分器反向计算或者至少做积分分离确保电压饱和时积分器能快速“泄压”。再说死区补偿。低调制区死区补偿是救命的但过调制区它反而容易帮倒忙。占空比接近饱和时死区造成的电压误差方向和大小都在快速变化过补偿会让输出波形出现更深的削顶和零电流钳位电流谐波反而变大。我在多个项目里的做法是检测到进入过调制区后把死区补偿量按比例衰减到II区直接关闭。最后说弱磁的搭配。过调制和弱磁的组合是高速驱动的常规操作先过调制把基波电压往上抬同时用弱磁电流把反电动势压一压两个方向一起使劲才能把转速顶到最高。但注意顺序通常是浅弱磁过调制如果已经进入深度弱磁过调制引起的谐波会把d轴电流观测搅乱控制容易不稳。我的经验法则是弱磁电流超过额定电流20%以后过调制深度就不要再往上加了。4. 仿真验证与实测波形复盘4.1 Simulink里怎么搭最省心上真机之前建议先在Simulink里把过调制行为摸清楚。FOC的Simulink模型网上很多关键是把SVPWM模块改成能开关过调制的版本。具体做法在SVPWM计算T1、T2之后加一个过调制模块模块里放两个开关量一个控制是否启用I区限幅一个控制是否启用II区保持角。然后用一个斜坡信号控制参考电压幅值从Udc/√3逐渐加到2Udc/π对应值观察三个量SVPWM输出的等效平均电压、相电流THD、电机的转速响应。标定保持角表也在这里做固定直流母线电压和电机模型把参考电压幅值设成超过I区上限的某一档手动调整保持角深度用FFT看输出相电压的基波幅值。记录“基波幅值不再继续增长”和“基波幅值接近2Udc/π”这两个状态对应的深度值中间线性插值就得到一张能用的表。仿真里最容易发现的一个现象是过调制深度超过某条线后转矩脉动突然剧增原因是低次谐波电流在d、q轴上产生了额外的脉动转矩。这个转折点不同电机差别很大电感大的电机更稳一些电感特别小的电机可能在很浅的过调制下就开始抖。4.2 实测转速、电流、噪声的变化实测我用的是一块STM32F103C8主控的板子驱动一个航模小电机母线电压24V开关频率16kHz无感FOC用反电动势观测器。这套配置在过调制区间的表现很有代表性。第一个变化是转速上限。线性区压满时空载转速大约在7000转附近把过调制开到I区上限转速到了约7350转再开II区保持角极限能到约7650转。和理论推算的10%提升大致吻合。这里有个经验过调制对转速的贡献空载时比带载时更明显。因为带载时电流大、电阻压降大电压利用率的一部分被内阻吃掉了。第二个变化是相电流波形。线性区时相电流接近标准正弦过调制开启后电流波形顶部开始变平同时过零点附近出现一些振铃。把电流做FFT可以看到5、7、11、13次谐波明显上升总THD从线性区的5%左右涨到15%甚至更高。这就是过调制换来的代价。第三个变化是噪声。电机会发出一种比正常高频啸叫更低沉、和开关频率相关的“嗡嗡”声尤其是深过调制时比较明显。如果项目对声噪有要求要把过调制深度限制在I区以内或者加随机开关频率调制打散噪声频谱。还有一个我踩过的坑过调制II区保持角一开始标定得太大结果轻载运行时观测器跟丢电机突然失步母线电流瞬间顶到限流值。后来把保持角表重新标定并且在转速环输出端加了一个调制度上限限制才稳定下来。这个教训说明深度过调制切不可一把拉满要让转速环的输出在饱和边缘缓慢爬别给观测器太大的瞬态冲击。5. 过调制常见故障排查与避坑清单5.1 过调制一开就报过流这个现象十有八九是“切入太猛”。电压指令从线性区直接跳到过调制区电流环来不及反应d、q轴电流瞬间过冲。解决办法有两个方向一是给调制度加斜坡比如10到20毫秒内从1.0缓慢升到目标值二是把电流环PI输出限幅调小一点别让电压指令直接顶到六边形顶点附近。另外排查一下电流采样是否在过调制瞬间出现异常。T1T2接近Ts时零矢量时间很短单电阻电流重构在这个窗口下往往测不准报出来的电流本身就是错的。这种情况下不是过调制的问题是采样窗口的问题需要改采样策略。5.2 I区II区切换时输出抖动切换点不连续是主要原因。II区保持角的起点和I区限幅的终点如果形成台阶电流环会把这个台阶当成分量去追产生振荡。处理方法是让保持角从0开始连续增长同时I区和II区都用同一个调制度变量控制保证切换时输出连续。如果抖动里还夹杂着“咯噔咯噔”的低频响声多半是死区补偿在作怪。过调制区死区补偿过补偿时相电压出现钳位电流畸变会以周期性形式出现。把所有死区补偿先关掉试一次如果抖动消失那就是补偿逻辑和过调制打架了。5.3 母线电压利用率提升不明显先说一个排查点过调制后你测的是不是真正的基波电压。很多人用示波器的RMS档去量相电压波形削顶后RMS升高但基波可能没变那么多容易误判。看基波要先用FFT模式或者直接比较转速的实际增量。另一个常见情况是SVPWM输出后半段还有一个“占空比对称化”处理把比较值重新分配这个过程中如果不小心又做了一次限幅前面过调制撑出来的电压就被二次截掉了。检查代码里对比较值有没有多余的饱和操作保证过调制的限幅逻辑是唯一的。还有一个容易被忽略的点母线电压采样不准。母线电压读数偏低时SVPWM计算出来的T1、T2整体偏大还没到过调制区就提前饱和读数偏高时过调制深度又会被虚标。实测中把母线电压滤波时间常数调小一点或者用ADC过采样能让过调制启动点更可控。5.4 过调制和电流采样窗口冲突这是无感FOC里最棘手的问题之一。I区过调制轻的时候T0还有富余采样没压力进入II区后T0经常被压到接近0PWM输出几乎全程处于高电平或低电平常规的“下桥导通中点采样”策略直接失效。解决思路有几个。最直接的是限幅把最大调制度控制在0.98左右给零矢量留一点时间代价是牺牲那一小段电压利用率的提升。如果项目必须用满过调制可以考虑电流采样方式改为“非零矢量中点采样相电流重构”不同扇区切换采样点对代码和滤波要求更高但能保住过调制区的电流观测质量。观测器跟丢的问题也经常和采样窗口混在一起。无感FOC在过调制区失步先别急着怀疑观测器参数先看电流采样是否在T0很短时出现了毛刺这些毛刺进观测器会直接污染反电动势估算。把电流信号用硬件滤波或者软件滤波压一压失步概率会明显下降。5.5 我在过调制上最后想说的几点经验过调制这功能看着简单用起来全是细节。我自己做项目时默认第一版只写T1、T2等比例限幅那行保护先保证系统不炸、能跑再根据转速需求决定要不要上II区保持角。这行保护代码说它是SVPWM的保险丝一点不过分。另外过调制带来的谐波增加在负载突变时会被放大。如果有突加负载的工况调制度上限不要设在理论极限附近留5%到10%的余量否则一个负载脉冲就可能让电流失控。至少我手里的几个项目最后调制度上限都落在理论极限的90%到95%这个区间稳定性换来那一点点电压增量是划算的。调试时盯三个量调制度输出、相电流FFT的THD、母线电流波形幅值。这三个量配合起来基本能判断过调制当前是不是处在安全区域。等这套判断形成肌肉记忆你会发现过调制其实是个很好用的工具能让BOM不变的情况下把电机性能多压榨出一截这种“白捡”的性能提升做硬件的人很难不爱。
返回列表