该模型在旋转坐标系下采样旋转高频注入的方法进行低速时的无传感器器控制对静止坐标系下的电流进行同轴系高通滤波器提取负序分量继而采用外差法进项误差提取误差代入位置观测器得到PMSM的转子角度。高频注入法在低速无传感器控制领域就像给电机装了个声呐。咱们在定子侧注入特定频率的电压信号通过捕捉转子凸极效应产生的响应信号来定位转子位置。这种玩法在零速/低速场景下尤其好用今天就跟大伙儿拆解下具体实现中的几个关键代码块。先看高频信号注入的核心操作。这里用α-β坐标系下的电压方程打个样hf_freq 2 * np.pi * 500 # 500Hz高频信号 hf_amp 15 # 电压幅值(V) def inject_hf_voltage(theta_e): v_alpha hf_amp * np.cos(hf_freq * time theta_e) v_beta hf_amp * np.sin(hf_freq * time theta_e) return Clarke_transform(v_alpha, v_beta)这个高频旋转电压就像在电机里扔了个信号弹当转子位置θ_e变化时响应电流会产生特定的调制效应。注意这里用Clarke变换把信号映射到静止坐标系为后续处理做准备。电流信号处理环节有个重要技巧——同轴高通滤波器组。直接上实现// 双通道高通滤波器实现 typedef struct { float a[2]; float b[2]; float w[2]; } HPF; HPF hpf_alpha, hpf_beta; void init_hpf(HPF* h, float cutoff_freq, float Ts) { float rc 1/(2*PI*cutoff_freq); h-a[0] rc/(rc Ts); h-a[1] -h-a[0]; h-b[0] 1.0; h-w[0] h-w[1] 0; } float run_hpf(HPF* h, float input) { h-w[0] input - h-a[0]*h-w[1]; float output h-b[0]*h-w[0] h-a[1]*h-w[1]; h-w[1] h-w[0]; return output; }这组滤波器专门用来剥离基波分量把高频响应信号单独拎出来。调试时发现截止频率设在高频信号频率的1/10左右效果最佳既能滤除工频又不损失有用信息。该模型在旋转坐标系下采样旋转高频注入的方法进行低速时的无传感器器控制对静止坐标系下的电流进行同轴系高通滤波器提取负序分量继而采用外差法进项误差提取误差代入位置观测器得到PMSM的转子角度。外差法解调是提取位置误差的关键步骤% 外差法处理负序分量 theta_hat ...; % 估计的转子位置 demod_signal i_alpha_hpf .* cos(hf_freq*t theta_hat) ... i_beta_hpf .* sin(hf_freq*t theta_hat); % 低通滤波提取误差 [b,a] butter(2, 100/(0.5*fs), low); position_error filtfilt(b, a, demod_signal);这个操作相当于把高频响应信号搬移到基带通过混频把位置误差信息解调出来。实际调试时要注意相位补偿有一次忘记加θ_hat导致误差信号反相系统直接崩了。最后的位置观测器用锁相环结构实现// 二阶位置观测器 typedef struct { float Kp; float Ki; float angle; float speed; float integral; } PositionObserver; void update_observer(PositionObserver* obs, float error, float Ts) { obs-integral error * Ts * obs-Ki; obs-speed obs-Kp * error obs-integral; obs-angle obs-speed * Ts; // 角度限幅 if(obs-angle PI) obs-angle - 2*PI; else if(obs-angle -PI) obs-angle 2*PI; }参数整定是个经验活Kp主要影响动态响应Ki决定稳态精度。实测发现当Kp2π×50Ki (2π×10)^2时系统在5rpm下角度跟踪误差能控制在0.2rad以内。这套方案在风机水泵类负载上跑得挺稳但遇到周期性脉动负载时还是得加个转速前馈。有个坑得提醒高频注入会产生额外损耗注入电压幅值别超过额定电压的15%否则电机温升会教你做人。