永磁同步电机(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精度调整

调参时重点盯住残差曲线,波动幅度超过均值两倍就得返工。玩到现在算是能跑全场了,但离藤原拓海那种排水渠过弯的境界还差十个秋名山车神。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐