基于超螺旋滑模观测器的永磁无刷直流电机的无传感器矢量控制,角度与转速估算精度非常高
无传感器控制技术在电机驱动领域早就不是新鲜事了,但真正能在工业现场稳定运行的方案还是凤毛麟角。最近在调试一款无人机用无刷电机时,偶然试用了超螺旋滑模观测器(STSMO),意外发现这货对付反电动势里的高频噪声真有两把刷子。传统的滑模观测器就像个暴脾气,稍有点干扰就疯狂抖振,咱们这次要聊的改进版直接把观测精度干到了0.2度以内。
先看个实际应用中的代码片段,这是观测器核心部分的C语言实现:
float STSMO_Update(Motor *mtr, float ia, float ib) { // 反电动势观测 float e_alpha = mtr->L_sigma * (mtr->i_alpha_hat - ia) + mtr->K1 * sign(mtr->i_alpha_hat - ia); float e_beta = mtr->L_sigma * (mtr->i_beta_hat - ib) + mtr->K1 * sign(mtr->i_beta_hat - ib); // 超螺旋项计算 mtr->z_alpha += mtr->K2 * sign(e_alpha) * mtr->Ts; mtr->z_beta += mtr->K2 * sign(e_beta) * mtr->Ts; // 状态更新 mtr->i_alpha_hat += (-mtr->R_s/mtr->L_sigma*ia + e_alpha + mtr->z_alpha) * mtr->Ts; mtr->i_beta_hat += (-mtr->R_s/mtr->L_sigma*ib + e_beta + mtr->z_beta) * mtr->Ts; // 反正切计算 return atan2f(-e_beta, e_alpha); }这段代码里藏着两个关键参数K1和K2,K1负责常规滑模的趋近运动,K2则专治高频抖振。有意思的是,当电机转速突变时,K2会生成一个类似积分补偿的量,相当于给观测器装了减震器。某次实验中故意把转速从2000rpm拉到500rpm,传统滑模的角度估算直接飞出±15度误差,而STSMO的曲线愣是稳如老狗。
转速估算更有意思,直接拿反电动势的微分来算会引入噪声,咱们改用锁相环结构:
class PLL: def __init__(self, Kp, Ki): self.Kp = Kp self.Ki = Ki self.theta_hat = 0.0 self.omega_hat = 0.0 self.integrator = 0.0 def update(self, theta_err, Ts): self.integrator += self.Ki * theta_err * Ts self.omega_hat = self.Kp * theta_err + self.integrator self.theta_hat += self.omega_hat * Ts return self.theta_hat, self.omega_hat这个Python版的锁相环实现里,角度误差thetaerr通过PI调节生成转速估计。实测发现当Kp取0.8、Ki取0.3时,转速跟踪延迟能控制在5ms以内。有个小技巧是把thetaerr做限幅处理,防止突加减速时的积分饱和。
当然坑也没少踩。最初调试时发现角度估算在低速时跳变,后来发现是反电动势太小导致符号函数误触发。解决办法挺巧妙——把sign()函数换成饱和函数:
#define SAT(x,eps) (fabs(x)<eps ? (x/eps) : (x>0 ? 1 : -1))这个宏定义里的eps参数根据转速自适应调整,低速时适当放宽死区。实测在50rpm时角度估算波动从±3度降到了±0.5度,效果立竿见影。
最后必须吐槽下MATLAB仿真和实际硬件的差距。仿真里完美运行的算法,上板子后因为PWM谐波干扰又得重新调参。后来在ADC采样后加了个移动平均滤波,窗口大小根据载波频率动态调整,总算把电流采样噪声压下去了。现在这套方案在实验室环境下,200W电机从零速到额定转速全程无感运行稳得一批,就是不知道丢到东北零下20度的环境里还能不能这么嘚瑟。