磁链观测器 vesc中使用的方法。 已经移植到了自己的工程中,实现0速闭环启动。 代码、文档、仿真是一一对应的,方便学习。 送仿真模型
在无感FOC的江湖里,磁链观测器绝对是个狠角色。去年折腾VESC开源项目时发现,他们家的滑模观测器方案居然能在零转速下硬刚闭环,这直接颠覆了我对无感启动的认知——原来不用高频注入也能玩零速闭环!
先上点硬核的。咱们直接看移植到STM32里的核心代码段:
//滑模观测器核心计算 void SMO_Update(SMO_TypeDef *h){ float emf_alpha = h->I_alpha * h->R + h->Ld * (h->I_alpha - h->I_alpha_prev)/h->Ts; float emf_beta = h->I_beta * h->R + h->Ld * (h->I_beta - h->I_beta_prev)/h->Ts; //滑模控制量 h->Z_alpha = (emf_alpha > 0) ? h->Kslide : -h->Kslide; h->Z_beta = (emf_beta > 0) ? h->Kslide : -h->Kslide; //锁相环更新 h->theta = atan2(h->emf_beta_est, h->emf_alpha_est); h->speed = (h->theta - h->theta_prev)/h->Ts; }代码里有个滑模增益参数Kslide,这货直接决定了观测器对电机反电动势的跟踪速度。实测发现当Kslide取值在0.2~0.5倍母线电压时,观测器对转速突变的响应最稳。不过要注意,增益过大会导致高频振荡,电机启动时会发出杀猪般的啸叫(别问我怎么知道的)
移植到自家无刷电调时遇到个坑:零速初始位置检测。VESC原方案依赖开环强拉,但实测容易导致电机跳舞。后来改成两段式启动:
- 先给固定方向的矢量电压(约20%占空比)
- 等观测器输出的角度波动小于5度时切闭环
实测视频里能看到,电机从静止到闭环锁定整个过程不到0.3秒,比传统开环启动快了近一倍。有个骚操作是动态调整锁相环带宽——低速时用5Hz带宽抑制噪声,转速上来后切到50Hz提升响应速度。
仿真模型和实测波形对比图(见附件)显示,在突加负载时观测器输出的转速波动比实际编码器信号仅滞后2ms,这精度做无人机电调都够用了。想要仿真模型的兄弟直接去公众号回复"VESC观测器"自提,网盘里还扔了三个不同功率等级的适配参数。
最后说下文档编排的小技巧:用Doxygen生成的文档直接关联了代码中的关键结构体,比如电机参数结构体里连温度补偿系数都做了注释。这样新手看到MotorParam.Tcomp就知道这是用来补偿铜电阻温漂的,不用再满世界找公式推导了。