永磁同步电机(pmsm,全速度切换无位置传感器控制(高速可以是超螺旋滑模) 低速可以是脉振高频方波注入,if开环等仿真模型。 切换有两种切换。 单个链接只有一种。 可以赠送单独卡尔曼滤波或者扩张状态观测器。
高速飙车用超螺旋滑模那叫一个稳,这货比传统滑模温柔多了。看这段Simulink里的滑模面计算代码:
function s = sliding_surface(theta_err, d_theta_err) lambda = 50; % 这个参数决定了追击速度 s = d_theta_err + lambda * theta_err; end重点在lambda这个追击系数,调小了响应慢得像乌龟,大了容易引发系统震荡。老司机建议从电机转动惯量的倒数开始试调,别问为什么,都是玄学经验。
低速蠕行就得祭出脉振高频方波了,这玩意儿比正弦波注入更抗干扰。在FPGA里生成方波时记得加死区:
always @(posedge clk) begin if(counter < 100) hfi_wave <= 1'b1; else if(counter < 200) hfi_wave <= 1'b0; // 10kHz载波 counter <= (counter == 199) ? 0 : counter + 1; end有个坑得注意——载波频率超过PWM开关频率的1/5就会翻车。解调时用移动平均滤波器比FIR更省资源,实测在STM32G4上能省下30%的CPU时间。
切换策略才是真考验,硬切换像驾校教练踩急刹——速度到阈值直接切,代码简单粗暴:
if(rpm_est > 500) { current_controller = ST_SMC_MODE; // 切到滑模 } else { current_controller = HFI_MODE; // 切回高频注入 }但实际跑起来会在切换点附近跳舞,后来上了带滞环的软切换才算稳。更骚的操作是用扩张状态观测器当裁判:
function [mode_flag] = observer_switch(est_disturbance) if est_disturbance > 0.3 % 观测到扰动突增 mode_flag = 2; // 触发紧急切换 else mode_flag = maintain_current_mode(); end end这观测器还能兼职做故障诊断,实测在负载突变时切换延迟从20ms降到5ms。最后送个卡尔曼滤波的彩蛋——别直接用系统自带的kalman函数,改下噪声矩阵初始化姿势:
Q = np.diag([0.1, 0.1, 1e-4]) # 过程噪声别全设为1 R = 0.5 # 测量噪声根据ADC精度调整调参时重点盯住残差曲线,波动幅度超过均值两倍就得返工。玩到现在算是能跑全场了,但离藤原拓海那种排水渠过弯的境界还差十个秋名山车神。