ARTICLE DETAIL

资讯详情

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

FOC串级PID从原理到实战:三环架构、参数整定与调试避坑指南

FOC串级PID从原理到实战:三环架构、参数整定与调试避坑指南 1. 从“转不起来”到“稳如老狗”串级PID到底解决了什么问题搞电机控制的人尤其是做FOC的几乎都经历过这个阶段电流环调通了电机能转了但一加上速度环整个系统就开始啸叫、抖动甚至直接过流保护。你盯着示波器上那几条波形明明每个环单独调的时候都挺正常怎么串起来就崩了这个问题我踩过太多次坑。后来才想明白单环PID和串级PID根本是两码事。单环PID是“一个人管所有事”串级PID是“层层负责、各司其职”。FOC的串级PID通常指三环结构电流环最内环、速度环中间环、位置环最外环。这三个环不是简单叠加而是有严格的执行频率层级和执行顺序。为什么非得用串级因为电机控制里存在多个时间尺度的物理量。电流变化是微秒级的速度变化是毫秒级的位置变化是几十毫秒甚至秒级的。用一个环去同时管这三个量就像让一个CEO同时管战略、管部门、还管前台接待不是不能干是干不好。串级PID的核心价值在于解耦和限幅。内环把电流控制好了外环就只需要关心速度不用操心电流怎么变。同时每个环的输出都作为下一个环的输入限幅天然形成保护。比如速度环输出的电流指令直接限幅在电机额定电流以内永远不会出现过流。这篇文章我打算把FOC串级PID从原理到代码实现、从参数整定到常见问题排查完整地捋一遍。不管你是刚接触FOC的新手还是调环调到头秃的老手应该都能找到点有用的东西。2. 串级PID的核心架构与设计思路2.1 三环嵌套的执行逻辑FOC的串级PID结构最内环是电流环中间是速度环最外是位置环。执行顺序是从外到内计算从内到外执行。什么意思每个控制周期先算位置环位置环的输出作为速度环的输入再算速度环速度环的输出作为电流环的输入最后算电流环电流环的输出直接给到SVPWM模块。但这里有个关键点三个环的执行频率不一样。电流环通常跑在PWM频率上比如10kHz到20kHz速度环跑在1kHz左右位置环可能只有100Hz到500Hz。为什么因为电流变化快需要高频率采样和控制速度变化慢跑太快反而引入噪声位置变化更慢跑太快没意义还浪费CPU。我见过不少新手把三个环都放在同一个定时器中断里跑结果速度环和位置环的积分项疯狂累积电机直接飞车。正确的做法是用不同的定时器中断或者用计数器分频。比如PWM中断里跑电流环每10次PWM中断跑一次速度环每100次跑一次位置环。注意速度环和位置环的执行频率不能太低否则响应跟不上也不能太高否则微分项噪声放大严重。经验值是速度环频率是电流环的1/10到1/20位置环是速度环的1/5到1/10。2.2 为什么是“串级”而不是“并联”有人可能会问我能不能把电流、速度、位置三个PID并联输出直接相加理论上可以但实际几乎没人这么干。原因很简单并联结构下三个环互相打架。电流环说“我要给这么多电压”速度环说“不行你得给更多”位置环又说“你们都错了应该给负的”。最后输出什么谁限幅大谁说了算系统完全失控。串级结构下每个环只负责自己的事。位置环输出的是“期望速度”速度环输出的是“期望电流”电流环输出的是“期望电压”。每一层都是下一层的指令下一层无条件执行。这样整个系统就是单向依赖不会出现互相干扰。而且串级结构天然支持抗积分饱和。比如电机堵转时位置环输出速度指令会一直增大但速度环发现实际速度为零会限制电流指令电流环发现电流已经到限幅值会停止积分。这样即使堵转很久一旦解除堵转电机也不会因为积分累积而飞车。2.3 各环的输入输出与限幅设计电流环的输入是d轴和q轴电流指令通常d轴给0q轴给速度环输出输出是d轴和q轴电压指令。限幅主要是电压限幅受母线电压和SVPWM调制比限制。一般取母线电压的0.95倍除以根号3再留点余量。速度环的输入是速度指令来自位置环或上位机输出是q轴电流指令。限幅就是电机的最大允许电流通常取额定电流的1.5到2倍但要注意电机的退磁风险和驱动器的过流保护阈值。位置环的输入是位置指令输出是速度指令。限幅是电机的最大允许转速这个值要根据机械系统的承受能力来定不能只看电机本身。实操心得限幅值不要设得太“刚好”要留10%到20%的余量。比如电机额定电流10A速度环输出限幅设12A到15A比较合适。设10A的话加速会明显变慢设20A的话过流保护可能先动作。3. 电流环最内环的细节决定成败3.1 电流环的采样与坐标变换电流环是FOC的根基电流环没调好速度环和位置环都是空中楼阁。电流环的第一步是采样三相电流。通常用两个采样电阻或者三个霍尔电流传感器。采样时刻很关键必须在PWM中心对齐点采样这时候开关噪声最小。采样得到的是三相电流ia、ib、ic通过Clarke变换变成iα、iβ再通过Park变换变成id、iq。Park变换需要转子电角度这个角度来自编码器或者无感观测器。这里有个坑电角度必须和电流采样时刻对齐。如果电角度滞后或者超前id和iq就会耦合电流环性能急剧下降。我一般会在PWM中断里先触发ADC采样等ADC转换完成后再做Clarke和Park变换然后跑PID最后更新PWM占空比。整个过程必须在下一个PWM周期开始前完成否则就乱了。3.2 电流环PID的参数整定电流环的PID参数整定最靠谱的方法是基于电机参数计算而不是盲调。电机的d轴和q轴电压方程在同步旋转坐标系下是ud Rs * id Ld * did/dt - ωe * Lq * iq uq Rs * iq Lq * diq/dt ωe * Ld * id ωe * ψf其中Rs是定子电阻Ld和Lq是dq轴电感ωe是电角速度ψf是永磁体磁链。在电流环带宽远高于速度环的情况下可以忽略反电动势和交叉耦合项把电流环近似为一阶RL电路。这时候电流环的PI参数可以这样算Kp L * ωcKi R * ωc其中ωc是期望的电流环带宽一般取PWM频率的1/10到1/20。比如PWM频率10kHz电流环带宽取500Hz到1kHz。注意算出来的参数只是起点实际还要根据采样延迟、PWM延迟、死区效应等做微调。我一般会先把Kp调到刚好不振荡再慢慢加Ki直到电流阶跃响应没有稳态误差。3.3 电流环的常见问题与排查电流环最常见的问题是电流波形畸变和高频振荡。电流波形畸变通常是因为死区补偿没做好或者电流采样时刻不对。高频振荡一般是Kp太大或者采样噪声太大。排查的时候我一般会先看id和iq的波形。如果id和iq都有很大的纹波说明采样或者坐标变换有问题。如果只有iq有纹波可能是速度环输出抖动导致的。如果id和iq在某个特定转速下振荡可能是电角度偏差或者电感参数不匹配。还有一个隐蔽的问题电流环积分饱和。当电机堵转或者加速时电流指令很大但实际电流上不去积分项就会一直累积。一旦条件解除积分项需要很长时间才能退饱和导致电流过冲。解决办法是加抗积分饱和当输出电压达到限幅值时停止积分或者反向积分。4. 速度环连接电流与位置的桥梁4.1 速度环的输入处理与滤波速度环的输入是速度指令这个指令可能来自位置环也可能来自上位机。速度指令一般要做斜坡处理不能突变。比如从0直接给到1000rpm速度环会输出最大电流电机猛加速机械系统可能受不了。加一个斜坡函数让速度指令在100ms到500ms内线性增加到目标值加速过程就平滑多了。速度反馈来自编码器差分或者无感观测器。编码器差分算速度有个问题低速时分辨率不够。比如1000线编码器4倍频后4000个脉冲每转在1rpm时每秒只有66个脉冲算出来的速度波动很大。解决办法是低速时用位置差分加滤波或者用观测器估算速度。我一般会用一阶低通滤波器滤一下速度反馈截止频率取速度环带宽的2到5倍。滤波太狠会引入相位滞后导致系统振荡滤波太弱又起不到作用。这个参数需要根据实际波形调。4.2 速度环PID的参数整定速度环的参数整定比电流环麻烦因为速度环的模型不是简单的一阶系统。速度环的受控对象包括电流环、电机机械方程和负载。在电流环带宽足够高的情况下速度环可以近似为一阶惯性环节加积分环节。速度环的PI参数可以用带宽法整定。先确定速度环的期望带宽一般取电流环带宽的1/5到1/10。然后根据电机的转动惯量和摩擦系数计算Kp和Ki。但实际中转动惯量和摩擦系数很难准确知道所以还是要靠试。我的经验是先把Ki设为0慢慢加Kp直到速度阶跃响应出现轻微超调然后加Ki直到稳态误差消除。如果出现振荡先减小Kp再调Ki。速度环的Kp一般比电流环的Kp小一个数量级Ki小两个数量级。实操心得速度环的积分项很容易饱和尤其是在电机堵转或者负载突变时。一定要加抗积分饱和而且限幅值要合理。我一般会把积分项限幅在输出限幅的50%到80%。4.3 速度环与电流环的配合速度环和电流环的配合核心是带宽分离。速度环的带宽必须远低于电流环的带宽否则两个环会互相干扰。一般要求速度环带宽是电流环带宽的1/5到1/10。如果速度环带宽太接近电流环系统会出现低频振荡波形像呼吸一样。还有一个问题是速度环输出限幅。速度环输出的是q轴电流指令这个指令必须限幅在电机和驱动器的安全范围内。但限幅值不能太小否则加速无力也不能太大否则过流保护。我一般会设成额定电流的1.5倍同时驱动器硬件过流保护设在2倍额定电流。如果速度环输出经常达到限幅值说明要么速度环参数太激进要么电机功率不够。这时候不要盲目加大限幅要先检查机械负载是否正常或者考虑换更大功率的电机。5. 位置环最外环的精度与响应5.1 位置环的输入与轨迹规划位置环的输入是位置指令这个指令可能来自上位机的运动规划也可能是简单的阶跃。如果直接给阶跃位置指令位置环会输出最大速度指令电机猛冲到位时又猛停机械冲击很大。所以位置环一般要配合轨迹规划比如S型曲线或者梯形曲线。轨迹规划的核心是限制加速度和加加速度。加速度限制决定了电机能多快达到最大速度加加速度限制决定了加速度变化的平滑度。对于一般的点位运动梯形曲线就够了对于高精度或者柔性负载S型曲线更好。位置反馈来自编码器或者光栅尺。位置环的采样频率一般比较低100Hz到1kHz。位置环的PID通常只用P和ID项很少用因为位置反馈的噪声经过微分后会被放大。5.2 位置环PID的参数整定位置环的参数整定相对简单因为位置环的受控对象是速度环而速度环已经调好了。位置环可以近似为一个积分环节。位置环的P参数决定了系统的刚度P越大到位越快但太大容易振荡。I参数用来消除稳态误差但位置环一般不需要I因为速度环已经保证了稳态无静差。我一般先调P从小到大加直到位置阶跃响应出现轻微超调。如果对稳态精度要求高再加一点点I。位置环的P参数和速度环的带宽有关速度环带宽越高位置环P可以越大。注意位置环的P太大时系统会出现低频振荡电机像在“点头”。这时候要减小P或者检查速度环是否振荡。5.3 位置环与速度环的切换逻辑在很多应用里位置环和速度环不是同时工作的。比如电机启动时先跑速度环让电机加速到接近目标位置然后切换到位置环精确到位。这个切换逻辑很关键切换时机不对会导致位置超调或者振荡。我一般会在位置误差小于某个阈值时从速度环切换到位置环。切换时位置环的积分项要清零或者预置为当前速度指令避免切换瞬间输出突变。有些方案会用前馈把速度指令直接加到位置环输出上这样切换更平滑。还有一种情况是位置环和速度环同时工作比如力位混合控制。这时候位置环输出速度指令速度环输出电流指令两个环都在线。这种结构对参数整定要求更高因为两个环的带宽要严格分离。6. 串级PID的调试流程与实战技巧6.1 从内到外的调试顺序串级PID的调试必须从内到外先调电流环再调速度环最后调位置环。电流环没调好速度环怎么调都是白费。我见过有人跳过电流环直接调速度环结果电机转起来像拖拉机还以为是速度环参数不对。电流环调试时先给d轴一个固定电压看id能不能跟上。然后给q轴一个阶跃电流指令看iq的阶跃响应。如果iq上升时间太长加大Kp如果有超调减小Kp或者加一点Kd。电流环调好后id和iq的纹波应该很小阶跃响应干净利落。速度环调试时先给一个低速指令比如100rpm看电机能不能稳速。然后给一个速度阶跃看响应。速度环调好后电机应该能平稳加减速没有明显的振荡和啸叫。位置环调试时先给一个小角度阶跃看电机能不能到位。然后逐渐加大角度看有没有超调。位置环调好后电机应该能快速、准确地到达目标位置没有来回摆动。6.2 用示波器和上位机看波形调PID不看波形等于闭着眼睛开车。我一般会用示波器看几个关键信号q轴电流指令、q轴电流反馈、速度指令、速度反馈、位置指令、位置反馈。如果有条件用上位机软件实时记录这些数据比示波器更方便。看波形的时候重点关注几个指标上升时间、超调量、稳态误差、振荡频率。上升时间太长说明Kp太小超调太大说明Kp太大或者Ki太大稳态误差不为零说明Ki不够振荡频率高说明内环有问题振荡频率低说明外环有问题。我还会看电流指令和电流反馈的跟随误差。如果跟随误差很大说明电流环带宽不够如果跟随误差有规律地波动说明电角度或者参数有问题。6.3 常见问题速查表现象可能原因排查方法解决办法电机啸叫电流环Kp太大看iq波形是否高频振荡减小电流环Kp低速抖动速度反馈分辨率不够看低速时速度波形加滤波或改用观测器加速无力速度环输出限幅太小看q轴电流指令是否达到限幅加大限幅或换电机到位后振荡位置环P太大看位置波形是否超调减小位置环P堵转后飞车积分饱和看堵转时积分项是否累积加抗积分饱和电流波形畸变死区补偿不对看相电流波形调整死区补偿高速时电流失控电角度偏差看高速时id和iq是否耦合校准电角度实操心得调PID的时候每次只改一个参数改完看波形记录效果。不要一次改好几个参数否则出了问题都不知道是哪个参数导致的。我一般会建一个表格记录每次参数变化和对应的波形特征调多了就有感觉了。7. 进阶话题带宽、延迟与抗饱和7.1 带宽的理解与匹配带宽这个词在电机控制里经常出现但很多人理解得不够透彻。带宽本质上是系统能有效跟踪指令的频率范围。带宽越高系统响应越快但对噪声越敏感对采样和计算延迟越敏感。串级PID的带宽匹配原则是内环带宽 外环带宽。一般要求内环带宽是外环的5到10倍。如果内环带宽不够外环的指令内环跟不上外环就会积分饱和系统振荡。如果内环带宽太高采样噪声和PWM噪声会被放大电流波形变差。带宽还和相位裕度有关。相位裕度太小系统容易振荡相位裕度太大系统响应慢。一般要求相位裕度在45度到60度之间。用波特图看系统的开环频率响应就能看出带宽和相位裕度。7.2 延迟的来源与补偿FOC系统里有很多延迟采样延迟、计算延迟、PWM更新延迟、死区延迟。这些延迟加起来可能有一个到两个PWM周期。延迟会降低系统的相位裕度限制带宽。采样延迟可以通过提前采样来补偿比如在PWM周期中间采样而不是在周期开始时采样。计算延迟可以通过优化代码来减少比如用查表法代替三角函数计算。PWM更新延迟可以通过双更新模式来减少即在PWM周期中间也更新一次占空比。死区延迟是硬件决定的但可以通过死区补偿来减小影响。死区补偿的原理是根据电流方向在PWM占空比上叠加一个补偿量。补偿量的大小等于死区时间除以PWM周期再乘以母线电压。7.3 抗积分饱和的几种实现抗积分饱和是串级PID里必须处理的问题。常见的实现方式有几种第一种是钳位法当输出达到限幅值时停止积分。这种方法简单但退饱和时会有延迟。第二种是反计算法当输出达到限幅值时把限幅值和输出值的差反馈到积分项让积分项反向变化。这种方法退饱和快但参数不好调。第三种是条件积分法只有当输出没有达到限幅值或者积分项和误差同号时才积分。这种方法效果不错实现也简单。我一般用条件积分法配合输出限幅。在代码里就是判断一下如果输出已经限幅了而且误差还在往限幅方向推就不积分。这样既能防止饱和又不会影响正常调节。8. 代码实现从伪代码到实际工程8.1 电流环的代码结构电流环的代码一般放在PWM中断里执行频率等于PWM频率。伪代码大概是这样void PWM_ISR(void) { // 1. 读取三相电流 ia ADC_Read(IA_CH); ib ADC_Read(IB_CH); ic ADC_Read(IC_CH); // 2. Clarke变换 i_alpha ia; i_beta (ia 2*ib) * ONE_BY_SQRT3; // 3. 读取电角度 theta Encoder_GetAngle(); // 4. Park变换 id i_alpha * cos(theta) i_beta * sin(theta); iq -i_alpha * sin(theta) i_beta * cos(theta); // 5. 电流环PID id_error id_ref - id; iq_error iq_ref - iq; ud PID_Current_D(id_error); uq PID_Current_Q(iq_error); // 6. 反Park变换 u_alpha ud * cos(theta) - uq * sin(theta); u_beta ud * sin(theta) uq * cos(theta); // 7. SVPWM SVPWM_Update(u_alpha, u_beta); }实际工程里还要加很多细节ADC校准、电角度偏移补偿、死区补偿、过流保护等等。但核心结构就是这些。8.2 速度环的代码结构速度环一般放在一个低频定时器中断里或者用PWM中断分频。伪代码void Speed_Loop_ISR(void) { // 1. 读取速度反馈 speed_fdb Encoder_GetSpeed(); // 2. 速度环PID speed_error speed_ref - speed_fdb; iq_ref PID_Speed(speed_error); // 3. 限幅 if (iq_ref IQ_MAX) iq_ref IQ_MAX; if (iq_ref -IQ_MAX) iq_ref -IQ_MAX; }速度环的输出iq_ref直接给电流环用。注意速度环的执行频率不能太高否则速度反馈的噪声会被放大。8.3 位置环的代码结构位置环的执行频率更低一般100Hz到500Hz。伪代码void Position_Loop_ISR(void) { // 1. 读取位置反馈 pos_fdb Encoder_GetPosition(); // 2. 位置环PID pos_error pos_ref - pos_fdb; speed_ref PID_Position(pos_error); // 3. 限幅 if (speed_ref SPEED_MAX) speed_ref SPEED_MAX; if (speed_ref -SPEED_MAX) speed_ref -SPEED_MAX; }位置环的输出speed_ref给速度环用。位置环一般只用P不用I因为速度环已经保证了稳态无静差。注意三个环的变量要加volatile关键字因为它们在中断和主循环之间共享。还要注意临界区保护避免数据竞争。9. 实际调试中踩过的坑与经验总结9.1 电角度对齐的重要性电角度对齐是FOC里最基础也最容易出错的一步。如果电角度偏差太大id和iq会严重耦合电流环根本调不好。我一般会用强制对齐的方法给d轴一个固定电压q轴给0让电机转到d轴对齐位置然后记录编码器读数作为电角度零点。对齐的时候要注意电压不能太大否则电机会猛转也不能太小否则对齐不准。一般取额定电压的5%到10%。对齐时间要足够长让电机稳定下来一般500ms到1s。9.2 采样时刻与PWM同步电流采样必须在PWM周期的特定时刻进行一般是中心对齐点。这时候开关管刚好在切换电流纹波最小。如果采样时刻不对电流波形会有很大的尖峰PID根本没法调。我一般会在PWM中断里先触发ADC然后等ADC转换完成中断在ADC中断里做电流环计算。这样采样和计算是同步的不会出现采样时刻漂移。9.3 参数整定的经验法则调了这么多电机我总结了一些经验法则电流环Kp ≈ 电感 × 带宽Ki ≈ 电阻 × 带宽速度环Kp ≈ 电流环Kp / 10Ki ≈ 电流环Ki / 100位置环Kp ≈ 速度环Kp / 10速度环带宽 ≈ 电流环带宽 / 10位置环带宽 ≈ 速度环带宽 / 5这些只是起点实际还要根据波形调。但有了这些起点至少不会调得太离谱。9.4 不同电机的参数差异不同电机的参数差异很大不能一套参数打天下。内转子永磁同步电机电感小电流环Kp可以大一些外转子电机电感大电流环Kp要小一些。空心杯电机电感极小电流环带宽可以很高大功率电机电感大电流环带宽要低一些。我一般会先测电机的电阻和电感用LCR表或者用驱动器注入高频信号测。有了电阻和电感电流环参数就能算个大概不用盲调。10. 写在最后一些个人体会串级PID这个东西原理不难难的是调。我刚开始调的时候总觉得参数差不多就行结果电机要么啸叫要么振荡。后来才明白每个参数都有它的物理意义Kp对应刚度Ki对应消除静差的能力Kd对应阻尼。调参数的时候脑子里要想着这些物理意义而不是盲目试。还有一点波形不会骗人。电机转得不好波形上一定有体现。学会看波形比背参数有用得多。我现在的习惯是每次调参数都录波形调完对比时间长了就有感觉了。最后串级PID只是FOC的一部分。FOC还包括电角度观测、SVPWM、死区补偿、过调制等等。每个部分都值得深入。但串级PID是骨架骨架搭好了其他部分才有意义。
返回列表