4. 离线标定方法二:脉冲注入法
上一章我们聊了旋转电压矢量法,这次换个思路。脉冲注入法,说白了就是给电机定子绕组打一组短脉冲,通过观察电流响应来判断磁极位置。
我个人习惯在项目初期先用这个方法做快速验证。为什么?因为它不需要电机连续旋转,静止状态下就能干活。你想想看,有些场合电机还没装负载,或者系统刚上电,这时候用脉冲注入法就很方便。
4.1 基本原理:电感饱和效应
先讲清楚一个物理现象——电感饱和。永磁同步电机的定子电感不是恒定的,它跟转子位置有关。
当定子磁场方向和转子永磁体方向一致时,磁路容易饱和,电感值变小。反过来,方向相反时,磁路不容易饱和,电感值变大。
我刚开始做这个的时候,总觉得这个效应很微弱,怕测不准。后来发现,只要脉冲宽度和幅值选对了,电感变化量足够被检测到。
核心逻辑:
- 定子磁场与转子磁场同向 → 磁路饱和 → 电感 L 小 → 电流上升快
- 定子磁场与转子磁场反向 → 磁路不饱和 → 电感 L 大 → 电流上升慢
通过比较不同方向脉冲下的电流峰值或电流变化率,就能反推出转子磁极的指向。
4.2 脉冲注入的步骤
实际操作中,我一般分三步走。嗯,这里要注意,每一步的时序都很关键。
- 选择注入方向:通常沿 α-β 坐标系,等间隔取 6 个或 12 个方向。比如 0°、60°、120°、180°、240°、300°。
- 施加高频脉冲:每个方向施加一个短脉冲,脉宽一般在 50μs ~ 200μs。电压幅值建议取母线电压的 30%~50%。
- 采样电流响应:在脉冲结束时刻采样相电流,记录每个方向对应的电流峰值。
我曾经在一个项目里把脉宽设成了 500μs,结果电流直接冲到过流保护阈值。后来改成 100μs,数据就正常了。所以脉宽别贪大,够用就行。
4.3 数据处理与方向判定
采样完 6 个方向的电流值后,怎么找到磁极方向?
最简单的方法:找电流最大的那个方向。因为电感最小,电流上升最快,那个方向就是转子磁极的指向。
但这里有个坑——你找到的方向可能是 N 极,也可能是 S 极。因为电感饱和效应在 N 极和 S 极下是对称的,电流响应几乎一样。
避坑指南:
我曾经在第一次做脉冲注入时,只找到了磁极轴线方向,没区分 N/S 极。结果电机一转就反了。后来我加了一组正反脉冲对比:在初步判定方向 ±180° 各打一个脉冲,电流大的那个才是真正的 N 极方向。
完整的判定流程可以总结为:
- 第一步:粗定位,找电流峰值最大的方向 θrough
- 第二步:精定位,在 θrough 附近 ±30° 范围内加密脉冲,找到更精确的角度
- 第三步:极性判别,在 θrough 和 θrough+180° 各打一个脉冲,电流大的为 N 极
4.4 参数选择经验
参数怎么选?我直接给出一组经过验证的参考值。这些值来自我做过的一个 400W 伺服电机项目。
| 参数 | 推荐范围 | 我的常用值 | 说明 |
|---|---|---|---|
| 脉冲电压 | 0.3 ~ 0.5 × Vbus | 0.4 × Vbus | 电压太低信噪比差,太高容易过流 |
| 脉冲宽度 | 50 ~ 200 μs | 100 μs | 取决于电机电感量,L 大的可适当加宽 |
| 注入方向数 | 6 ~ 12 | 6 | 方向越多精度越高,但耗时也长 |
| 脉冲间隔 | ≥ 500 μs | 1 ms | 确保电流完全衰减到零 |
小技巧:
如果你用的 MCU 有双采样功能,可以在脉冲上升沿和下降沿各采一次电流,做差分处理。这样能有效抵消 ADC 偏置和温漂,数据更干净。
4.5 脉冲注入法的整体流程
下面这张图是我自己画的一个流程图,把整个脉冲注入标定的逻辑串起来了。你看一眼就能明白。
4.6 代码实现示例
下面给出一段伪代码,你移植到具体 MCU 时只需要改一下 ADC 和 PWM 的底层接口。
// 脉冲注入法离线标定
#define PULSE_VOLTAGE 0.4f // 0.4倍母线电压
#define PULSE_WIDTH_US 100 // 100μs
#define NUM_DIRECTIONS 6 // 6个方向
float current_peaks[NUM_DIRECTIONS];
float angles[NUM_DIRECTIONS] = {0, 60, 120, 180, 240, 300};
void pulse_injection_calibration(void)
{
uint8_t i;
float max_current = 0;
uint8_t max_idx = 0;
// 步骤1: 遍历所有方向
for(i = 0; i < NUM_DIRECTIONS; i++)
{
// 设置SVPWM输出方向
set_svpwm_angle(angles[i]);
// 施加高压脉冲
set_pwm_duty(PULSE_VOLTAGE);
delay_us(PULSE_WIDTH_US);
// 采样电流(脉冲结束时刻)
current_peaks[i] = adc_sample_current();
// 关断PWM,等待电流衰减
set_pwm_duty(0);
delay_us(1000);
// 记录最大值
if(current_peaks[i] > max_current)
{
max_current = current_peaks[i];
max_idx = i;
}
}
// 步骤2: 粗定位角度
float theta_rough = angles[max_idx];
// 步骤3: 极性判别
set_svpwm_angle(theta_rough);
set_pwm_duty(PULSE_VOLTAGE);
delay_us(PULSE_WIDTH_US);
float i_pos = adc_sample_current();
set_pwm_duty(0);
delay_us(1000);
set_svpwm_angle(theta_rough + 180);
set_pwm_duty(PULSE_VOLTAGE);
delay_us(PULSE_WIDTH_US);
float i_neg = adc_sample_current();
set_pwm_duty(0);
// 电流大的为N极
if(i_pos > i_neg)
motor_theta = theta_rough;
else
motor_theta = theta_rough + 180;
// 保存标定结果
save_calibration_result(motor_theta);
}
4.7 脉冲注入法的优缺点
最后总结一下这个方法的特点。我个人的使用感受是:
| 优点 | 缺点 |
|---|---|
| 电机静止即可标定,无需旋转 | 需要额外的极性判别步骤 |
| 实现简单,代码量小 | 对 ADC 采样精度要求较高 |
| 不受电机转速影响 | 脉冲会产生 audible noise(可闻噪声) |
| 适合批量产线快速标定 | 电感饱和效应弱的电机可能测不准 |
经验之谈:
如果你发现电流峰值差异很小(比如不到 10%),可以试试加大脉冲电压到 0.5×Vbus,或者把脉宽延长到 150μs。但一定要监控母线电流,别触发硬件过流保护。
脉冲注入法是我在量产项目中用得最多的离线标定方法。它可靠、简单,而且调试起来很直观。你只要用示波器抓一下电流波形,就能看到不同方向下的电流上升速度差异,心里就有底了。