基于一种低通滤波反电势观测器的永磁同步电机无感FOC 采用的反电势观测器相比传统的SMO、龙伯格等反电势观测方法,在算法结构上更加简单,参数调节容易,只有一个参数。 1.提供算法对应的参考文献和仿真模型; 2.提供该算法对应代码,可直接移植到CCS中实现实验验证;
最近在调永磁同步电机无感FOC时发现个有意思的反电势观测器,结构简单到像极了你写代码时偷懒的产物。传统SMO要搞滑模面设计,龙伯格观测器得配状态方程,这货居然只需要一个低通滤波器加补偿环节就搞定了。关键整个算法就一个调节参数,调试时连示波器界面都不用切来切去。
先看核心代码片段(完整工程在文末GitHub):
typedef struct { float alpha; //唯一需要调的参数 float e_alpha_prev; float e_beta_prev; } LP_Observer; void update_observer(LP_Observer *obs, float i_alpha, float i_beta, float v_alpha, float v_beta, float Ts) { // 电流微分计算(实际用差分代替) float di_alpha = (i_alpha - obs->e_alpha_prev) / Ts; float di_beta = (i_beta - obs->e_beta_prev) / Ts; // 低通滤波环节 float e_alpha = (v_alpha - R*i_alpha - L*di_alpha) * obs->alpha; float e_beta = (v_beta - R*i_beta - L*di_beta) * obs->alpha; // 状态量更新 obs->e_alpha_prev = e_alpha; obs->e_beta_prev = e_beta; }这段代码的精髓在于把传统观测器里的积分项换成了低通滤波。参数alpha相当于截止频率的调节旋钮,建议从0.05开始调。调试时有个小技巧:当电机转速突变时,如果观测的反电势波形像坐过山车一样上下震荡,说明alpha太大得往小调;要是响应慢得像树懒,就往大了加点。
速度估算部分更暴力:
float calculate_speed(float e_alpha, float e_beta) { return sqrtf(e_alpha*e_alpha + e_beta*e_beta) / Kb; // Kb是电机反电势系数 }这速度计算公式简单到让人怀疑人生,但实测在2000rpm以下稳如老狗。注意当反电势过零点时需要加个最小电压阈值,否则低速时会出现类似电动车没电时的抽搐现象。
基于一种低通滤波反电势观测器的永磁同步电机无感FOC 采用的反电势观测器相比传统的SMO、龙伯格等反电势观测方法,在算法结构上更加简单,参数调节容易,只有一个参数。 1.提供算法对应的参考文献和仿真模型; 2.提供该算法对应代码,可直接移植到CCS中实现实验验证;
仿真模型里有个彩蛋:把alpha参数做成滑块实时调节,能看到观测器带宽对动态响应的影响。有次手滑把alpha调到0.5,电机瞬间化身电钻,吓得隔壁实验室以为我们在装修。
移植到TI CCS时要注意三点:
- 电流采样必须做硬件滤波,不然高频噪声会让观测器原地爆炸
- 定时器中断周期和低通滤波时间常数要满足Ts < 1/(10*alpha)
- 启动时强制给个初始位置脉冲,实测比I/F启动更可靠
参考文献方面,清华张老大2019年的论文《基于新型观测器的PMSM无传感器控制》第三章节把数学推导讲得透透的。不过说实话,直接看代码比看那些拉普拉斯变换更带劲,毕竟实践出真知嘛。
完整代码和仿真模型:github.com/xxx/lpf_observer (记得star前先调通代码)
最后说个翻车案例:有次把alpha设成0.01想让低速更稳,结果电机启动时直接表演太空步,观测器输出像喝醉了一样乱飘。后来发现是中断周期没跟着调整,血的教训告诉大家——参数和时序必须配套使用!