4、偏差检测方法:示波器观测法、软件锁相环检测法、反电动势过零检测法
偏差检测,说白了就是找到换相点和真实转子位置之间的那个「时间差」。这个差找不准,后面所有校正都是瞎忙活。我这些年用过的方法不少,但真正在工程上站得住脚的,也就下面这三种。
核心观点:没有万能的方法。低速用反电动势过零,中高速用锁相环,调试阶段用示波器。选对方法,项目就成功了一半。
4.1 示波器观测法——最直观,也最「笨」
这个方法,我建议每个工程师都亲手做一次。为什么?因为你能亲眼看到偏差长什么样。
操作步骤其实很简单:
- 把电机拖到一个稳定转速,比如 1000 RPM。
- 用示波器两个通道,一个测霍尔信号(或者编码器 Z 信号),一个测相电流。
- 观察霍尔边沿和电流过零点之间的时间差。
嗯,这里要注意:示波器探头的地线要夹好,我见过有人因为地线没夹,看到了一堆莫名其妙的噪声,折腾了半天。
我的小技巧:把示波器时基调到 1ms/div 左右,触发模式设成「正常」,触发源选霍尔信号。这样每次都能稳定抓到换相边沿。
我曾经在一个水泵项目里,用这个方法发现霍尔安装偏差了 12° 电角度。当时软件怎么调都调不好,示波器一上去,问题一目了然。你说示波器笨不笨?笨,但管用。
4.2 软件锁相环检测法——动态跟踪,精度高
示波器只能看静态偏差,电机一转起来,偏差是会变的。这时候就得请出锁相环了。
软件锁相环的核心思想,说白了就是造一个「虚拟的换相信号」,然后拿它和真实的霍尔信号比相位差。
我常用的结构是这样的:
// 锁相环核心结构(伪代码)
typedef struct {
float theta_est; // 估计角度
float omega_est; // 估计转速
float err_integral; // 误差积分项
float Kp, Ki; // PI 参数
} PLL_Struct;
void PLL_Update(PLL_Struct *pll, float theta_hall) {
float err = theta_hall - pll->theta_est;
// 角度差归一化到 [-pi, pi]
err = atan2(sin(err), cos(err));
pll->omega_est += pll->Ki * err;
pll->theta_est += (pll->omega_est + pll->Kp * err) * dt;
}
你看,代码其实不长。但 PI 参数怎么调?我个人的习惯是:先把 Ki 设成 0,只调 Kp,让系统能锁住但不振荡。然后慢慢加 Ki,消除稳态误差。
避坑指南:我曾经在伺服驱动器上把 Ki 调太大,结果锁相环在高速时直接发散,电机啸叫得像要炸了一样。后来学乖了,锁相环的带宽一定要低于电机机械谐振频率,一般设在 20-50 Hz 就够用。
锁相环的好处是能实时输出偏差角度,你可以直接拿这个值去补偿换相。坏处是——它对转速突变反应慢,急加速时会有滞后。
4.3 反电动势过零检测法——无传感器方案的基石
这个方法,其实是从无传感器控制那边借过来的。你想想看,电机转起来之后,反电动势的过零点天然就对应着换相位置。
具体怎么做?
- 在 PWM 关断期间(通常是下管关断、上管 PWM 的区间),采样悬空相的对地电压。
- 这个电压和母线电压的一半做比较,过零时刻就是反电动势过零点。
- 过零点往后延迟 30° 电角度,就是理论换相点。
但这里有个坑:反电动势信号很弱,尤其在低速时。我做过一个风扇项目,300 RPM 以下根本看不到过零点,全是 PWM 开关噪声。
经验数据:反电动势过零检测的可靠工作范围,一般是额定转速的 10% 以上。低于这个值,建议用霍尔或者编码器。
三种方法各有各的脾气,我整理了一张表,方便你对比:
| 检测方法 | 适用场景 | 精度 | 实时性 | 实现难度 |
|---|---|---|---|---|
| 示波器观测法 | 调试、故障排查 | 高(依赖人工) | 离线 | 低 |
| 软件锁相环法 | 中高速稳态运行 | 中高 | 实时 | 中 |
| 反电动势过零法 | 中高速、无传感器 | 中 | 实时 | 中高 |
下面这张图,是我自己画的一个方法选择流程,帮你快速定位该用哪种:
最后说一句:这三种方法不是互斥的。我做过一个项目,调试时用示波器看偏差,跑起来后用锁相环实时跟踪,低速时切到反电动势过零做备份。三种方法互相验证,心里才踏实。