ARTICLE DETAIL

资讯详情

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

FOC三环调试实战:位置环与速度环PID整定及带宽分配

FOC三环调试实战:位置环与速度环PID整定及带宽分配 1. 为什么FOC的位置环和速度环调试值得单独拿出来讲搞过电机控制的人都有一个共识电流环好调速度环凑合能跑位置环一上就原形毕露。我最早接触FOC是在一块STM32F103RCT6的板子上跑无刷电机电流环用霍尔采样加上SVPWM波形看着挺漂亮但一加位置环就抖得像筛糠。后来跟着硬石的教程一步步走才发现问题不在算法本身而在于三个环的带宽分配和PID参数之间的耦合关系没有理清楚。FOCField-Oriented Control磁场定向控制的核心思想是把三相交流电机的定子电流通过Clarke变换和Park变换分解成励磁分量Id和转矩分量Iq然后分别控制。这个思路说起来简单但真正落地的时候电流环、速度环、位置环三者是级联关系——电流环在最内层速度环套在外面位置环再套在最外层。每一层的输出是下一层的输入所以任何一个环的参数没调好外环都会被拖累。这篇文章主要面向已经能把电机转起来、但位置环和速度环还没调稳的开发者。不管你用的是STM32、DSP28379还是其他平台只要你的FOC框架是标准的级联三环结构这里面的调试思路和参数整定方法都是通用的。我会从整体设计思路讲起然后逐步拆解速度环和位置环的PID整定过程最后分享一些我在实际调试中踩过的坑和总结出来的排查技巧。2. 三环级联的整体设计思路与带宽分配逻辑2.1 为什么是电流环→速度环→位置环这个顺序级联控制的核心原则是内环的响应速度必须远快于外环。一般工程上要求内环带宽至少是外环的5到10倍。原因很简单——如果外环的输出变化了内环必须能迅速跟踪上这个新给定值否则外环会以为内环没执行到位继续加大输出结果就是超调和振荡。具体到FOC三环系统电流环带宽通常在1kHz到5kHz对应的时间常数在几十到几百微秒级别。这是因为电气时间常数远小于机械时间常数电流变化非常快。速度环带宽一般在50Hz到200Hz对应的时间常数在几毫秒到几十毫秒。速度环的输出是Iq的给定值。位置环带宽通常在10Hz到50Hz对应的时间常数在几十毫秒到上百毫秒。位置环的输出是速度的给定值。这个带宽分配不是随便定的。我实测过如果速度环带宽设到500Hz而电流环只有800Hz系统就会开始啸叫。因为速度环输出的Iq给定变化太快电流环根本来不及跟踪两者之间产生了相位滞后形成正反馈振荡。2.2 串级PID的结构与抗积分饱和设计在代码层面三环级联的结构大致是这样的// 位置环最外层10Hz~50Hz float pos_error target_position - actual_position; float speed_ref pos_pid_calc(pos_pid, pos_error); // 速度环中间层50Hz~200Hz float speed_error speed_ref - actual_speed; float iq_ref speed_pid_calc(speed_pid, speed_error); // 电流环最内层1kHz~5kHz float iq_error iq_ref - actual_iq; float vq_ref current_pid_calc(current_pid, iq_error);这里有一个非常关键的细节抗积分饱和。位置环的输出是速度给定速度环的输出是电流给定。如果位置误差很大比如刚上电时目标位置和实际位置差了好几圈位置环的积分项会迅速累积到一个非常大的值导致速度给定远超电机能承受的范围。这时候速度环也会饱和电流给定直接顶到限幅值。等电机开始运动、位置误差减小后积分项需要很长时间才能退饱和结果就是严重超调。我的做法是在每个环的PID计算函数里都加上积分限幅和输出限幅typedef struct { float kp; float ki; float kd; float integral; float integral_max; // 积分限幅 float output_max; // 输出限幅 float prev_error; // 上次误差用于微分 } PID_Controller; float pid_calc(PID_Controller *pid, float error) { float p_term pid-kp * error; pid-integral pid-ki * error; // 积分抗饱和限制积分项的累积范围 if (pid-integral pid-integral_max) pid-integral pid-integral_max; else if (pid-integral -pid-integral_max) pid-integral -pid-integral_max; float d_term pid-kd * (error - pid-prev_error); pid-prev_error error; float output p_term pid-integral d_term; // 输出限幅 if (output pid-output_max) output pid-output_max; else if (output -pid-output_max) output -pid-output_max; return output; }注意积分限幅的值不要设得太大。经验值是输出限幅的0.5到0.8倍。比如速度环输出限幅是10A对应的Iq值那积分限幅设成6到8A对应的值就够了。2.3 前馈控制在位置环中的作用纯PID位置环有一个天然缺陷它是“事后补救”型的控制——只有位置出现偏差了才开始纠正。对于需要快速定位或者跟踪动态轨迹的场景纯反馈控制总是慢半拍。前馈控制的核心思路是如果我知道目标位置的变化规律比如匀加速运动我可以提前算出需要的速度给定和电流给定直接加到PID的输出上。这样PID只需要负责修正模型不准确和外部扰动带来的小偏差负担大大减轻。在位置环里最常用的前馈是速度前馈和加速度前馈// 速度前馈目标速度乘以一个系数直接加到速度给定上 float speed_ff target_velocity * k_vel_ff; // 加速度前馈目标加速度乘以转动惯量除以转矩常数 float accel_ff target_acceleration * J / Kt; // 最终速度给定 位置环PID输出 速度前馈 float speed_ref pos_pid_calc(pos_pid, pos_error) speed_ff;汇川的伺服驱动器里就有位置环前馈参数原理是一样的。前馈系数的整定比PID简单得多——从0开始慢慢加加到位置跟踪误差明显减小但还没有出现超调为止。一般来说速度前馈系数在0.7到1.0之间效果比较好。3. 速度环PID参数整定的完整实操流程3.1 整定前的准备工作确认电流环已经调好速度环整定的前提是电流环已经稳定工作。怎么判断电流环调好了我的标准是给电机一个固定的Iq给定比如1A电机应该能平稳地输出转矩用示波器看Iq的实际值波动应该在给定值的5%以内。如果电流波形毛刺很大或者有低频振荡先把电流环搞定再说。另外速度反馈的质量也很重要。如果你用的是增量式编码器要确认M法测速或者T法测速的周期设置合理。测速周期太短速度反馈噪声大测速周期太长速度反馈滞后严重。一般测速周期设在1ms到5ms之间比较合适对应速度环的执行周期。3.2 先P后I再D速度环参数的手动整定步骤我的整定习惯是先把Ki和Kd设为0只调Kp。具体步骤第一步确定Kp的临界值。给电机一个阶跃速度给定比如从0到500rpm观察速度响应。慢慢增大Kp直到速度出现等幅振荡或者明显超调。记下这个临界Kp值然后取它的60%到70%作为初始Kp。第二步加入Ki消除稳态误差。有了Kp之后速度稳态值通常会低于给定值因为有摩擦和负载。慢慢增大Ki直到稳态误差在可接受范围内。Ki太大会导致低频振荡表现为速度在给定值附近缓慢摆动。第三步加入Kd抑制超调。如果Kp和Ki调好后超调还是比较大可以加一点Kd。但速度环的微分项对噪声非常敏感因为速度反馈本身就有量化噪声和测量噪声。我的经验是速度环的Kd一般设得很小甚至是0。如果非要用一定要先对速度反馈做低通滤波。下面是我在一台额定3000rpm、额定转矩0.64Nm的小型PMSM上整定出来的速度环参数供参考参数数值说明Kp0.015输出为Iq给定A误差单位为rpmKi0.0008积分系数配合1ms执行周期Kd0速度环不用微分输出限幅±5.0A对应电机额定电流的2倍积分限幅±3.0A输出限幅的60%执行周期1ms与电流环共用中断3.3 增量式PID在速度环中的适用场景位置式PID和增量式PID的区别在于位置式PID的输出直接对应执行器的绝对位置比如Iq给定值而增量式PID的输出是执行器的增量每次增加多少。在速度环里增量式PID有一个好处不需要做积分限幅。因为增量式PID的积分作用隐含在累加过程中天然不会出现积分饱和。但增量式PID也有缺点它对积分项的初始化比较敏感而且如果中间有一次计算错误误差会一直累积下去。我个人的选择是速度环用位置式PID加积分限幅位置环用位置式PID加前馈。增量式PID更适合执行器本身有积分特性的场景比如步进电机的位置控制。3.4 速度环参数整定的实操记录拿一台24V、额定转速3000rpm的无刷电机做测试负载是一个小惯量飞轮。电流环已经调好带宽约2kHz。速度环执行周期1ms。初始参数Kp0.005Ki0Kd0。给500rpm阶跃上升时间约200ms稳态误差约30rpm。Kp增大到0.015上升时间缩短到80ms但出现约15%的超调稳态误差约10rpm。加入Ki0.0005稳态误差降到2rpm以内超调略有增加。Ki增大到0.001稳态误差基本消除但速度开始出现约5Hz的低频振荡。回调Ki到0.0008振荡消失稳态误差约1rpm超调约10%。最终参数Kp0.015Ki0.0008Kd0。这个参数下500rpm阶跃的上升时间约80ms超调10%稳态误差1rpm以内。对于大多数工业应用来说够用了。4. 位置环PID整定的核心要点与难点突破4.1 位置环与速度环的本质区别位置环和速度环最大的区别在于速度环控制的是“变化率”位置环控制的是“累积量”。这意味着位置环的积分特性是天然存在的——只要速度不为零位置就在变化。所以位置环的PID参数整定逻辑和速度环完全不同。位置环的Kp决定了“位置误差对应多大的速度给定”。Kp太小定位慢Kp太大容易振荡。位置环的Ki用来消除位置稳态误差但因为位置本身就有积分特性Ki通常设得很小甚至为0。位置环的Kd相当于给速度给定加了一个“阻尼”可以抑制超调但同样对噪声敏感。4.2 位置环整定的“三步法”我的位置环整定流程分三步第一步只用P控制找到临界振荡点。把Ki和Kd设为0给位置一个阶跃给定比如从0到360度慢慢增大Kp。当位置开始出现等幅振荡时记下这个Kp值。取临界值的30%到40%作为初始Kp。为什么取这么低因为位置环对超调非常敏感超调意味着电机要“过头”再回来这在很多应用里是不可接受的。第二步加入速度前馈减小跟踪误差。在P控制的基础上加入速度前馈。前馈系数从0开始加观察位置跟踪误差的变化。前馈系数加到0.8左右时跟踪误差通常能减小一半以上。第三步微调Ki和Kd。如果位置稳态误差不为零比如因为静摩擦力加一点点Ki。如果超调还是偏大加一点点Kd。但这两个参数都要非常谨慎宁可小不可大。4.3 位置环参数计算实例假设电机转动惯量J1.5e-5 kg·m²转矩常数Kt0.05 Nm/A编码器分辨率是4096线四倍频后16384 counts/rev。位置环执行周期1ms。位置环Kp的物理意义是位置误差1度对应多少rpm的速度给定。如果Kp10位置误差1度对应10rpm。这个值需要根据实际应用来定——定位时间要求越短Kp越大。我在这台电机上整定出来的位置环参数参数数值说明Kp8.0误差单位为度输出为rpmKi0.02很小仅用于消除静差Kd0.5抑制超调速度前馈系数0.85直接乘以目标速度输出限幅±2000rpm不超过电机额定转速积分限幅±500rpm输出限幅的25%在这个参数下360度阶跃定位的上升时间约150ms超调小于2度稳态误差小于0.1度。4.4 位置环调试中最容易踩的三个坑第一个坑速度环没调好就调位置环。这是最常见的错误。位置环的输出是速度给定如果速度环本身响应慢或者有振荡位置环怎么调都不会好。我的建议是先把速度环调到一个“还算满意”的状态再开始调位置环。第二个坑忽略机械传动间隙。如果你的电机通过齿轮或者同步带驱动负载传动间隙会导致位置反馈出现“死区”。在这个死区里电机转动但负载不动位置环会以为误差没减小继续加大输出结果就是过冲和振荡。解决办法是在位置环里加一个“间隙补偿”或者用双编码器电机端和负载端各一个。第三个坑位置给定突变。如果位置给定是阶跃信号位置环的P项会瞬间输出一个很大的速度给定导致电机猛冲。正确的做法是对位置给定做S形曲线规划或者梯形速度规划让位置给定平滑变化。5. 常见问题排查与调试技巧实录5.1 电机啸叫和振荡的排查思路电机啸叫通常是因为某个环的带宽设置不合理导致环间耦合振荡。排查步骤先看电流波形。如果电流波形有高频毛刺说明电流环有问题先调电流环。再看速度波形。如果速度有低频振荡几Hz到几十Hz说明速度环Kp太大或者Ki太大。最后看位置波形。如果位置有低频摆动说明位置环Kp太大或者速度前馈系数太大。我遇到过一次典型的啸叫案例电机在低速时发出刺耳的高频声音频率约2kHz。查了半天发现是电流环的Kp太大导致电流环自身振荡。把电流环Kp减小30%后啸叫消失。5.2 位置环超调过大的解决方案位置环超调大通常有以下几个原因Kp太大减小Kp但定位时间会变长。速度前馈系数太大前馈系数超过1.0会导致速度给定超过实际需要产生超调。速度环响应太慢速度环跟不上位置环的输出变化导致位置环积分累积过多。没有加减速规划位置给定突变导致速度给定突变。我的经验是先检查速度前馈系数是否合理再检查速度环的响应速度最后才动位置环的PID参数。5.3 常见问题速查表现象可能原因排查方法解决措施电机啸叫电流环Kp太大示波器看电流波形减小电流环Kp速度低频振荡速度环Ki太大看速度波形频率减小速度环Ki位置超调大位置环Kp太大或前馈太大看位置波形减小Kp或前馈系数位置稳态误差大静摩擦力大或Ki太小看稳态误差增大Ki或加前馈电机发热严重电流环参数不对或Iq有直流分量测三相电流检查电流采样和Park变换低速爬行速度反馈分辨率不够看低速时速度波形改用T法测速或提高编码器分辨率5.4 调试工具和辅助手段调试FOC三环系统光靠看代码和猜是不行的。我常用的工具组合示波器看电流波形、速度波形、位置波形。最好是四通道的可以同时看给定和反馈。上位机软件通过串口或者CAN把实时数据传到电脑上用曲线显示。硬石的教程里有一个上位机工具可以实时显示速度、位置、电流的波形。MATLAB/Simulink先在仿真里验证PID参数再往实际硬件上移植。MATLAB的PID Tuner可以自动整定参数但仿真模型要准确。信号发生器给系统注入阶跃信号或者正弦扫频信号测系统的频率响应。提示调试的时候一定要先空载再带载。空载调好的参数带载后可能需要微调。因为负载惯量和摩擦会改变系统的动态特性。6. 从能跑到跑稳我的调试心得调试FOC三环系统最忌讳的就是“一步到位”的心态。我见过太多人想把三个环一起调结果越调越乱。正确的做法是先把电流环调稳再把速度环调稳最后调位置环。每个环调好之后都要做阶跃响应测试确认上升时间、超调量、稳态误差都在可接受范围内。还有一个很重要的经验参数不是越“好”越好而是越“合适”越好。我见过有人把速度环带宽调到500Hz响应确实快但电机发热严重噪声也大。后来把带宽降到150Hz响应慢了一点但系统稳定多了电机温度也正常了。工业应用里稳定性和可靠性永远比极致的响应速度重要。最后分享一个我常用的调试小技巧在调位置环的时候先把速度前馈系数设为0只用P控制。等P调好了再加前馈。前馈加完之后如果发现超调不要急着减前馈先看看速度环的响应是不是够快。很多时候超调不是前馈的错而是速度环拖了后腿。这个内容后续还可以这样扩展加入自适应PID或者模糊PID让参数根据工况自动调整或者用系统辨识的方法先测出电机的传递函数再用频域法设计PID参数。这些方法在高端伺服里已经有应用了但对于大多数嵌入式开发者来说手动整定加前馈补偿已经能覆盖90%以上的应用场景。
返回列表