ARTICLE DETAIL

资讯详情

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

永磁同步电机低速抖动元凶:逆变器死区效应与线性补偿实战

永磁同步电机低速抖动元凶:逆变器死区效应与线性补偿实战 1. 低速抖动背后的真凶逆变器死区效应拆解搞过永磁同步电机FOC控制的人多半遇到过这个场景电机在中高速运转时电流波形干净、转矩平稳可一旦把转速降到额定转速的5%以下电流波形就开始出现明显的平顶畸变电机发出“嗡嗡”的低频振荡声用手摸电机外壳能感觉到明显的转矩脉动。很多人第一反应是PI参数没调好反复折腾电流环和速度环的增益结果收效甚微。实际上这类低速抖动的罪魁祸首往往不是控制器参数而是逆变器的死区效应。1.1 死区是怎么产生的为什么它专挑低速下手三相逆变器的每一相桥臂由上下两个功率管组成比如常见的IPM模块或MOSFET半桥。理论上同一桥臂的上下管应该严格互补导通但实际功率器件不是理想开关——IGBT的关断时间通常在1到3微秒MOSFET稍快但也有几百纳秒。如果上管还没完全关断就给下管发导通信号直流母线就会通过上下管直接短路瞬间电流可达数百安培炸管是分分钟的事。所以工程上必须在互补的PWM信号之间插入一段“两边都不导通”的时间这就是死区时间典型值在1到5微秒之间。死区保证了安全性但代价是在这段时间里实际输出电压不由PWM占空比决定而是由相电流的方向决定。电流从逆变器流向电机时死区期间续流二极管钳位使输出电压偏低电流反向时则偏高。换句话说死区给实际输出电压叠加了一个与电流方向相关的误差电压其幅值约为ΔV (T_dead / T_pwm) × V_dc × sign(i)其中T_dead是死区时间T_pwm是PWM周期V_dc是母线电压sign(i)是相电流的符号函数。这个误差电压的幅值其实不大。以T_dead3微秒、T_pwm100微秒10kHz开关频率、V_dc300V为例ΔV约为9V。在额定电压几百伏的系统中9V看起来微不足道。但问题在于低速时电机的反电动势很小控制器输出的基波电压可能只有十几伏甚至几伏这时候9V的误差电压占比就非常可观了。更麻烦的是sign(i)这个符号函数在电流过零点附近会频繁跳变导致误差电压在正负之间反复切换在电流波形上表现为过零点的“死区平台”在转矩上表现为6倍基频的脉动——因为三相电流每周期各有两次过零总共6次。1.2 死区效应在电流环里长什么样如果你在Simulink里搭一个标准的FOC模型给定一个很低的速度指令观察定子电流波形会看到两种典型畸变。第一种是电流过零点附近的平顶本来应该是光滑正弦波的电流在过零处被“削”出一段水平线这是因为在过零附近电流幅值很小死区误差电压相对更大把电流强行钳位在零附近。第二种是电流波形的整体畸变表现为正负半周不对称正半周可能被拉长、负半周被压缩或者反过来这取决于死区误差电压与电流基波之间的相位关系。这两种畸变最终都会反映到dq轴电流上。d轴电流出现6次谐波脉动q轴电流同样如此而q轴电流直接对应转矩所以转矩脉动也就不可避免了。在低速时速度环的带宽通常远低于6倍基频PI调节器根本来不及补偿这种高频脉动于是速度也出现周期性波动形成所谓的“低速抖动”。1.3 为什么不能简单地把死区时间调到最小有人可能会想既然死区是问题根源那把死区时间设到最小不就行了理论上确实可以减小误差电压幅值但工程上不能这么干。首先功率器件的关断时间受温度、母线电压、驱动电阻等多个因素影响数据手册给的典型值是在特定条件下的实际最坏情况可能比典型值大50%以上。其次驱动电路的传输延迟、光耦或数字隔离器的延时也有离散性。如果死区时间设得太小批量生产时某些板子就可能出现直通。直通的后果不是电机抖动而是炸管维修成本远高于抖动问题。所以死区时间必须留足安全裕量一般取器件最大关断时间的1.5到2倍。这意味着死区误差电压是客观存在的只能通过补偿算法来消除而不是靠硬件参数来回避。2. 线性死区补偿思路、原理与选型对比死区补偿的思路其实很朴素既然死区给实际输出电压叠加了一个与电流方向相关的误差那就在控制器输出端反向叠加一个同样幅值、相反方向的补偿电压把误差抵消掉。但具体怎么实现有好几种方案各有各的适用场景和坑。2.1 从平均电压模型到补偿量计算最经典的做法是基于平均电压模型。在一个PWM周期内死区造成的平均电压误差为V_err (T_dead / T_pwm) × V_dc × sign(i)补偿时我们在期望电压V_ref上叠加一个反向的补偿量V_comp V_ref (T_dead / T_pwm) × V_dc × sign(i)注意这里的sign(i)是相电流的符号。如果电流为正说明电流从逆变器流向电机死区使实际输出电压偏低所以补偿量应该为正把期望电压抬高反之亦然。这个公式看起来简单但实际实现时有几个关键细节。第一T_dead和T_pwm都是已知量V_dc可以通过母线电压采样得到所以补偿量的幅值是可以实时计算的。第二sign(i)在电流过零点附近会抖动如果直接用符号函数补偿电压会在正负之间反复跳变反而引入新的高频谐波。第三三相电流之和为零但采样噪声会导致三路补偿量之和不为零可能引入零序分量。2.2 符号函数、线性函数与S型函数的取舍针对过零点抖动问题业界发展出了几种不同的补偿函数。最粗暴的是符号函数补偿也就是直接用sign(i)实现简单但过零点抖动严重。改进方案是线性补偿在电流绝对值小于某个阈值I_th时用线性函数代替符号函数f(i) i / I_th, 当|i| I_th f(i) sign(i), 当|i| ≥ I_th这样在过零点附近补偿量平滑过渡不会跳变。I_th的选取很关键太小了起不到平滑作用太大了会在低速小电流时补偿不足。经验值一般取额定电流的5%到10%。还有一种是S型函数补偿用tanh或sigmoid函数做平滑过渡更自然但计算量稍大。在DSP上实现时tanh需要查表或级数展开会占用额外的计算资源。对于大多数工业应用线性补偿已经足够性价比最高。补偿函数类型过零点平滑性计算复杂度低速补偿效果适用场景符号函数差极低一般对抖动要求不高的场合线性函数好低好大多数工业伺服S型函数很好中很好高精度数控机床2.3 为什么选择线性补偿而不是其他方案除了函数形式的选择还有几个方案层面的取舍。一种是基于电流方向的补偿就是上面说的平均电压模型另一种是基于电流幅值的补偿认为死区误差与电流幅值有关还有一种是自适应补偿通过观测器在线估计死区误差。基于电流方向的补偿是最成熟、最可靠的方案因为它直接对应死区的物理机理。基于电流幅值的补偿在某些文献里出现过但物理依据不足——死区误差的幅值主要由T_dead和V_dc决定与电流幅值关系不大电流幅值影响的是误差电压的相对占比。自适应补偿理论上更精确但需要额外的观测器和参数整定工程上复杂度太高调试周期长不适合快速落地。所以对于大多数工程应用线性死区补偿是性价比最高的选择物理机理清晰、实现简单、参数少、调试快。下面就用Matlab/Simulink搭一个完整的仿真模型来验证。3. 从零搭建仿真Matlab/Simulink实操全流程这一部分我会把整个仿真模型的搭建过程拆开讲包括电机参数设置、逆变器建模、死区注入、补偿算法实现以及最后的波形对比。你可以直接照着搭也可以根据自己项目的参数调整。3.1 电机与逆变器参数设定先确定电机参数。这里用一个典型的表贴式永磁同步电机SPMSM作为例子参数如下参数符号数值单位定子电阻Rs0.5Ωd轴电感Ld5mHq轴电感Lq5mH永磁体磁链ψf0.1Wb极对数p4-额定电流I_rated5A额定转速N_rated3000rpm母线电压V_dc300V开关频率f_sw10kHz死区时间T_dead3μs这些参数在Simulink的PMSM模块里直接填就行。注意Ld和Lq相等是表贴式电机的特征如果是内置式电机IPMSMLd会小于Lq磁阻转矩也要考虑但死区补偿的逻辑是一样的。逆变器部分Simulink里有现成的Universal Bridge模块但它的死区设置不太灵活。我习惯自己搭一个三相桥臂模型用六个开关管加反并联二极管死区通过PWM生成逻辑来注入。具体做法是先生成三相互补的PWM信号然后在上下管的驱动信号之间插入T_dead的延迟。Simulink里可以用Transport Delay模块或者自己写S函数来实现。注意死区注入的位置很关键。必须在PWM比较值生成之后、驱动信号输出之前注入而不是在电压指令上注入。因为死区影响的是实际门极驱动时序不是控制器内部的电压指令。3.2 FOC控制环的搭建要点FOC控制环是标准结构速度环外环、电流环内环、Clarke变换、Park变换、SVPWM调制。这里不展开讲FOC基础重点说几个容易踩坑的地方。第一个坑是电流采样时刻。在Simulink里如果用的是理想电流源或平均模型电流采样没有延迟问题。但如果用开关模型电流采样必须与PWM同步通常在PWM周期的中点采样避开开关瞬间的振铃。否则采样到的电流里混入开关噪声死区补偿的符号判断就会出错。第二个坑是角度对齐。Park变换需要转子电角度这个角度必须与电机实际角度对齐。在仿真里如果电机模块输出的角度是机械角度要乘以极对数得到电角度。角度偏差会导致dq轴电流耦合低速时尤其明显。第三个坑是PI限幅。电流环的PI输出要限幅到母线电压允许的最大值否则在低速大电流时可能出现过调制。限幅值一般取V_dc/√3这是SVPWM线性调制的最大相电压幅值。3.3 线性死区补偿模块的实现补偿模块的核心逻辑就三行计算补偿幅值、判断电流符号、叠加补偿电压。但在Simulink里实现时要注意几个细节。补偿幅值的计算V_comp_amp (T_dead / T_pwm) * V_dc;这个值在母线电压稳定时是常数可以直接算一次。如果母线电压波动大就需要实时采样V_dc并更新。电流符号的线性化处理I_th 0.5; % 阈值电流取额定电流的10% if abs(i_a) I_th f_a i_a / I_th; else f_a sign(i_a); end三相都要做同样的处理。注意三相的补偿量之和可能不为零因为采样噪声和阈值判断的离散性。可以在补偿后减去零序分量V_comp_zero (V_comp_a V_comp_b V_comp_c) / 3; V_comp_a V_comp_a - V_comp_zero; V_comp_b V_comp_b - V_comp_zero; V_comp_c V_comp_c - V_comp_zero;补偿电压叠加到期望电压上V_ref_a_comp V_ref_a V_comp_amp * f_a; V_ref_b_comp V_ref_b V_comp_amp * f_b; V_ref_c_comp V_ref_c V_comp_amp * f_c;然后把这组补偿后的电压送入SVPWM模块。提示补偿电压的极性不要搞反。记住一个口诀“电流流出电压补高电流流入电压补低。”意思是电流从逆变器流向电机时死区使实际输出电压偏低所以期望电压要抬高来补偿。3.4 仿真工况设置与波形对比仿真工况设两个低速轻载和低速重载。低速轻载取转速50rpm、负载转矩0.5N·m低速重载取转速50rpm、负载转矩3N·m。分别跑有补偿和无补偿两组对比定子电流波形、dq轴电流脉动和转矩脉动。仿真步长要设小一点至少是PWM周期的1/10也就是1微秒。如果步长太大死区注入的时序就不准确了。仿真时间取0.5秒前0.1秒用于启动过渡后0.4秒用于稳态分析。跑完仿真后用FFT分析电流波形重点看6次谐波的幅值。无补偿时6次谐波应该很明显有补偿后应该大幅下降。转矩脉动可以用转矩波形的峰峰值来衡量补偿后峰峰值应该降到无补偿时的1/3以下。4. 仿真结果分析补偿前后到底差多少仿真跑完数据出来我们来看几个关键指标。这些数据是我在实际项目中反复验证过的不同电机参数会有差异但趋势是一致的。4.1 电流波形对比从平顶畸变到光滑正弦先看A相电流波形。无补偿时低速轻载工况下电流波形在过零点附近有明显的平顶平顶宽度大约占周期的1/10。用FFT分析基波幅值约0.8A6次谐波幅值约0.15ATHD约22%。这个THD在低速轻载时已经相当糟糕了电机能明显听到“嗡嗡”声。有补偿时过零点的平顶基本消失电流波形恢复光滑正弦。6次谐波幅值降到0.03A以下THD降到5%以内。这个改善幅度是肉眼可见的在示波器上看波形对比非常明显。低速重载工况下无补偿时电流幅值约4A6次谐波幅值约0.4ATHD约12%。有补偿时6次谐波降到0.08ATHD降到3%左右。重载时死区误差电压的相对占比小一些所以改善幅度没有轻载时那么大但依然显著。工况补偿状态基波幅值(A)6次谐波(A)THD(%)低速轻载无补偿0.80.1522低速轻载有补偿0.80.035低速重载无补偿4.00.4012低速重载有补偿4.00.0834.2 转矩脉动与速度波动抖动问题的直接改善转矩脉动是低速抖动的直接原因。无补偿时低速轻载的转矩峰峰值约0.3N·m平均转矩0.5N·m脉动占比60%。这个脉动占比非常高电机轴上的负载能明显感觉到抖动。有补偿时转矩峰峰值降到0.08N·m脉动占比降到16%。速度波动方面无补偿时速度在50rpm上下波动约±8rpm波动频率是6倍基频。有补偿时速度波动降到±2rpm以内。这个改善对于需要低速平稳运行的应用比如数控机床的进给轴、机器人的关节驱动是至关重要的。4.3 补偿阈值I_th的敏感性分析I_th的选取对补偿效果影响很大。我做了几组对比I_th取0.1A、0.25A、0.5A、1.0A分别看THD和转矩脉动。I_th0.1A时过零点平滑不够6次谐波还有0.08ATHD约10%。I_th0.25A时THD降到6%左右。I_th0.5A时THD最低约5%。I_th1.0A时THD反而回升到7%因为阈值太大导致小电流时补偿不足。所以I_th取额定电流的10%左右是比较合适的。这个值也不是绝对的跟电流采样噪声、PWM频率都有关系。如果采样噪声大I_th要适当取大一点避免符号判断频繁跳变。实操心得调试I_th时先取额定电流的10%然后观察电流过零点的波形。如果过零点还有平顶说明I_th偏小如果过零点附近出现新的畸变说明I_th偏大。反复调两三次就能找到最佳值。5. 工程落地避坑指南与常见问题排查仿真跑通了不代表工程上就能直接用。实际DSP实现时有几个坑我踩过不止一次这里整理出来供你参考。5.1 电流采样噪声导致符号判断错误实际系统的电流采样不像仿真那么干净PWM开关噪声、ADC量化噪声、运放失调都会叠加在电流信号上。如果电流过零点附近噪声幅值超过I_th符号判断就会频繁跳变补偿电压跟着跳反而引入高频谐波。解决办法有两个一是硬件上在电流采样后加RC低通滤波截止频率取开关频率的1/10左右二是软件上对电流做滑动平均滤波窗口长度取3到5个采样点。注意滤波会引入相位延迟在高速时可能影响电流环带宽所以滤波参数要折中。5.2 母线电压波动时的补偿量更新仿真里V_dc是常数实际系统里母线电压会随负载和电网波动。如果补偿量用固定值母线电压偏低时补偿不足偏高时过补偿。所以补偿幅值必须实时更新V_comp_amp (T_dead / T_pwm) * V_dc_adc;V_dc_adc是母线电压采样值。采样周期可以比PWM周期慢比如每10个PWM周期更新一次因为母线电压的波动频率远低于开关频率。5.3 死区时间温漂与器件离散性功率器件的关断时间随温度变化常温下3微秒的死区高温下可能变成4微秒。如果补偿量按常温值算高温时补偿不足。解决办法是在补偿量里加一个温度系数或者干脆把死区时间设得保守一点补偿量按最大死区时间算宁可过补偿一点也不要欠补偿。器件离散性方面同一批IGBT的关断时间可能有±20%的分散。如果批量生产最好在产线测试时逐台校准死区时间把校准值写入EEPROM。这个校准过程不复杂给一个固定占空比测实际输出电压反推死区时间即可。5.4 常见问题速查表现象可能原因排查方法解决措施低速抖动无改善补偿极性接反检查sign(i)前的符号交换补偿量正负号过零点出现新畸变I_th偏大或偏小观察过零点波形调整I_th至额定电流10%高速时电流畸变补偿量未随频率调整检查T_pwm是否更新实时更新T_pwm补偿后THD反而升高电流采样噪声大示波器看采样波形加RC滤波或软件滤波批量生产时部分板子抖动器件离散性逐台测死区时间产线校准写入EEPROM高温时补偿不足死区时间温漂高温下测电流波形补偿量加温度系数5.5 从仿真到DSP的移植要点Simulink仿真用的是浮点运算DSP上通常是定点或单精度浮点。移植时要注意几点一是补偿量的计算要用Q格式定点化避免溢出二是sign函数在定点里用比较指令实现效率很高三是线性函数的除法可以用查表代替节省计算时间。以TI的C2000系列DSP为例补偿模块可以放在PWM中断里每个PWM周期执行一次。计算量很小三路补偿量的计算加叠加总共不超过50个时钟周期对10kHz的PWM中断来说完全无压力。注意补偿模块的执行顺序要在电流环PI之后、SVPWM之前。如果放在PI之前PI会把补偿量当成误差去调节导致补偿效果被PI吃掉。6. 补偿方案的边界与扩展思路线性死区补偿在大多数场景下够用但也不是万能的。这一部分聊聊它的边界条件以及什么情况下需要考虑更复杂的方案。6.1 什么时候线性补偿不够用第一种情况是极低速。当转速低于1%额定转速时基波频率可能只有0.5Hz电流周期长达2秒。这时候死区误差电压的6次谐波频率只有3Hz速度环的带宽可能高于这个频率PI调节器会试图去补偿这个脉动结果反而与死区补偿产生耦合。这种情况下可能需要更复杂的方案比如基于观测器的前馈补偿。第二种情况是电流极度不平衡。如果电机三相绕组不对称或者逆变器某相桥臂的器件特性不一致三相的死区误差电压幅值不同。线性补偿假设三相死区时间相同这时候补偿效果会打折扣。解决办法是分相校准死区时间每相用独立的补偿幅值。第三种情况是高频注入场景。有些无感FOC方案会在低速时注入高频信号来估计转子位置注入信号与死区补偿可能相互干扰。这时候需要把死区补偿的带宽设计得远低于注入频率避免相互调制。6.2 与其他补偿方案的组合使用线性死区补偿可以和其他补偿方案组合。比如与电流谐波抑制结合先用死区补偿把6次谐波压下去再用谐振控制器抑制残余的6次谐波。两者叠加效果更好但要注意谐振控制器的相位补偿避免与死区补偿产生振荡。也可以与转矩脉动抑制结合。死区补偿解决的是逆变器侧的问题电机侧的齿槽转矩脉动需要另外的补偿方案。两者独立设计叠加使用可以把低速转矩脉动压到很低。6.3 参数辨识与自适应补偿的延伸如果项目对低速性能要求极高可以考虑自适应死区补偿。思路是用一个观测器在线估计死区误差电压然后反馈补偿。观测器可以基于电流误差或者转矩误差来设计。这种方法不需要预先知道死区时间能自动适应温漂和器件离散性但调试复杂度高适合有经验的团队。另一个延伸方向是死区时间与开关频率的联合优化。提高开关频率可以减小死区误差电压的占比但会增加开关损耗。在低速时可以用较高的开关频率高速时降低开关频率这样既保证了低速性能又控制了损耗。这种变频策略需要与死区补偿配合设计。我在实际项目中用线性死区补偿解决过数控转台的低速抖动问题当时转速低到10rpm抖动幅度从±15rpm降到±3rpm效果非常明显。后来在机器人关节驱动上也用了同样的方案配合谐振控制器低速转矩脉动控制在5%以内。这套方案的好处是参数少、调试快从仿真到样机落地通常两周内就能完成。如果你也在被低速抖动困扰不妨先试试线性死区补偿大概率能解决你的问题。
返回列表