1. 高频注入技术的江湖地位
在电机控制这个行当里混了十几年,高频注入技术就像武侠小说里的"易筋经"——人人都知道它厉害,但真能练到家的没几个。这玩意儿最早是德国那帮搞伺服的大佬们折腾出来的,现在从工业伺服到新能源车电驱,哪家要是不提两句高频注入,都不好意思说自己是做电机控制的。
上周帮客户调试一台永磁同步电机,现场工程师指着示波器问我:"这高频信号毛刺咋这么多?"我一看就知道又是载波参数没调对。今天干脆把DSP工程里最核心的那段PWM载波注入代码扒出来,顺便说说那些手册上不会写的实战经验。
2. 高频注入的底层逻辑
2.1 为什么非得用高频注入
普通FOC控制在中高速区稳如老狗,但一到低速甚至零速就怂了——转子位置观测器直接歇菜。这时候高频注入就像给电机装了夜视仪:通过PWM波强行注入高频电压信号(通常2-5kHz),利用电机凸极效应产生的响应电流来反推转子位置。
关键点在于:
- 注入频率要远高于基波频率(至少10倍以上)
- 幅值控制在额定电压5%-10%(太大发热,太小信噪比不够)
- 必须避开机械共振频段(别问我怎么知道的,换过三次轴承得出的教训)
2.2 三种注入方式对比
| 注入类型 | 实现难度 | 抗干扰性 | 适用电机 | DSP资源占用 |
|---|---|---|---|---|
| 旋转高频电压 | ★★★★ | ★★★★ | 表贴/内置永磁 | 高 |
| 脉振高频电压 | ★★★ | ★★★ | 内置永磁 | 中 |
| 方波载波注入 | ★★ | ★★ | 所有类型 | 低 |
我们这次要拆解的是第三种方案,特别适合TI C2000系列这种DSP资源紧张的场景。虽然论文里吹得少,但工厂里用得最勤快。
3. DSP工程实战代码解析
3.1 PWM载波注入核心配置
c复制// PWM载波频率设置(基于TI C2837x)
EPwm1Regs.TBPRD = SYSTEM_FREQ / (2 * CARRIER_FREQ) - 1; // 载波周期
EPwm1Regs.CMPA.half.CMPA = (EPwm1Regs.TBPRD * INJECTION_RATIO) / 100; // 调制比
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 比较点A上升沿动作
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 比较点A下降沿动作
这段代码有三个魔鬼细节:
SYSTEM_FREQ必须是CPU时钟经分频后的EPWM模块时钟(别直接怼150MHz主频)CARRIER_FREQ建议取2k-5kHz,超过8kHz开关损耗会急剧上升INJECTION_RATIO控制在5-15%之间,具体值要看电机阻抗特性
3.2 高频信号解调关键算法
c复制// 在ADC中断服务程序中处理
void AdcIsr(void)
{
static float i_alpha_prev = 0, i_beta_prev = 0;
// 1. Clarke变换获取αβ轴电流
float i_alpha = 0.6667 * (Ia - 0.5*Ib - 0.5*Ic);
float i_beta = 0.5774 * (Ib - Ic);
// 2. 带通滤波提取高频分量
float i_alpha_hf = BPF_Filter(&bpf_alpha, i_alpha - i_alpha_prev);
float i_beta_hf = BPF_Filter(&bpf_beta, i_beta - i_beta_prev);
// 3. 同步解调获取位置误差
float theta_err = atan2f(i_beta_hf * sin_theta_est,
i_alpha_hf * cos_theta_est);
// 更新观测器...
i_alpha_prev = i_alpha;
i_beta_prev = i_beta;
}
这里藏着两个大坑:
- 带通滤波器的中心频率必须严格匹配注入频率(偏差超过5%效果就废了)
atan2f函数在DSP上跑很吃资源,可以用查表法替代(省下30%计算时间)
4. 现场调试避坑指南
4.1 示波器抓包技巧
用差分探头测电机线电压时,一定要打开带宽限制(通常20MHz就够了)。去年在吉利项目上没注意这个,抓到的波形全是开关噪声,调了三天参数发现是测量问题。
正确的观测顺序:
- 先确认PWM载波波形是否正常(占空比突变点是否干净)
- 再看相电流波形中的高频分量(应该呈现周期性脉动)
- 最后检查解调后的位置信号(要看到6次谐波才算成功)
4.2 参数整定经验值
对于额定功率3kW的永磁电机,这些参数可以直接套用:
- 载波频率:4kHz
- 注入电压比:8%
- 带通滤波器Q值:0.707
- 观测器带宽:50Hz(对应100ms响应时间)
遇到震动问题先检查这三个点:
- 载波频率是否接近机械共振点(用频响分析仪扫一遍)
- 电流采样是否同步(不同步会产生虚假谐波)
- 死区补偿是否到位(特别是低速重载工况)
5. 性能优化骚操作
5.1 载波移相技术
当多个电机并联运行时,用这个代码避免载波同相干扰:
c复制EPwm2Regs.TBCTL.bit.PHSEN = 1; // 使能相位加载
EPwm2Regs.TBPHS.half.TBPHS = EPwm1Regs.TBPRD / 3; // 移相120°
实测能降低30%的共模电流,特别适合多轴联动场合。
5.2 动态注入策略
速度上来后可以逐步降低注入量,这段代码放在速度环中断里:
c复制if(fabs(speed_pu) < 0.1) { // 标幺值
injection_ratio = 10.0;
} else if(fabs(speed_pu) < 0.3) {
injection_ratio = 5.0;
} else {
injection_ratio = 0.0; // 完全关闭注入
}
注意要加滞后环防止频繁切换,我一般设0.05pu的回差。
6. 那些年踩过的坑
去年给某机床厂做主轴驱动,载波注入后出现诡异的转矩波动,后来发现是编码器电源地和功率地之间形成了环路。解决方案:
- 在编码器接口处加共模扼流圈
- PWM载波频率从4kHz调到4.5kHz(避开谐振点)
- 电流采样改用光纤隔离ADC
还有个更隐蔽的问题——IGBT的米勒效应会导致注入波形畸变。后来在门极驱动加了个-5V的负压偏置,立马药到病除。这些实战经验,论文里可不会告诉你。