ARTICLE DETAIL

资讯详情

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

PMSM FOC电流环与速度环PI参数优化:从带宽整定到工程避坑

PMSM FOC电流环与速度环PI参数优化:从带宽整定到工程避坑 上一篇我们把PMSM电流环的数学模型和PI初值估算讲了评论区里催更的不少尤其想知道速度环那套参数到底怎么定。这篇就是完整下篇把电流环和速度环PI参数优化剩下的核心内容一次讲透电流环带宽怎么取舍、数字控制里的延迟补偿、速度环增量式PID的写法以及从一块pmsm驱动板上实际调参的完整过程和避坑记录。如果你手里有PMSM驱动板正在搞FOC电流环或者速度环调试这篇可以直接当速查手册用。先提醒一句PI参数优化不是把Kp、Ki算出来就完事更多时候是跟开关频率、采样延迟、负载惯量在博弈。下面按我实际调试的顺序来聊先从电流环开刀。1. 电流环PI参数优化的核心逻辑1.1 电流环带宽到底定多少才合适我在很多项目里见过同一种问题有人一上来就把电流环带宽定得很高比如开关频率20kHz电流环带宽想做到5kHz结果一闭环电机就开始吱吱叫。根本原因不是PI参数算错了而是带宽选择超出了数字控制能支撑的物理极限。电流环带宽本质上是电流指令到实际电流的跟随速度。带宽越高动态响应越快对负载突变和反电动势扰动的抑制也越强。但在数字控制里PWM输出是零阶保持器电流采样又存在延迟这些因素会给环路引入额外的相位滞后。带宽定得越高这个滞后吃掉的相位裕度就越多最后系统自然就振荡了。工程上我习惯把电流环带宽取为开关频率的1/10到1/20。举个例子开关频率10kHz时电流环带宽取1kHz左右就很稳20kHz时可以尝试2kHz到3kHz但前提是采样和PWM更新逻辑设计得足够紧凑。这个比例不是拍脑袋定的因为数字控制在目标带宽超过开关频率的1/10以后1拍以上的延迟会明显压缩稳定裕量表现出来就是Kp稍微加一点就啸叫。电流环带宽还要看速度环的“脸色”。一般速度环带宽至少要低于电流环5到10倍才会让两个环近似解耦。如果电流环只做到500Hz速度环却想要100Hz它们之间就会发生明显的交互最后波形上会出现低频差拍怎么调都感觉不对。那怎么根据目标带宽算PI初值呢我最常用的是连续域零极点对消法把PMSM的d-q轴电压方程忽略耦合项电流环被控对象近似成Gp(s) 1 / (Ls R)电感L、电阻R。PI控制器写成Kp Ki/s让零点去对消对象极点也就是令Ki / Kp R / L这样一来电流环开环传函变成Kp / (Ls)闭环传函就是一个一阶惯性环节带宽近似等于Kp / L。所以给定期望带宽wcc单位rad/s后初值公式直接就是Kp L * wcc Ki R * wcc这里Kp单位是V/AKi单位是V/(A·s)。这个公式在连续域完全自洽但直接搬到MCU里往往会偏激进。我调试时习惯把计算出来的Kp先乘0.8Ki先乘0.6再上板实测修正原因后面单独讲。1.2 电阻电感辨识与一步法初值计算要用上面的公式第一步就是把电机的电阻和电感搞清楚。很多开发板demo程序里都写好了参数辨识功能但自己从零调驱动板时最好还是手动测一遍。电阻测量最简单的方法是直流伏安法保持电机静止向任意两相之间施加一个直流电压通入一个不至于烧线圈的电流比如额定电流的20%到30%等电流稳定后记录电压和电流两者相除得到线间电阻再除以2就是相电阻。注意电机是星形接法还是三角形接法三角形接法换算不一样我遇到的大多数PMSM都是星形接法。电感测量可以这样开环状态下向某一相施加一个阶跃电压记录电流上升曲线。对一阶RL电路电流上升到稳态值的63.2%所需时间就是时间常数τ然后用L τ * R算相电感。这个方法粗看简陋但用来给PI参数定初值完全够用。只是要注意电感会随电流增大而饱和下降所以至少要测25%、50%、100%额定电流三组数据PI初值按最大电感那种工况来保守设定还是在特定工况下重新调整要看具体项目要求。我举个例子来算一遍。一台PMSM实测相电阻0.35Ω相电感0.8mH开关频率10kHz电流环目标带宽1kHz。目标带宽换算成弧度制wcc 2 * 3.1416 * 1000 ≈ 6283 rad/s那么Kp 0.0008 * 6283 ≈ 5.03 Ki 0.35 * 6283 ≈ 2200按照我前面说的保守调整实际上板初值我会写成Kp 4.0Ki 1300到1500。这个例子也说明一个道理不要迷信公式算出的那个漂亮数字数字延迟、采样误差、逆变器非线性都会吃掉稳定裕量初值宁小勿大。1.3 数字控制延迟补偿别把PI当连续系统电流环参数差一点往往不是公式问题而是延迟补偿没做。PMSM数字控制里存在一个很隐蔽的延迟链条电流采样触发点通常放在PWM载波的顶点或底点采样得到的是本期电流ADC转换、FOC计算、PI更新需要占用时间PWM占空比寄存器更新后要等下一个开关周期才真正生效。把这几段加起来相当于给被控对象串了一个0.5到1.5拍的纯延迟。这个延迟在低频段影响不大可一旦目标电流环带宽往上走相位损失就非常明显。你可以做一个简单估算1拍延迟在目标频率f处的相位滞后约等于360 * f * Ts度。如果开关频率10kHzTs 100us电流环带宽1kHz那么1拍延迟带来的滞后大约是36度两拍就是72度。PI控制器本身还会引入相位滞后总相位裕度很容易就不够了。所以我在实际项目里会做两件事。第一把电流环PI的离散化模型建准不要只用连续域公式加个系数。把零阶保持器和一拍延迟写进仿真模型用离散根轨迹或margin分析去校正Kp、Ki这样算出来初值会更接近最终能用的值。第二用前馈抵消反电动势和d-q轴耦合让PI只做误差修正而不是去硬抗一个变化缓慢的大干扰。具体操作就是在d轴电压指令里叠加-ωe*Lq*iq在q轴电压指令里叠加ωe*(Ld*id ψf)。无感FOC和带编码器的FOC都可以用这套前馈区别只在于角度和转速来源。还有一点容易被忽视采用单电阻或双电阻采样时存在电流重构盲区。低占空比或高边开关切换瞬间采样得到的电流可能不准等效于电流反馈出现了非线性延迟这不是PI参数能救回来的优先把采样点调准再去动PI参数。2. 速度环PI优化的关键点2.1 速度环周期与带宽如何选择速度环不一定要和电流环跑在同一个频率。常见做法是速度环每5到10个电流环周期执行一次比如电流环10kHz速度环1kHz也可以按需要设成500Hz。原因很简单速度反馈本身就来自编码器或观测器分辨率有限速度环算得太快不会获得更多有效信息反而把噪声传给了电流指令导致电机出现高频嗡鸣。速度环带宽怎么选要看应用场景。普通工业伺服和风机泵类速度环带宽做到20到50Hz就足够定位要求高的运动控制可以做到50到100Hz再往上就需要高分辨率编码器、高带宽电流环和系统辨识配合难度会明显增加。经验上速度环带宽取电流环带宽的1/10到1/5比较稳。电流环1kHz时速度环带宽50到100Hz是一个合理区间。速度环的Ki尤其不要贪大。电流环Ki对应电气时间常数速度环Ki对应的却是机械时间常数机械时间常数通常比电气时间常数大两个数量级。Ki太大会让速度环和机械谐振峰耦合表现出来就是电机轴带着负载一起“点头”波形上看到低频振荡。所以速度环KI的整定一定要比电流环温和得多。2.2 增量式PID和抗积分饱和实现细节写速度环程序时很多人第一反应是用位置式PIDu Kp*e Ki*Σe。好处是直观坏处是积分项容易饱和转速误差一直很大时积分项会累积到很大的值等误差反转时积分项退得非常慢于是出现明显超调。增量式PID在这个场景下更实用delta_u Kp * (e[k] - e[k-1]) Ki * e[k] Kd * (e[k] - 2*e[k-1] e[k-2])速度环一般用不上微分项Kd设0式子就退化成增量式PIdelta_u Kp * (e[k] - e[k-1]) Ki * e[k]然后每个周期累加一次输出iqRef delta_u; if (iqRef I_MAX) { iqRef I_MAX; } else if (iqRef -I_MAX) { iqRef -I_MAX; } prevErr err;增量式的优势是输出只依赖最近两次误差积分累积效应被“增量”的形式弱化系统退出饱和的速度更快。但要注意增量式PI同样可能饱和因为iqRef累加到限幅值后误差继续存在时内部误差历史还在变等误差翻转时容易出现回差。我更推荐在工程里用位置式PI加积分限幅代码控制更直白typedef struct { float Kp; float Ki; float Ts; float prevErr; float integ; float outMax; float integMax; } SpeedPI; float SpeedPI_Update(SpeedPI *pi, float ref, float fb) { float err ref - fb; pi-integ pi-Ki * err * pi-Ts; if (pi-integ pi-integMax) { pi-integ pi-integMax; } else if (pi-integ -pi-integMax) { pi-integ -pi-integMax; } float u pi-Kp * err pi-integ; if (u pi-outMax) { u pi-outMax; } else if (u -pi-outMax) { u -pi-outMax; } return u; }这段代码里integMax我通常取outMax的70%到80%这样就算输出饱和积分项也不会冲得太远退饱和速度更快。还有一个细节程序里用的是离散累加所以Ki和采样周期Ts是绑定的改速度环执行周期时一定要同步更新积分增益否则参数会莫名其妙地“漂”。2.3 负载扰动下的速度环增益调整速度环面对的扰动主要是负载转矩和负载惯量变化。同样的PI参数空载时调得很好一挂上大惯量负载就开始抖这是最常见的情况。原因在于从电流指令到转速之间是一个积分环节转速变化率正比于(Te - Tl) / J负载惯量J越大同一份比例增益产生的转速修正就越弱系统响应变慢但如果为了追快盲目加Kp又会引发噪声灵敏度问题。如果已知负载惯量J和转矩常数Kt可以用一个简化初值公式Kp_ω ≈ J * wsc / Kt Ki_ω ≈ Kp_ω * wsc / (3~5)wsc是期望的速度环带宽单位rad/s。这个公式是把速度对象近似成Kt / (J*s)按比例控制得到一阶闭环带宽Kp_ω * Kt / J推导出来的。它只适合做起点因为实际系统里还有电流环延迟、速度滤波、摩擦和死区等非线性。更实用的现场整定法是先Kp后Ki。先把Ki设得很小或者设0给定一个速度阶跃逐渐增加Kp直到转速响应刚好出现轻微振荡然后退回个10%到20%。接着慢慢加Ki让稳态误差消失并观察负载突变时的恢复速度。如果Ki加到某个点后速度开始低频摆动就再回调一点直到响应干脆但不抖。另外如果项目对负载突变要求很高一定要加前馈。最简单的做法是把目标速度的微分乘上J / Kt叠加到电流指令上。因为在突变瞬间前馈会提前给出一部分电流来克服惯量PI反馈只需要处理残余误差这样速度跌落会小很多。PMSM无感FOC控制里也能这么干只不过目标速度的微分需要从观测器输出里重新构造会比带编码器麻烦一点。3. 实操记录一套PMSM驱动板上完成PI整定3.1 从电流环到速度环的调试顺序我调试一块PMSM驱动板顺序是固定的先确认采样和相序再开环试探然后电流环闭环最后才做速度环。这个顺序不能乱因为速度环以电流环为前提电流环又依赖于正确的采样和功率级工作状态。第一步校准电流采样偏置。电机静止、无电流时ADC应该读到一个基本固定的零偏值记录下来作为软件偏置。不校准这一步后面电流环会出现固定偏差表现为d轴或q轴电流指令为0但实际电流不为0电机莫名其妙发烫。第二步开环给定电压。给q轴一个很小的电压比如额定电压的5%让电机缓慢转动确认三相相序和编码器方向一致。如果电机转向不对说明相序或旋变零位有问题这时候做闭环只会越调越乱。第三步电流环闭环。给q轴电流一个小幅阶跃比如2A观察反馈电流的跟随情况。先单独调q轴一般d轴和q轴的PI参数可以先设一样确认波形正常后再处理差异。此时不看转速只看电流环阶跃响应是不是干脆、有没有振荡。第四步速度环闭环。速度反馈来源用编码器时先确认测速方向正确给定零转速用手或者用外部设备转动电机轴观察控制器是否会输出反向电流来“拽住”电机。这一步能提前发现方向和反馈符号错误避免上高速后直接飞车。第五步负载测试。空载参数稳定后再带负载从半载到满载逐级加。很多PI参数空载能过负载一上来就露馅。3.2 参数表格与波形判断我整理一个实际调过的电机数据作为参考。电机参数Rs0.35ΩLs0.8mHJ2e-4 kg·m²Kt0.25 N·m/A开关频率10kHz电流环执行周期100us速度环执行周期1ms。环路目标带宽初值计算保守上板值最终调整值电流环1kHzKp5.0Ki2200Kp4.0Ki1500Kp4.6Ki1600速度环50HzKp≈0.25 A·s/radKi≈19Kp0.20Ki12Kp0.28Ki15这里速度环Kp的单位换算在程序里要注意。如果你速度反馈用的是rpm而不是rad/s那么按J*wsc/Kt算出来的Kp要除以约9.55因为1rad/s约等于9.55rpm。很多人在这一步把单位搞错导致同一套算法在仿真里挺好上板后转速参数完全不对。波形判断也有规律。电流环阶跃响应理想情况是有少量超调但不振荡电流在2到3个PWM周期内基本跟上指令我通常期望2到3ms内稳定。速度环阶跃响应空载时允许一点点超调但稳态转速纹波要小负载突变时转速跌落幅度和恢复时间都需要记录比如500rpm负载突变跌落到480rpm后在100ms内恢复这个动态就算合格。3.3 仿真与实测数据对不上的原因我经常被问MATLAB仿真里PI参数算出来很漂亮为什么上板就不一样这里面的坑很固定。仿真模型里如果不带死区、管压降、母线电压纹波、电流采样滤波延迟、编码器量化误差那仿真结果就是理想情况。真实逆变器的死区效应会在电流过零附近产生一个扰动电压等效于增加了一部分非线性阻力管压降在低速大电流时格外明显编码器分辨率不够会限制速度环能实现的带宽。不用怀疑这些都会让实测稳定域比仿真小。所以我把仿真当“趋势参考”不当“参数真值”。比如在仿真里把Kp从4调到5系统临界振荡那么上板可能从4.2到4.5就振荡了。这时候不要跟仿真死磕先检查几个硬件和软件的问题电流采样标定准不准、PWM死区补偿有没有开、采样点是否落在开关噪声之外。把这些问题排除后实测参数通常会向仿真值靠近。如果还差很多多半是电机参数测量本身就有误差重新辨识一次。4. 常见问题与排查技巧实录4.1 电流环振荡、噪音、发烫问题速查调试中遇到的症状其实很集中一张表快速定位现象常见原因处理方向上电啸叫占空比抖动Kp过大或相位裕度不足降低Kp检查采样延迟补偿电流波形过零点毛刺严重死区效应开死区补偿或检查采样点是否避开开关噪声q轴电流有指令但电机不转、发烫相序错误或采样偏置未校准重新核对相序、编码器方向和电流采样偏置转速反馈忽大忽小编码器线数不够或速度滤波太强改用M/T测速调整速度滤波截止频率轻载正常满载后电流畸变电感饱和PI参数不适应按满载电流重新辨识Ls微调电流环参数还需要区分一下BLDC和PMSM。BLDC反电动势是梯形波位置检测可以用霍尔换相控制上常见方波控制PMSM反电动势是正弦波一般用FOC才能发挥性能。如果你拿着PMSM却用方波控制策略电流环很难调好因为每次换相都有大的转矩脉动PI参数会不断“打架”。所以在讨论PI优化前先确认控制架构跟电机类型匹配。4.2 速度环超调与稳态误差的矛盾速度环里出现最多的问题是超调和稳态误差成对出现。Ki增大稳态误差减小但超调变大Kp增大会改善响应速度但系统更容易振。这个矛盾没法靠“把Ki改小一点”彻底解决要换个思路。我常用的几个方法速度目标值不做阶跃处理改成斜坡或一阶低通滤波限制加速度。这相当于把速度环的动态压力从参数上卸掉一部分。做积分分离误差绝对值大于阈值时积分项不累加小于阈值时才让积分工作。这样大误差阶段不会积分过深小误差阶段又能消除静差。积分限幅这比积分分离更粗犷但实现简单适合资源紧张的MCU。加加速度前馈把转速微分项换算成电流补偿直接加在指令上。好处是反馈PI只需要负责扰动修正参数可以调得柔和超调自然变小。实际操作时我习惯先把Kp调到“无超调但稳态有差”的状态然后再慢慢加Ki直到稳态误差消失且超调量在指标范围内。不要一开始就Kp、Ki一起调不然出了问题区分不出是谁引起的。4.3 杂项经验开关频率、采样点、滤波器相位滞后最后聊几个容易被忽略但影响很大的细节。开关频率不是越高越好。PMSM驱动板常见开关频率是8k到16k超过20k以后虽然人耳听不到高频啸叫逆变器开关损耗也上去了但电流环带宽并不会同比上升。因为带宽同时受采样延迟、AD转换时间、控制周期限制。我见过有人把开关频率调到25k电流环带宽却没比16k时快多少板子倒是先热了。采样点位置很重要。电流采样最好放在PWM载波顶点或底点也就是续流二极管自然导通、开关噪声比较小的时刻。如果采样点落在死区时间附近采到的电流会混入开关尖峰反馈噪声变大PI参数就不得不调低来保稳定。单电阻采样的驱动板还要避开电流重构盲区低速低占空比时尤其明显。速度反馈滤波是一个经常出问题的环节。滤波截止频率如果设得太低相位滞后会吃掉速度环的稳定裕量表现出来就是你无论怎么加Kp转速响应都“软绵绵”。这正是有人把速度低通滤波放在10Hz结果速度环带宽怎么都上不去的原因。我一般让速度反馈滤波截止频率至少是速度环带宽的5到10倍或者干脆用延迟更小的平均滤波保证滤波不成为限制环路的瓶颈。最后再分享一个我自己调试时的习惯每次改PI参数都把母线电压、电机温度、负载状态、当时的Kp/Ki一起记到一张表里。同一个参数在50V母线和300V母线下的表现完全不一样冷机和热机也不一样。遇到“昨天还好好的今天开始抖”多半不是PI参数漂了而是温度或负载变了。先把能复现的条件锁定再去动PI能少走很多弯路。
返回列表