基于超螺旋滑模的无传感控制-pmsm 包含: (1)相电压重构 (2)超螺旋滑模观测器 (3)SOGI二阶广义积分器滤除直流等杂波 (4)基于pll计算角度跟速度三相永磁同步电机无感控制这事儿最近在实验室里折腾了俩月。当示波器上第一次出现稳定的转速波形时我盯着屏幕足足愣了十秒钟——鬼知道这几个模块联调起来多要命。今天咱们就唠唠这套系统里几个关键环节的实现门道特别是怎么用超螺旋滑模玩出花样。先说相电压重构这关。很多新手直接拿母线电压乘以占空比就完事结果发现重构的电压总带着高频毛刺。实测中发现死区时间和IGBT压降的影响不能忽视我们搞了个补偿算法// 三相PWM占空比读取 float duty_A TIM1-CCR1 / (float)TIM1-ARR; float duty_B TIM1-CCR2 / (float)TIM1-ARR; float duty_C TIM1-CCR3 / (float)TIM1-ARR; // 死区补偿0.5us死区时间对应补偿量 float deadtime_comp 0.05 * Vdc / (PWM_freq * 1e-6); Ua Vdc * (duty_A - 0.5) deadtime_comp * (duty_A 0.5 ? 1 : -1); Ub Vdc * (duty_B - 0.5) deadtime_comp * (duty_B 0.5 ? 1 : -1); Uc Vdc * (duty_C - 0.5) deadtime_comp * (duty_C 0.5 ? 1 : -1);补偿后的电压波形明显干净不少特别是低速时反电动势观测精度提升显著。这里有个坑不同厂家的IGBT压降特性差异大最好用万用表实测补偿系数。基于超螺旋滑模的无传感控制-pmsm 包含: (1)相电压重构 (2)超螺旋滑模观测器 (3)SOGI二阶广义积分器滤除直流等杂波 (4)基于pll计算角度跟速度重头戏在超螺旋滑模观测器。传统滑模那个抖啊跟开了震动模式似的。超螺旋算法通过二阶滑模把高频抖振压下去代码实现时要注意自适应增益调整% 超螺旋滑模观测器核心代码 function [i_alpha_hat, i_beta_hat, e_alpha, e_beta] STSMO(v_alpha, v_beta, i_alpha, i_beta) persistent z1_alpha z1_beta z2_alpha z2_beta; lambda 150; % 滑模面系数 k1 300; % 自适应增益1 k2 5000; % 自适应增益2 e_alpha i_alpha - z1_alpha; e_beta i_beta - z1_beta; % 超螺旋算法 dz1_alpha (1/Ld)*(v_alpha - Rs*z1_alpha lambda*Lq*omega_est*z1_beta) k1*sqrt(abs(e_alpha)).*sign(e_alpha); dz1_beta (1/Lq)*(v_beta - Rs*z1_beta - lambda*Ld*omega_est*z1_alpha) k1*sqrt(abs(e_beta)).*sign(e_beta); dz2_alpha k2*sign(e_alpha); dz2_beta k2*sign(e_beta); % 状态更新 z1_alpha z1_alpha dz1_alpha*Ts; z1_beta z1_beta dz1_beta*Ts; z2_alpha z2_alpha dz2_alpha*Ts; z2_beta z2_beta dz2_beta*Ts; % 反电动势估计 e_alpha z2_alpha; e_beta z2_beta; end这里lambda的选择直接影响动态响应实测发现当电机转速超过2000rpm时lambda需要随转速自适应调整才能保持稳定。有个取巧的办法lambda 基础值 0.1*abs(omega_est)。SOGI滤波器这玩意儿真是个宝藏。原本用普通带通滤波器处理反电动势信号结果直流偏置总搞事情。换成二阶广义积分器后50Hz工频干扰滤得干干净净class SOGI: def __init__(self, k, w0, Ts): self.x1 0 self.x2 0 self.k k self.w0 w0 self.Ts Ts def update(self, u): a self.w0 * self.Ts x1_new self.x1 a*(self.x2 self.k*(u - self.x1)) x2_new self.x2 - a*self.x1 self.x1, self.x2 x1_new, x2_new return self.x1 # 输出正交分量 # 使用时要注意中心频率自适应 sogi_alpha SOGI(k1.414, w02*np.pi*50, Ts0.0001) sogi_beta SOGI(k1.414, w02*np.pi*50, Ts0.0001)最后这PLL锁相环调得我差点把示波器砸了。核心在于把反电动势的alpha-beta分量转换到旋转坐标系// 改进型PLL实现 void PLL_Update(float e_alpha, float e_beta, float Ts) { static float theta_est 0; static float omega_est 0; static float integrator 0; // 坐标变换 float sin_theta sin(theta_est); float cos_theta cos(theta_est); float eq -e_alpha*sin_theta e_beta*cos_theta; // 环路滤波器 float kp 50.0; float ki 1200.0; omega_est kp*eq integrator; integrator ki*eq*Ts; // 角度积分 theta_est omega_est*Ts; if(theta_est 2*PI) theta_est - 2*PI; if(theta_est 0) theta_est 2*PI; }调试时发现当转速突变时容易失锁后来在环路滤波器里加了转速前馈补偿才算稳住。实测在10%额定转速下角度误差能控制在±0.2rad以内。这套方案跑下来最大的收获是参数之间的耦合效应比想象中复杂。比如滑模观测器的增益和PLL带宽需要动态配合否则低速时观测器抖得亲妈都不认识。后来做了个参数自整定表根据转速自动切换三组参数总算把全速域跑通了。