4. 离线校准方法:脉冲注入法
脉冲注入法,说白了就是给电机定子绕组打一组短时电压脉冲,通过观察电流响应来反推转子位置。这个方法不需要编码器,也不需要电机转动,非常适合做离线初始位置校准。
我记得刚入行那会儿,总觉得这方法有点「土」。后来在项目里吃过亏才明白——简单的方法往往最可靠。脉冲注入法在工业伺服和机器人关节驱动里用得非常多,因为它对硬件要求低,实现起来也直接。
4.1 基本原理
先想一个问题:为什么脉冲能测出转子位置?
关键在于磁路的饱和效应。转子永磁体在定子铁芯里会产生一个偏置磁场。当你往某个方向打电压脉冲时,如果这个方向刚好和转子磁极方向一致,磁路就会更饱和,电感会变小,电流上升得就快。反过来,如果方向不对,电感大,电流上升就慢。
所以,我们只需要在不同方向上打脉冲,测电流响应,找到电流上升最快的那个方向——那就是转子N极的方向。
核心逻辑: 脉冲方向 → 磁路饱和程度 → 电感差异 → 电流响应差异 → 转子位置
我习惯把这个过程拆成三步:
- 选择脉冲方向——通常等间隔取6个或12个方向
- 施加短时脉冲——脉宽一般几十到几百微秒
- 采样电流峰值——比较哪个方向电流最大
你想想看,这其实就是一个开环的扫查过程。不需要复杂的观测器,也不需要高频注入,纯粹靠物理特性说话。
4.2 脉冲序列设计
脉冲序列怎么设计?这里有几个关键参数需要权衡。
| 参数 | 作用 | 典型值 |
|---|---|---|
| 脉冲幅值 | 决定电流响应幅度 | 10%~30% 额定电压 |
| 脉冲宽度 | 决定电流建立时间 | 50μs ~ 500μs |
| 脉冲间隔 | 保证电流回零 | ≥ 5倍电气时间常数 |
| 方向数量 | 决定角度分辨率 | 6 ~ 24 个 |
这里我要重点说说脉冲宽度。宽度太短,电流还没建立起来就被切断了,采样信噪比很差。宽度太长,转子可能会被拖动,产生机械位移——这在带负载的场合尤其危险。
注意: 我曾经在一个机器人关节项目里,因为脉冲宽度设到了1ms,结果电机在每次校准时都会「抖」一下。虽然角度测准了,但机械结构受不了。后来把脉宽压到200μs,问题就解决了。
4.3 不同脉冲宽度的优劣对比
我做过一组对比实验,用同一个电机、同一个负载条件,只改变脉冲宽度,看看效果差异。
| 脉冲宽度 | 电流信噪比 | 转子位移风险 | 角度精度 | 适用场景 |
|---|---|---|---|---|
| 50μs | 低 | 无 | ±15° | 高速电机、小电感 |
| 100μs | 中 | 极低 | ±8° | 通用伺服 |
| 200μs | 高 | 低 | ±5° | 工业机器人 |
| 500μs | 很高 | 中 | ±3° | 大电感、低转速 |
| 1ms | 极高 | 高 | ±2° | 不推荐 |
从表里能看出来,脉宽和精度基本成正比,但代价是转子位移风险也在增加。我个人习惯选200μs作为默认值——精度够用,风险可控。
为什么会这样?因为200μs这个量级,对于大多数中小功率伺服电机来说,电流刚好能建立到可测范围,但转子惯性还来不及响应。说白了,就是「电快、机慢」的时间窗口。
4.4 实现流程
下面是我在实际项目中用过的脉冲注入流程,你可以直接参考。
// 伪代码:脉冲注入法校准
#define PULSE_WIDTH_US 200
#define PULSE_INTERVAL_US 5000
#define NUM_DIRECTIONS 12
float current_peak[NUM_DIRECTIONS];
float angle_step = 360.0f / NUM_DIRECTIONS;
for (int i = 0; i < NUM_DIRECTIONS; i++) {
// 1. 设置电压矢量方向
set_voltage_vector(i * angle_step, V_PULSE);
// 2. 等待电流建立
delay_us(PULSE_WIDTH_US);
// 3. 采样相电流峰值
current_peak[i] = sample_peak_current();
// 4. 关断脉冲,等待电流回零
set_voltage_vector(0, 0);
delay_us(PULSE_INTERVAL_US);
}
// 5. 找电流最大的方向
int max_idx = argmax(current_peak, NUM_DIRECTIONS);
float rotor_angle = max_idx * angle_step;
// 6. 补偿180°模糊(N/S极判断)
// 在最大方向和对侧方向各打一次长脉冲
float diff = check_ns_polarity(rotor_angle);
if (diff < 0) rotor_angle += 180.0f;
经验之谈: 代码里第6步的N/S极判断很多人会忽略。实际上,脉冲注入法只能找到磁极轴线方向,但分不清是N还是S。我习惯在找到方向后,再打一个稍长的脉冲(比如500μs),看电流是否出现二次饱和——如果出现,说明方向正确;否则就是反的。
4.5 脉冲注入法知识体系
下面这张图把脉冲注入法的核心逻辑串起来了,你可以对照着理解。
4.6 避坑指南
最后,我把自己踩过的坑整理一下,希望能帮你少走弯路。
- 脉冲间隔不够——我曾经连续打脉冲没留够间隔,结果电流还没回零就开始下一次采样,数据全乱了。建议间隔至少5倍电气时间常数。
- 忽略死区时间——MOS管的死区时间会影响实际脉冲宽度。我习惯在代码里补偿死区,或者干脆把脉宽设得比死区大一个数量级。
- 采样时机不对——电流峰值不一定在脉冲结束时刻。我建议在脉冲中间段采样,避开开通和关断的振荡区。
- 方向数量太少——6个方向只能分辨±30°,对于高精度应用不够。我一般用12个方向,精度能到±5°以内。
一句话总结: 脉冲注入法,就是用短时脉冲「探」出转子位置。脉宽选200μs,方向取12个,信噪比和安全性都能兼顾。这个方法虽然简单,但用好了非常可靠——我在三个量产项目里都用它做初始校准,从来没出过问题。