4. 离线校正方法(二):脉冲注入法原理与实现
上一章我们聊了磁链观测法,这次来说说另一种离线校正的思路——脉冲注入法。我个人觉得,这个方法在电机静止或极低速场景下特别好用,尤其是那些对初始位置精度要求高的场合。
说白了,脉冲注入法就是给电机定子绕组施加一系列高频电压脉冲,然后通过检测电流响应来反推转子位置。你想想看,电机绕组是个电感,电感值会随着转子位置变化而变化——这就是我们能利用的物理基础。
核心思想: 利用电机凸极效应(或饱和凸极效应),通过高频激励下的电流响应差异,解算出转子位置。
4.1 为什么需要脉冲注入?
我记得刚做电机控制那会儿,遇到一个问题:电机上电时转子位置完全未知,直接启动很容易失步甚至反转。用霍尔传感器吧,精度不够;用编码器吧,成本上去了。后来接触到脉冲注入法,发现它不需要额外硬件,纯软件就能搞定。
脉冲注入法的几个典型应用场景:
- 初始位置检测:电机静止时,确定转子d轴方向
- 低速无传感器控制:反电动势太弱,无法用观测器
- 电角度偏差离线校正:标定传感器安装偏差
这里要特别说明一下:脉冲注入法属于离线校正方法,它不依赖电机模型参数,鲁棒性比磁链观测法强不少。但代价是需要额外的注入时间,不适合在线实时运行。
4.2 原理:高频脉冲如何"看见"转子位置
我们先从数学上理解一下。永磁同步电机的定子电感矩阵,在静止坐标系下可以写成:
L(θ) = L₀ + L₂·cos(2θ) L₂·sin(2θ)
L₂·sin(2θ) L₀ - L₂·cos(2θ)
其中L₀是平均电感,L₂是电感波动幅值,θ是转子电角度。你看,电感值随2θ变化——这就是凸极效应。
当我们施加一个电压脉冲时,电流变化率di/dt = u/L。电感大的方向,电流上升慢;电感小的方向,电流上升快。通过比较不同方向上的电流响应,就能判断出转子位置。
我的经验: 实际项目中,我通常选择在αβ坐标系下施加6个或12个方向的电压矢量。方向越多,位置分辨率越高,但检测时间也越长。6方向一般够用,精度大约在±15°电角度以内。
4.3 算法流程:一步一步来
下面是我在实际项目中验证过的脉冲注入流程,一共6步:
- 施加预定位脉冲:先给一个固定方向的电压矢量,把转子拉到已知位置。这一步不是必须的,但能提高后续检测的一致性。
- 注入检测脉冲序列:依次在N个方向(通常N=6或12)上施加等宽等幅的电压脉冲。每个脉冲持续约0.5~2ms。
- 采样电流响应:在每个脉冲结束时,采样相电流值。注意要在脉冲结束前采样,避开开关噪声。
- 计算电流幅值:对每个方向的电流响应求幅值或峰值。我习惯用电流矢量的模长。
- 拟合位置曲线:将电流幅值按角度绘制,找到最大值对应的方向——那就是d轴方向。
- 计算偏差:将检测到的d轴方向与传感器读数对比,得到电角度偏差。
嗯,这里要注意:步骤5中找最大值时,如果只有6个点,直接取最大值精度有限。我建议用二次插值或正弦拟合,能把精度提升到±3°以内。
4.4 参数选择:这些坑我踩过
参数选不好,脉冲注入法效果会大打折扣。我把关键参数整理成了一张表:
| 参数 | 推荐范围 | 选大/选小的影响 | 我的建议 |
|---|---|---|---|
| 脉冲电压幅值 | 10%~30% 母线电压 | 太大→电流过冲、噪声;太小→信噪比低 | 先试20%,看电流响应再调 |
| 脉冲宽度 | 0.5ms ~ 2ms | 太宽→转子可能转动;太窄→电流未建立 | 1ms是个不错的起点 |
| 脉冲方向数 | 6 或 12 | 6方向够用,12方向精度更高 | 量产用6方向,标定用12方向 |
| 脉冲间隔 | 2ms ~ 5ms | 太短→电流未衰减;太长→浪费时间 | 等电流衰减到5%以下再发下一个 |
| 采样时刻 | 脉冲结束前100μs | 太早→电流未稳定;太晚→开关噪声 | 用ADC触发同步采样 |
曾经踩过的坑: 有一次我把脉冲宽度设成了5ms,结果电机在脉冲期间转了将近10°机械角度。检测出来的位置偏差完全不准。后来我加了一条规则:脉冲宽度必须保证转子转动角度小于0.5°机械角度。
4.5 代码实现:核心逻辑
下面是一个简化的脉冲注入检测函数。实际项目中还要加滤波、保护逻辑,但核心思路都在这里了:
// 脉冲注入法检测转子位置
// 输入:脉冲方向数N,脉冲宽度T_pulse_us,脉冲占空比duty
// 输出:检测到的电角度theta_est
float pulse_injection_detect(int N, int T_pulse_us, float duty) {
float I_max = 0;
float theta_max = 0;
float I_samples[N];
for (int i = 0; i < N; i++) {
// 1. 计算当前脉冲方向角度
float theta_pulse = (float)i / N * 2 * PI;
// 2. 施加电压矢量(SVPWM实现)
svpwm_set_voltage(theta_pulse, duty * Vbus);
// 3. 等待电流建立
delay_us(T_pulse_us - 100);
// 4. 采样电流
float Ia = get_phase_current_A();
float Ib = get_phase_current_B();
float Ic = -(Ia + Ib);
// 5. 计算电流矢量幅值
float I_alpha = Ia;
float I_beta = (Ib - Ic) / SQRT3;
float I_mag = sqrt(I_alpha*I_alpha + I_beta*I_beta);
I_samples[i] = I_mag;
// 6. 零矢量续流,等待电流衰减
svpwm_set_zero_vector();
delay_us(3000); // 等待电流衰减
// 7. 记录最大值
if (I_mag > I_max) {
I_max = I_mag;
theta_max = theta_pulse;
}
}
// 二次插值提高精度
float theta_fine = quadratic_interpolation(I_samples, N, theta_max);
return theta_fine;
}
个人习惯: 代码里我用了二次插值函数,它利用最大值点及其左右两个点的电流值,拟合出一条抛物线,取顶点位置。这样即使只有6个方向,也能把精度做到±3°以内。具体插值公式网上有现成的,我就不展开了。
4.6 脉冲注入法的知识体系
我把这一章的核心逻辑画成了流程图,方便你理解整体脉络:
4.7 实际项目中的注意事项
最后,我结合自己的项目经验,总结几个容易出问题的地方:
- 电流采样噪声:脉冲注入时电流变化很快,采样时刻稍微偏差一点,结果就差很多。我建议用差分采样,并在ADC前端加RC滤波,截止频率设在10kHz左右。
- 转子微动问题:如果脉冲幅值太大或宽度太长,转子会轻微转动。检测完成后,转子位置已经变了。解决办法是限制脉冲能量,或者检测完成后重新定位。
- 饱和效应:大电流注入会导致磁路饱和,电感变化规律偏离理想模型。我一般把电流控制在额定电流的30%以内,避开饱和区。
- 多脉冲平均:单次脉冲检测受噪声影响大。我习惯在每个方向重复3~5次,取平均值,信噪比能提升不少。
一句话总结: 脉冲注入法离线校正,就是用高频脉冲"扫描"电感分布,找到d轴方向。参数调好了,精度能做到±3°电角度以内,足够满足大多数工程需求。