1. 永磁同步电机中频振动问题解析
永磁同步电机(PMSM)在工业伺服系统中广泛应用,但工程师们经常遇到一个棘手问题——当电机运行在200-1500Hz这个中频段时,系统会出现明显的机械振动。这种振动就像牙疼一样,虽然不会立即导致系统崩溃,但长期运行会加速机械部件磨损,影响加工精度。
从控制理论角度看,这种振动主要源于两个方面的相位延迟:
- 速度观测器固有的计算延迟
- 数字控制系统的采样保持延迟
在典型的2kHz控制周期下,500Hz中频信号的相位延迟可达:
code复制相位延迟 = 360° × (500/2000) = 90°
而实际系统中,由于龙伯格观测器等算法的计算过程,还会叠加额外的相位滞后。当这些延迟累积到一定程度,就会导致电流环和速度环产生不利的相互作用,形成正反馈,最终表现为机械振动。
2. 相位补偿速度观测器设计原理
2.1 传统龙伯格观测器的局限
传统龙伯格观测器的传递函数通常表示为:
code复制H(s) = (3τs + 1)/(τ²s² + 3τs + 1)
在离散化实现时,采用双线性变换(Tustin变换)比前向差分法更稳定,其转换公式为:
code复制s = (2/Ts)(z-1)/(z+1)
其中Ts为采样周期。但即使这样,观测器输出仍存在明显的相位滞后。
2.2 相位补偿方案设计
我们在速度观测器输出端添加了一个相位超前补偿环节,其核心思想是根据当前电气频率动态调整补偿量。补偿角度计算公式为:
code复制补偿角度 = -相位滞后 × 补偿系数
其中:
- 相位滞后 = -2π × 当前频率 × Ts × 0.5
- 补偿系数经过实验确定为1.8倍
这个1.8倍的补偿系数不是随意选择的。通过Simulink扫频测试发现:
- 1.5倍补偿时,500Hz处会出现相位过冲
- 1.8倍补偿时,振动幅值可降低到原来的1/10
- 2.0倍补偿时,系统开始出现不稳定
3. 离散化实现与代码解析
3.1 观测器离散化实现
采用双线性变换将连续传递函数转换为离散形式:
matlab复制[numd, dend] = bilinear([3*Tau 1], [Tau^2 3*Tau 1], 1/Ts);
得到的离散传递函数需要特别注意分子分母的阶数匹配问题。实践中我们发现,如果不进行归一化处理,观测器输出会出现明显抖动。
3.2 C语言实现关键代码
速度观测器的核心实现代码如下:
c复制// 离散化速度观测器实现
void update_speed_observer(float current, float voltage, float Ts) {
static float buf[3] = {0};
buf[2] = buf[1];
buf[1] = buf[0];
buf[0] = (voltage - R*current) / L; // 反电势估算
// 二阶差分方程
float speed_est = (a1*buf[0] + a2*buf[1] + a3*buf[2]) / b0;
// 三点滑动平均
speed_filtered = (speed_est + last_speed1 + last_speed2) / 3.0f;
last_speed2 = last_speed1;
last_speed1 = speed_est;
}
相位补偿函数实现:
c复制float compensate_speed_phase(float estimated_speed, float Ts, float current_freq) {
float phase_lag = -2*PI*current_freq*Ts*0.5f; // 计算固有延迟
float compensate_angle = -phase_lag * 1.8f; // 补偿系数取1.8倍裕度
return estimated_speed * cosf(compensate_angle);
}
4. 仿真与实测结果分析
4.1 Simulink仿真对比
在Simulink中搭建了补偿前后的对比测试:
| 测试条件 | 补偿前振动幅值 | 补偿后振动幅值 | 改善幅度 |
|---|---|---|---|
| 500Hz | 0.8A | 0.05A | 94% |
| 600Hz | 1.2A | 0.08A | 93% |
| 800Hz | 0.9A | 0.12A | 87% |
4.2 实际电机测试
使用ADAMS和Simulink联合仿真平台,接入实际振动加速度传感器数据,测得:
- 补偿前扭矩波动:±12N·m
- 补偿后扭矩波动:±1.3N·m
- 处理器开销增加:约15%
5. 工程应用注意事项
- 频率范围限制:
c复制if (electrical_freq > 200) && (electrical_freq < 1500)
enable_phase_comp = 1;
else
enable_phase_comp = 0; // 低速时关闭补偿
补偿算法仅在中频段启用,因为:
- 低速时补偿角度过大会导致观测器震荡
- 高频时相位补偿效果有限且增加计算负担
- 滤波器调整技巧:
- 初始实现使用3点滑动平均,在某些情况下可能出现残余抖动
- 可尝试改为5点滑动平均,但会增加1个控制周期的延迟
- 最佳平衡点需要根据具体电机特性调整
- 参数整定建议:
- 先在仿真环境中扫频确定最佳补偿系数(通常1.6-2.0之间)
- 实际调试时从1.5倍开始逐步增加,观察振动变化
- 注意监控CPU使用率,确保实时性要求
6. 源码获取与使用说明
完整实现代码已开源在GitHub仓库【PMSM_VibraKiller】,使用时需注意:
- 仿真模型中的机械参数需要根据实际电机修改
- 代码中的滤波器参数可能需要微调
- 建议先在仿真环境中验证效果再实际部署
对于不同的处理器平台,可能需要优化浮点运算部分。在STM32G4系列上测试表明,即使增加相位补偿,整个观测器的执行时间仍可控制在50μs以内,完全满足2kHz控制周期的实时性要求。