ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

SVPWM过调制算法原理与Simulink仿真实现

SVPWM过调制算法原理与Simulink仿真实现 1. 从电压瓶颈说起为什么你的电机出力总差一口气做电机驱动的朋友应该都遇到过这个场景直流母线电压明明够用电流环参数也调得没问题但电机跑到高速段就是提不上劲转矩明显往下掉转速上去之后带载能力像个泄了气的气球。你翻遍资料发现大家都在说“SVPWM比SPWM电压利用率高”可你把SVPWM换上去之后问题解决了一部分却还是差了那么一口气——特别是在额定转速以上或者母线电压偏低的工况下电压利用率的天花板就像一堵看不见的墙死死卡住了电机的出力上限。这堵墙就是所谓的“电压瓶颈”。用大白话说逆变器能输出到电机端口的最大相电压是有上限的这个上限由直流母线电压决定。普通SVPWM在线性调制区最大能输出的相电压幅值是 ( V_{dc}/\sqrt{3} )对应调制比 ( M 1 )。在这个范围之内输出电压的基波分量和参考电压是严格线性的关系SVPWM的优势体现得淋漓尽致。但问题在于很多实际工况需要的电压已经超过了这个上限——比如电动汽车爬长坡、机床主轴高速运转、无人机电机在低电压下发力这时候电压不够用电机性能就被硬生生压住了。解决的思路有两个方向一是抬高母线电压但这意味着改硬件、换电源、加成本很多时候根本不现实二是在软件上动脑筋让逆变器在超出线性调制区的范围内继续工作用牺牲一部分波形质量换取更高的电压输出这就是过调制Overmodulation算法的核心思想。这篇文章要讲的就是第二种方案。我会从SVPWM的电压极限讲起把过调制I区和II区的原理、实现方法、Simulink建模步骤全部拆开揉碎让你不光是看懂还能直接照着搭出一套能跑的仿真模型。适合正在做PMSM/FOC控制的工程师、搞电力电子仿真的研究生、以及所有被“电压不够用”折磨过的电机驱动开发者。2. SVPWM过调制原理拆解吃透电压利用率的天花板2.1 先从电压空间矢量说起在聊过调制之前得先把SVPWM的基本盘复习一遍。三相逆变器有六个功率开关上下桥臂互补导通因此一共有 ( 2^3 8 ) 种开关状态其中6个是非零电压矢量 ( V_1 \sim V_6 )2个是零矢量 ( V_0 ) 和 ( V_7 )。这6个非零矢量把复平面分成了6个扇区每个扇区60度。SVPWM的基本思路就是在一个开关周期内用所在扇区相邻的两个非零矢量和零矢量按照一定的时间比例合成出想要的参考电压矢量 ( V_{ref} )。这里有个关键点大家要记住6个非零矢量的幅值都是 ( 2V_{dc}/3 )它们的顶点连线构成了一个正六边形。SVPWM线性调制区的范围就是这个六边形的内切圆半径是 ( V_{dc}/\sqrt{3} )。为什么要强调这个内切圆因为在圆内参考电压矢量的轨迹是圆形的合成出来的电压基波是标准正弦谐波含量少电流波形漂亮。一旦参考电压矢量的幅值超过内切圆半径它的轨迹就会有一部分落在六边形外面这时候线性调制就玩不转了必须进过调制区。2.2 调制比衡量“过”了多少的关键指标定义调制比 ( M ) 为[ M \frac{V_{ref}}{V_{dc}/\sqrt{3}} \frac{\sqrt{3} \cdot V_{ref}}{V_{dc}} ]其中 ( V_{ref} ) 是参考电压矢量的幅值。当 ( M 1 ) 时参考电压正好落在内切圆上这是线性调制区的边界。当 ( 1 M 1.15 ) 时进入过调制区当 ( M 1.15 ) 时参考电压的幅值达到六边形的顶点幅值 ( 2V_{dc}/3 ) 除以 ( V_{dc}/\sqrt{3} \approx 1.1547 )也就是六边形外接圆的半径这是SVPWM能达到的理论极限。为了方便理解我列个表调制比范围工作区域输出电压特点谐波情况( M \le 1 )线性调制区输出与参考严格线性谐波极小( 1 M 1.047 )过调制I区基波近似跟踪参考幅值略低低频谐波开始出现( 1.047 M 1.1547 )过调制II区输出幅值按比例接近极限谐波明显增加( M 1.1547 )六阶梯波模式输出为方波/六阶梯波谐波最大这里注意过调制I区和II区的分界点是 ( M 1.047 )这个数字是 ( 3/\pi \approx 0.955 )不对说反了准确说是 ( 1.0472 \approx \pi/3 ) 的倒数后面细讲。反正你先记住过调制不是一个“一锤子买卖”它是分阶段的每个阶段的控制策略还不一样。2.3 过调制I区让参考电压“拐个弯”过调制I区的范围是 ( 1 \le M 1.047 )它的特点是参考电压矢量幅值超出了内切圆但超出的幅度不大。如果直接按照线性SVPWM的方式继续算占空比会出现什么情况你会发现在某些角度计算出来的矢量合成轨迹会跑到六边形外面去。但注意逆变器实际能输出的电压矢量是有限制的——它只能在六边形内部工作。所以如果一个参考电压超出了六边形边界你不可能真的输出这个电压必须把超出部分“拉回来”。过调制I区最经典的控制策略是“最小相位误差法”。它的思路很直观当参考电压落在六边形内部时按正常SVPWM输出当参考电压落在六边形外部时保持参考电压的角度不变把幅值收缩到六边形的边界上让实际输出电压矢量的相位尽可能接近参考电压实现最小相位偏差。用公式表达设参考电压为 ( V_{ref} V_{ref}\angle \theta )当它超出边界时实际输出电压变成[ V_{out} V_{boundary}(\theta) \cdot \frac{V_{ref}}{|V_{ref}|} ]关键在于求 ( V_{boundary}(\theta) )也就是给定角度下六边形边界上对应的幅值。这个可以预先算好存成查找表也可以在线计算。实际实现中更常用的做法是引入一个修正因子。具体来说需要在SVPWM原始的 ( T_1 )、( T_2 ) 作用时间基础上做修正。这里要引入一个关键概念——中间变量公共量后面在仿真部分我会详细推导这里先点个题过调制的本质就是对这个公共量做非线性变换。2.4 过调制II区向六阶梯波极限逼近当过调制比超过 ( M 1.047 ) 之后单纯靠“压幅保相”就不够用了因为此时电压误差已经大到无论如何都无法通过局部修正来弥补必须进入过调制II区。过调制II区的策略是“幅值逼近法”思路发生了质变不再追求让输出紧贴参考电压的相位而是把参考电压分成两部分——一部分是保持SVPWM线性调制的部分另一部分是直接输出某个固定非零矢量的部分。也就是说在一个基波周期内部分时间工作在线性调制部分时间直接输出六阶梯波。这就像开车一样大部分时间你正常走车道线性SVPWM但遇到要超车的时候你会短暂借道输出固定矢量借道的比例越大平均速度越快但风险也越大。过调制II区就是通过控制“借道”的时间比例来调节基波电压的幅值。这个比例叫保持角 ( \alpha_h )是过调制II区最核心的控制参数。当参考电压矢量位于保持角范围内时直接输出该扇区边界的非零矢量当参考电压矢量在保持角范围之外时回到线性SVPWM调制。( \alpha_h ) 越小保持时间越长输出电压越高谐波也越大。写到这里必须强调一句过调制不是免费的午餐。在I区谐波增加还不算太明显到了II区电流波形会发生明显畸变转矩脉动增大噪声变大对电机本体和负载都是考验。实际工程中能不过调制尽量不过调制过调制是“战术手段”而不是“常态策略”。3. Simulink仿真搭建从零开始实现过调制SVPWM3.1 整体模型架构规划仿真模型我建议按下述模块来搭清晰且便于调试参考电压生成模块输出 ( V_\alpha )、( V_\beta )或者直接给幅值和角度扇区判断模块根据 ( V_\alpha )、( V_\beta ) 判断当前扇区中间变量计算模块计算 ( X )、( Y )、( Z ) 三个公共量作用时间计算模块计算 ( T_1 )、( T_2 )、( T_0 )过调制修正模块对 ( T_1 )、( T_2 ) 做过调制修正PWM生成模块生成六路PWM驱动信号还有被控对象——三相逆变器模型和永磁同步电机模型Simulink自带的Simscape Electrical里有现成的直接用就行。建议先用阻感负载做验证确认过调制算法本身没问题再接电机模型。整个仿真时间建议设置0.1s到0.2s固定步长步长取 ( 1e-5 ) 到 ( 5e-7 ) 之间都可以看你想不想看开关纹波。开关频率设10kHz载波周期 ( T_s 1e-4 )。3.2 扇区判断与作用时间仿真底层基础为了照顾新接触这块的朋友我把SVPWM的基础计算步骤完整列一遍因为你连线性SVPWM都没吃透的话过调制更没法做。先定义参考电压在 ( \alpha\beta ) 坐标系下的分量为 ( V_\alpha )、( V_\beta )。假设你已经通过Clark变换得到了这两个量FOC控制里这是现成的。扇区判断公式条件扇区( V_\beta 0 ) 且 ( \sqrt{3}V_\alpha - V_\beta 0 ) 且 ( -\sqrt{3}V_\alpha - V_\beta 0 )I 扇区( V_\beta 0 ) 且 ( \sqrt{3}V_\alpha - V_\beta 0 ) 且 ( -\sqrt{3}V_\alpha - V_\beta 0 )II 扇区( V_\beta 0 ) 且 ( \sqrt{3}V_\alpha - V_\beta 0 ) 且 ( -\sqrt{3}V_\alpha - V_\beta 0 )III 扇区( V_\beta 0 ) 且 ( \sqrt{3}V_\alpha - V_\beta 0 ) 且 ( -\sqrt{3}V_\alpha - V_\beta 0 )IV 扇区( V_\beta 0 ) 且 ( \sqrt{3}V_\alpha - V_\beta 0 ) 且 ( -\sqrt{3}V_\alpha - V_\beta 0 )V 扇区( V_\beta 0 ) 且 ( \sqrt{3}V_\alpha - V_\beta 0 ) 且 ( -\sqrt{3}V_\alpha - V_\beta 0 )VI 扇区这段逻辑在MATLAB Function里很好实现直接if-else判断即可。接下来是中间变量 ( X )、( Y )、( Z )定义如下[ X \frac{\sqrt{3} T_s V_\beta}{V_{dc}} ][ Y \frac{T_s}{V_{dc}} \left( \frac{3}{2}V_\alpha \frac{\sqrt{3}}{2}V_\beta \right) ][ Z \frac{T_s}{V_{dc}} \left( -\frac{3}{2}V_\alpha \frac{\sqrt{3}}{2}V_\beta \right) ]这三个量是所有扇区统一计算的公共量也就是热词里提到的“中间变量公共量”。根据扇区查表得到 ( T_1 )、( T_2 )扇区( T_1 )( T_2 )I( -Z )( X )II( Z )( Y )III( X )( -Y )IV( -X )( Z )V( -Y )( -Z )VI( Y )( -X )然后进行饱和判断。如果 ( T_1 T_2 T_s )说明参考电压已经超出了线性调制区这时候需要做等比例缩小[ T_1 T_1 \cdot \frac{T_s}{T_1T_2}, \quad T_2 T_2 \cdot \frac{T_s}{T_1T_2} ]注意这一步等比例缩小其实就是最朴素的“过调制”处理。但它的问题在于过于粗暴输出电压和参考电压之间会出现明显的幅值偏差和相位偏差。而真正意义上的过调制I区/II区算法就是对这种“缩小”方式做更精细的控制。3.3 过调制I区仿真实现查表法最省事在Simulink里实现过调制I区我建议的路线是预计算修正函数用Lookup Table实现避免在每个仿真步长里做复杂三角函数运算跑起来效率高代码逻辑也清晰。具体做法是先确定你的调制比 ( M )然后针对这个 ( M ) 预先算出一条边界修正曲线——对于任意角度 ( \theta )计算出实际输出电压幅值与参考电压幅值的比例关系 ( k(\theta) )。这条曲线本质上反映了“在哪个相位上需要压多少幅值”。计算 ( k(\theta) ) 的公式可以这样推导。参考电压超出六边形边界的地方需要把幅值降到边界上。我们之前已经把六边形的边界函数 ( V_{boundary}(\theta) ) 算出来了所以[ k(\theta) \frac{V_{boundary}(\theta)}{V_{ref}} ]当 ( k(\theta) \ge 1 ) 时说明参考电压在边界内部不修正当 ( k(\theta) 1 ) 时说明参考电压在边界外部需要把幅值乘以 ( k(\theta) )。在Simulink里的实现步骤在MATLAB脚本里把 ( 0 \sim 60^\circ ) 范围内的 ( k(\theta) ) 离散成数组因为六边形对称只需要算一个扇区其他扇区通过角度映射复用。用2D Lookup Table或者1D Lookup Table存储这个数组输入是当前参考电压角度 ( \theta )输出是修正系数 ( k )。把修正系数乘到 ( V_\alpha )、( V_\beta ) 上用修正后的值去做正常的SVPWM扇区判断和时间计算。这个方案有几个好处。首先计算量很小Simulink跑起来飞快其次任何调制比 ( M ) 都可以通过重新计算数组来覆盖不需要改模型结构第三在线调参很方便你想看 ( M1.02 ) 和 ( M1.04 ) 的区别只需要换一组查表数据。3.4 过调制II区仿真实现保持角调节过调制II区实现比I区要复杂因为要引入保持角 ( \alpha_h ) 的概念并且 ( \alpha_h ) 和调制比 ( M ) 之间存在非线性映射关系。理论上( \alpha_h ) 可以通过以下关系确定[ M \frac{3}{\pi} \int_0^{\pi/6} \frac{\cos\alpha}{\sqrt{1 - (\tan\alpha / \sqrt{3})^2}} , d\alpha \frac{3\alpha_h}{\pi} ]这个公式看着头疼实际上也不用自己解。工程上常用的做法是在MATLAB里用数值方法比如fzero函数预先算出 ( M ) 到 ( \alpha_h ) 的映射表然后存入Lookup Table在线查询即可。仿真实现流程输入参考电压角度 ( \theta )先做角度归一化映射到 ( 0 \sim 60^\circ ) 基本扇区内。判断当前角度是否在保持角范围 ( [0, \alpha_h] ) 内。如果在直接输出该扇区的固定非零矢量即 ( T_1 T_s )、( T_2 0 )。如果不在保持角范围内按线性SVPWM计算 ( T_1 )、( T_2 )但要做一个线性插值修正让实际输出的基波幅值平滑过渡到目标调制比。这里要特别注意一个细节直接跳变到 ( T_1 T_s ) 会造成输出电流的突变导致转矩冲击。稳妥的做法是在保持角边缘做一两个步长的过渡带或者对 ( T_1 )、( T_2 ) 做低通滤波处理。我用过调制II区实测下来如果保持角处理得太生硬仿真里的电流波形会出现明显的“尖刺”而且这个尖刺会随着调制比升高越来越严重。加了过渡带之后波形会平滑很多谐波含量也有所下降代价是实际基波电压略微低于理论值但这个偏差在工程上可以接受。3.5 过调制修正模块在Simulink里的具体接线我给出我习惯用的模型实现方式你可以参照搭。建一个MATLAB Function模块命名为OvermodulationCorrection输入端三个信号( V_\alpha )、( V_\beta )、( M )。输出端是修正后的 ( V_{\alpha_mod} )、( V_{\beta_mod} )。在函数内部核心逻辑如下function [Valpha_mod, Vbeta_mod] OvermodulationCorrection(Valpha, Vbeta, M) % 将alpha-beta坐标转为极坐标 Vref sqrt(Valpha^2 Vbeta^2); theta atan2(Vbeta, Valpha); if M 1.0 % 线性区不修正 Valpha_mod Valpha; Vbeta_mod Vbeta; elseif M 1.047 % 过调制I区查表得到修正系数 k interp1(alpha_h_table, k_table, theta, linear, 1.0); Valpha_mod k * Valpha; Vbeta_mod k * Vbeta; else % 过调制II区保持角控制 theta_norm mod(theta, pi/3); % 归一化到0~60度 if theta_norm alpha_h % 输出固定非零矢量对应扇区顶点 % 此处简化为锁定输出最大电压矢量 Valpha_mod sqrt(2/3) * Vdc_ref * cos(theta); Vbeta_mod sqrt(2/3) * Vdc_ref * sin(theta); else % 线性插值过渡 k interp1(alpha_h_table, k_table, theta, linear, 1.0); Valpha_mod k * Valpha; Vbeta_mod k * Vbeta; end end end注意这只是核心逻辑的示意。实际工程实现里过调制II区的处理会更细致尤其是在“保持角由开关周期和载波比决定”这一块。建议在仿真验证阶段先用简化版确认原理通了之后再逐步完善。4. 关键参数计算与控制策略细节4.1 中间变量的推导过程附数学细节很多资料直接给了 ( X )、( Y )、( Z ) 的公式但没讲为什么。我补一下推导理解了之后你在实现时就不会出错了。以扇区I为例参考电压 ( V_{ref} ) 位于 ( V_1(100) ) 和 ( V_2(110) ) 之间。在一个PWM周期 ( T_s ) 内[ V_{ref} \cdot T_s V_1 \cdot T_1 V_2 \cdot T_2 ]把 ( V_1 \frac{2}{3}V_{dc} )、( V_2 \frac{2}{3}V_{dc}e^{j\pi/3} ) 代入在 ( \alpha\beta ) 坐标系下展开[ V_{ref\alpha} \cdot T_s \frac{2}{3}V_{dc}\left( T_1 \frac{1}{2}T_2 \right) ][ V_{ref\beta} \cdot T_s \frac{2}{3}V_{dc} \cdot \frac{\sqrt{3}}{2}T_2 ]由第二个式子直接解出[ T_2 \frac{3T_s V_{ref\beta}}{\sqrt{3}V_{dc}} \frac{\sqrt{3}T_s V_{ref\beta}}{V_{dc}} X ]这里 ( X ) 的定义就出来了。把 ( T_2 X ) 代入第一个式子[ T_1 \frac{3T_s V_{ref\alpha}}{2V_{dc}} - \frac{1}{2}T_2 \frac{3T_s V_{ref\alpha}}{2V_{dc}} - \frac{\sqrt{3}T_s V_{ref\beta}}{2V_{dc}} ]整理一下就是[ T_1 \frac{T_s}{V_{dc}}\left( \frac{3}{2}V_{ref\alpha} - \frac{\sqrt{3}}{2}V_{ref\beta} \right) ]这正好是 ( -Z )因为 ( Z ) 的定义是 ( \frac{T_s}{V_{dc}}\left( -\frac{3}{2}V_\alpha \frac{\sqrt{3}}{2}V_\beta \right) )所以扇区I中 ( T_1 -Z )。其他扇区的对应关系按照同样的方法在对应的相邻矢量坐标系里推导结论完全一致。理解了这个推导过程你就明白了一件事( X )、( Y )、( Z ) 本质上是“单位化之后的电压分量”它们的大小直接反映了参考电压在三个60度坐标系下的分量。过调制算法里对作用时间的调整本质上就是对这三个量的非线性缩放。4.2 过调制切换时的平滑策略从线性区切换到过调制I区再到过调制II区如果调制比是连续变化的比如电机转速持续上升导致反电动势持续增大那么不同调制区之间的切换必须平滑否则电流环会感受到明显的扰动。我实测遇到的典型问题是调制比 ( M ) 在1.0附近震荡时会出现“进出过调制区”的频繁切换。因为 ( M ) 是在线计算的受电流环波动影响会有微小抖动一旦 ( M ) 在1.0上下波动算法就会在线性区和过调制区之间反复横跳。输出电流波形看不太出来但在示波器上看相电压的PWM波形会发现占空比有明显的抖动这会引入额外的低频谐波。解决思路是给调制比做滞环处理进入过调制区的阈值设为 ( M_{enter} 1.02 )退出过调制区的阈值设为 ( M_{exit} 0.98 )。这样 ( M ) 在1.0附近波动时不会频繁切换只有确定进入了过调制状态才启动修正算法。同理在过调制I区和II区之间的边界 ( M 1.047 ) 附近也要做滞环避免切换抖动。我的经验是入口阈值 ( 1.05 )、出口阈值 ( 1.03 ) 比较合适具体数值可以根据仿真结果微调。4.3 调制比上限与死区效应很多人会忽略一个事儿上面讨论的 ( M 1.1547 ) 是理想情况下的极限实际系统里还有死区时间、管压降、最小脉宽限制等因素会吃掉一部分电压余量。死区时间的影响尤其不能忽视。死区会导致输出电压产生误差相当于在参考电压上叠加了一个扰动电压这个扰动电压的方向与电流方向相关大小与死区时间 ( T_d ) 成正比。当调制比接近极限时死区效应会被放大导致实际能达到的最大电压明显低于理论值。仿真里模拟死区的方式是在PWM发生器后面加Dead Zone模块或者直接用Simscape Electrical里逆变器模型的死区设置。如果你做的是离线仿真可以先把死区设成0验证算法本身没问题再逐步加上死区观察影响。另外在过调制区工作时( T_1 )、( T_2 ) 中会出现一个很小甚至接近0的值这时候要特别小心PWM的最小脉宽限制。如果计算出的脉宽小于功率管能可靠开通的最小时间实际输出会丢失这个脉冲导致输出失真。处理办法是当 ( T_1 T_{min} ) 时将 ( T_1 ) 置0把省下来的时间分配到 ( T_2 ) 或零矢量上。这个分支逻辑在Simulink里用if-else就能实现。5. Simulink仿真中的常见问题与调试经验5.1 电流波形上为什么出现了“台阶”很多人在仿真实测时发现过调制一启动电流波形不再是光滑的正弦波而是出现了明显的“台阶”看起来像波形被削顶了一样。这是过调制的正常现象不用慌。这个“台阶”的本质是当参考电压超出线性区时实际输出电压的幅值被压缩基波电压与参考电压之间出现偏差导致电机端电压不再是纯正弦电流的谐波分量增加波形自然就不光滑了。过调制I区时“台阶”还比较浅到了II区“台阶”就非常明显。如果“台阶”超出预期可以检查以下两点死区设置是否过大死区时间过大会加剧波形畸变。过调制修正表的精度是否足够。如果你用查表法做了量化采样点太少会导致修正不连续表现为波形出现小毛刺。5.2 过调制切换时转矩脉动突然增大这是过调制算法投入实际系统时最容易遇到的问题。原因前面已经分析过了调制区切换不连续或者处理过于生硬。排查思路先确认过调制I区的修正曲线是否连续。把修正系数 ( k(\theta) ) 画出来看在 ( \theta 0 ) 和 ( \theta 60^\circ ) 附近是否平滑如果不平滑切换点附近就会出现转矩脉动。其次确认调制比 ( M ) 的滞环逻辑是否生效如果 ( M ) 在边界附近抖动切换就会频繁发生。我在调试中习惯在模型中加一个Scope监控 ( M )、( k )、( T_1 )、( T_2 ) 四个量每次修改参数之后先看这四个量有没有突变再去看电流波形。比直接盯电流波形高效得多。5.3 仿真速度慢到没法跑过调制仿真如果使用Simscape Electrical的高精度逆变器模型配合固定步长小步长仿真速度确实感人。一个10ms的仿真可能要好几分钟。提速的几个实用技巧把Simscape里的逆变器模型换成基于数学关系的平均模型Average Model不要用全开关细节模型。平均模型计算量小一个数量级而且对验证过调制算法完全够用。只在你关心的频段内设置较小的步长其他时间用较大步长。Simulink的VariableStep求解器可以做到这一点但要注意过调制修正模块里的查表操作在变步长下也能正常工作。把不必要的示波器模块改成To Workspace仿真结束后再统一画图减少仿真过程中的图形渲染开销。5.4 常见问题速查表症状可能原因解决方法过调制启动后电流波形出现尖刺保持角切换不连续在保持角边缘加过渡带线性区到过调制区频繁切换( M ) 在边界抖动加入滞环控制转矩脉动明显增大过调制修正曲线不连续加密查表采样点检查边界条件实际电压达不到理论极限值死区效应、最小脉宽限制优化死区补偿设置最小脉宽保护逻辑仿真速度过慢开关模型计算量大换用平均模型过调制区电流畸变严重谐波含量增大确认调制比是否过高必要时限制过调制深度5.5 一个实用技巧从傅里叶分析里判断过调制质量判断过调制做得好不好不要光盯着时域波形要看频域。用Simulink里的Powergui模块做FFT分析观察基波幅值和谐波畸变率THD。过调制I区THD应该控制在5%到10%以内主要谐波成分是5次、7次等低频谐波。过调制II区THD会飙升到15%甚至更高这是正常的但你要确认没有出现偶次谐波——偶次谐波的出现往往意味着算法实现有bug比如扇区映射错误或者修正函数不对称。我之前调过一版过调制II区FFT分析发现2次谐波明显异常查了很久发现是角度归一化写错了——( \theta ) 映射到基本扇区时没有考虑负半轴的情况导致某些角度被映射到错误的扇区。修正之后偶次谐波立刻消失了。6. 过调制算法的工程落地建议6.1 不要脱离应用场景谈过调制最后说一点实际工程感受。过调制算法不是“越深越好”它的使用必须结合具体应用场景。在电动汽车驱动中过调制主要用于短时爆发出力比如超车、爬陡坡持续几秒到十几秒是能接受的。但如果长时间运行在过调制II区电机发热、噪声、振动都会显著上升对永磁体还可能存在退磁风险。所以工程上通常会加一个“过调制时间限制”——允许过调制运行但有时间上限超时后自动限制功率输出。在伺服控制中母线电压通常设计得比较宽裕过调制用得不多。但遇到电池电压跌落或者电网波动时过调制可以作为“临时保命”手段维持系统的基本输出能力等电压恢复后再退回过调制。6.2 离线仿真验证到在线工程部署的跨越仿真是基础但仿真和真实系统之间还有一个距离。从Simulink模型到真实控制器的C代码这个环节要注意几个问题一是浮点到定点的转换。Simulink的默认数据类型是double但很多MCU的算力跑双精度浮点运算会比较吃力。过调制算法里的查表、插值、三角函数都要做定点化处理特别是查表索引的计算在定点环境里要处理好边界溢出。二是查表数据的生成方式。不要在线实时计算过调制系数表工程上都是离线算好烧录成const数组。好处是运行时的计算量极小而且查表结果确定便于测试验证。我在实际项目里就是离线算了513个点的修正系数表在线只做线性插值运行开销微乎其微。三是仿真和实际系统之间的模型差异。Simulink实验里电流环带宽可以拉得很高但实际系统中受限于采样延迟和PWM更新延迟电流环带宽要低很多。过调制算法对参数变化敏感在仿真里表现良好的一版参数上机之后可能就差强人意需要重新标定。6.3 后续还可以怎么扩展过调制算法基本上属于SVPWM的“最后一公里”。做完这个后面可以往这些方向延伸过调制与弱磁控制的配合在高转速区过调制和弱磁通常是同时工作的。如何协调两者的优先级、如何避免两者互相干扰是一个很有价值的工程课题。模型预测控制MPC中的电压极限处理MPC天然能处理电压约束但计算量大。用SVPWM过调制加线性控制器是更工程化的路线。在线自适应过调制根据母线电压波动在线调整过调制策略保证直流电压跌落时依然能维持稳定的功率输出。我个人在实际操作中最大的体会是过调制算法本身并不复杂难点全在细节处理上。边界连续、切换平滑、死区补偿、最小脉宽保护每一个细节不到位最终表现出来的就是各种莫名其妙的谐波和抖动。把这篇文章里的要点都过一遍你搭出来的过调制仿真模型不会差到哪里去。如果调试中遇到什么新问题欢迎回来交流——毕竟电机控制这门手艺永远有学不完的细节。
返回列表