电机控制器,基于ADRC自抗扰算法的PMSM双闭环转速控制,速度环采用自抗扰控制,电流环PI控制,SVPWM空间电压矢量调制,控制精度高,响应速度快,抗负载扰动性能强
在工业伺服领域,电机控制器的响应速度和抗干扰能力直接决定设备性能。最近在调试一套永磁同步电机(PMSM)控制系统时,尝试把传统PI换成ADRC自抗扰算法,效果让人眼前一亮。
这套系统的速度环用ADRC替代传统PI后,最直观的感受是突加负载时转速波动从原来的±15rpm降到了±3rpm。核心在于ADRC的扩张状态观测器(ESO)能实时估算并补偿扰动,下面这段代码展示了ADRC的核心观测逻辑:
// 扩张状态观测器实现 void ADRC_ESO(float v, float y) { float e = z1 - y; z1 += T*(z2 - beta01*e); z2 += T*(z3 - beta02*e + b0*v); z3 += T*(-beta03*e); // 总扰动观测值存储在z3 }其中beta系列参数决定观测器带宽,调参时发现beta03取值过大会引入高频噪声,经验值是让beta01:beta02:beta03按1:2:1的比例配置。z3这个状态量直接包含了负载突变、参数变化等扰动信息,在控制量中直接抵消这些扰动,比传统前馈补偿更主动。
电流环依然采用PI控制,但在ADRC架构下压力小了很多。这里有个调参技巧:当速度环响应足够快时,电流环的积分时间可以适当缩短:
// 电流环PI核心算法 float Current_PI(float error) { static float integral = 0; integral += error * Ki * Ts; return Kp * error + integral; }实际调试中发现,当速度环用ADRC后,电流环的Kp值可以降低30%左右,这样既减少电流谐波,又能防止过调制。配合SVPWM的空间矢量调制,电压利用率比传统SPWM提升约15%,这个提升在电池供电设备中尤为重要。
说到SVPWM实现,下面这段代码展示了扇区判断的关键逻辑:
// SVPWM扇区判断 uint8_t SVM_Sector(float Ualpha, float Ubeta) { float Vref1 = Ubeta; float Vref2 = (SQRT3*Ualpha - Ubeta)/2; float Vref3 = (-SQRT3*Ualpha - Ubeta)/2; int N = (Vref1>0 ? 4:0) + (Vref2>0 ? 2:0) + (Vref3>0 ? 1:0); return SectorMap[N]; // 映射到标准扇区号 }有个坑需要注意:当调制比接近1时,要加入过调制补偿算法,否则会导致波形畸变。我们在代码里加入了一个动态补偿因子,当检测到调制比超过0.95时自动调整矢量作用时间,实测THD从8%降到了3.7%。
整套系统跑下来,最明显的提升在换向瞬间——传统PI控制在突卸负载时会有明显超调,ADRC则像有个无形的手在提前拉住转速曲线。用激光测速仪抓到的动态响应曲线显示,阶跃响应建立时间从230ms缩短到150ms,且没有振荡过程。
不过ADRC也不是银弹,调试初期被其多达6个待调参数搞得头大。后来发现可以分步调试:先关掉非线性环节按线性ADRC调,确定观测器带宽后再逐渐加入非线性因子。现场工程师可以记住这个口诀:"带宽倍数定框架,非线性项微调效"。
这套方案在AGV驱动轮上跑了2000小时压力测试,期间经历负载从10kg到200kg的随机突变,转速标准差始终保持在0.05%以内。下次如果再遇到需要快速抗扰的场景,ADRC+PI的双环结构确实值得放进备选方案。