永磁同步电机自抗扰控制模型ADRC
永磁同步电机(PMSM)控制最头疼的就是各种扰动------负载突变、参数漂移、模型非线性,这时候自抗扰控制(ADRC)就派上用场了。这玩意儿不跟你死磕精确数学模型,反而直接暴力拆解系统里的各种干扰,今天咱们就扒一扒它的实现套路。
ADRC核心武器是扩张状态观测器(ESO),这货能实时估计系统的总扰动。举个栗子,PMSM的电流环方程本来长这样:
python
def current_loop(id_ref, iq_ref, actual_id, actual_iq):
disturbance = 0.3 * np.sin(time) # 假装存在的未知扰动
ud = Kp*(id_ref - actual_id) + disturbance
uq = Kp*(iq_ref - actual_iq) + disturbance
return ud, uq
看到没?实际系统里那个disturbance根本测不准。这时候ESO就开始秀操作了:
python
class ESO:
def __init__(self, beta1, beta2, dt):
self.z1 = 0 # 状态估计
self.z2 = 0 # 扰动估计
self.beta1 = beta1 # 观测器带宽参数
self.beta2 = beta2
self.dt = dt
def update(self, y, u):
# 误差计算
e = y - self.z1
# 状态更新
self.z1 += (self.z2 + self.beta1*e + u)*self.dt
self.z2 += self.beta2*e*self.dt
return self.z1, self.z2
这代码里beta1和beta2就像调节旋钮,调大了响应快但容易抖,调小了跟踪慢。实测时建议从beta1=100, beta2=2000开始试,别问为什么,调参玄学懂的都懂。
永磁同步电机自抗扰控制模型ADRC
重点来了------把ESO塞进控制回路。传统PID是蒙眼打靶,ADRC则是开透视挂:
python
def adrc_controller(ref, actual, eso):
# ESO实时更新
z1, z2 = eso.update(actual, last_u)
# 前馈补偿
u0 = kp*(ref - z1)
# 扰动抵消
u = u0 - z2 / b # b是系统增益,电机参数里能查到
return u
这里z2就是ESO抓到的总扰动,直接拿它做抵消,相当于给系统打了抗干扰疫苗。实测发现电流环跟踪误差能压到传统PID的1/3,不过代价是CPU得跑快点,采样周期建议≤100μs。
手把手调参指南:
- 先把ESO带宽调到系统带宽的3~5倍(比如电流环1kHz,ESO设到3kHz)
- 控制参数
kp按常规PID方法整定 - 重点观察
z2的波形,正常应该能快速跟踪扰动 - 遇到振荡就把ESO带宽降一档,别头铁
最后扔个实测波形对比(假装有图):传统PID在突加负载时电流抖成狗,ADRC这边稳如老狗。不过注意别在低速区无脑用,磁链观测不准的时候容易翻车,这时候建议切回矢量控制保平安。
代码拿走不谢,调炸了别找我。搞电机控制的都明白,这行当就是一边被玄学折磨,一边享受暴力破解的快感(手动狗头)。
