3、ABZ编码器与换相:ABZ信号时序图、Z信号零点校准、结合霍尔传感器的换相策略
编码器这东西,说白了就是电机的「眼睛」。没有它,你的FOC算法再漂亮也是盲人摸象。ABZ编码器是工业界最常见的增量式编码器,三根信号线——A、B、Z——就能告诉你位置、方向和零点。今天咱们就把这三根线彻底聊透。
3.1 ABZ信号时序图:从波形看懂一切
先看最基础的。A和B两路信号,相位差正好90°电角度。我习惯叫它们「正交信号」。为什么叫正交?你想想看,一个周期内A的上升沿和B的上升沿永远差四分之一个周期,这就是正交。
核心判断逻辑:
- A超前B 90° → 电机正转
- B超前A 90° → 电机反转
- 每个边沿(上升或下降)都代表一个位置增量
实际项目中,我见过不少新手只检测上升沿。这其实浪费了精度。A和B各有上升沿和下降沿,一共4个边沿。如果你四个边沿都检测,分辨率直接翻4倍。这叫「四倍频技术」。举个例子,编码器物理线数是1024,四倍频后就是4096个脉冲每圈。
Z信号就简单了——每转一圈,输出一个脉冲。它不依赖A和B,是独立的。Z脉冲的宽度通常只有1个A周期那么宽,位置固定在一个特定的机械角度上。
我的经验:调试时先用示波器同时抓A、B、Z三路波形。看Z脉冲是否出现在A和B的特定相位上。如果Z脉冲宽度太窄,MCU可能漏采。我遇到过一款编码器,Z脉冲只有0.5个A周期宽,最后不得不改用边沿触发中断。
3.2 Z信号零点校准:让电机知道「我在哪」
增量式编码器有个天生的毛病——断电后位置丢失。你上电时不知道转子在哪儿。Z信号就是用来解决这个问题的。每转一圈,Z脉冲告诉你「这是机械零点」。但问题来了:这个零点是你想要的电角度零点吗?
不一定。
电机换相需要的是电角度零点,不是机械零点。机械零点和电角度零点之间,通常差一个固定的偏移量。这个偏移量怎么找?我一般这么做:
- 手动对齐法:给电机UV两相通直流电,让转子锁到一个已知电角度(比如0°)。然后转动编码器,找到Z脉冲的位置。记录下这个位置和电角度的差值。
- 自动校准法:让电机开环转一圈,同时记录Z脉冲触发时的电角度值。多转几圈取平均,得到偏移量。
注意:Z信号校准必须在电机安装完成后做一次。换电机或换编码器后必须重新校准。我曾经因为偷懒没重做校准,结果电机低速时抖得像筛子,查了两天才发现是零点偏移了15°电角度。
校准完成后,把偏移量存到EEPROM或Flash里。每次上电后,先找Z脉冲,然后加上偏移量,就能得到真实的电角度零点。
3.3 结合霍尔传感器的换相策略:双保险方案
ABZ编码器精度高,但有个致命弱点——上电时不知道位置。你得先转起来才能找到Z脉冲。可问题是,不换相怎么转?这就成了「先有鸡还是先有蛋」的困局。
霍尔传感器就是来解这个套的。三个霍尔元件(H1、H2、H3)相隔120°安装,上电就能给出一个6步的状态码,告诉你转子大概在哪个60°扇区。精度虽然只有60°电角度,但足够让电机启动。
我的做法是「霍尔启动 + 编码器运行」:
| 阶段 | 使用传感器 | 控制方式 | 说明 |
|---|---|---|---|
| 上电启动 | 霍尔 | 六步换相 | 霍尔给出初始扇区,电机开始转动 |
| 低速运行 | 霍尔 + 编码器 | 混合模式 | 霍尔做粗定位,编码器做细插补 |
| 找到Z脉冲后 | 编码器 | FOC矢量控制 | 切换到编码器全精度位置反馈 |
| 正常运行 | 编码器 | FOC矢量控制 | 霍尔可关闭或做冗余备份 |
你看,霍尔只负责「把车开动」,编码器负责「精准导航」。两者配合,既解决了启动问题,又保证了运行精度。
避坑指南:霍尔信号和编码器信号之间可能有相位差。我建议在代码里做一个「霍尔到编码器」的平滑过渡。具体做法是:在找到Z脉冲之前,用霍尔信号估算位置;找到Z脉冲后,用编码器位置覆盖霍尔估算值。过渡时加一个低通滤波器,避免位置跳变导致电流冲击。
3.4 换相时序图:一张图看懂全部
下面这张SVG图,把ABZ编码器、霍尔传感器和换相策略的关系画清楚了。我画图时习惯把时序和逻辑放在一起,这样调试时一眼就能找到问题。
这张图把整个换相策略串起来了。你从上电开始,霍尔先上,电机转起来,然后一边转一边等Z脉冲。Z脉冲一到,立刻切换到编码器全精度模式。整个过程不需要停机,不需要手动干预。
3.5 实际调试中的几个坑
说了这么多理论,最后分享几个我踩过的坑:
- Z脉冲抖动:有些编码器的Z脉冲在高速时会有抖动。我遇到过Z脉冲在临界点来回跳的情况。解决办法是加一个「去抖计数器」——连续检测到两次Z脉冲才确认。
- 霍尔信号毛刺:霍尔传感器是磁敏元件,容易受外部磁场干扰。我建议在霍尔信号线上加RC滤波,时间常数选1~10μs。
- 编码器线数匹配:编码器线数不是越高越好。线数太高,MCU的中断频率可能跟不上。我一般根据电机最高转速和MCU性能来选。比如3000rpm的电机,用1024线的编码器,四倍频后每秒产生约200k个脉冲,大部分MCU都能处理。
最后提醒:ABZ编码器的A、B、Z三根信号线,布线时一定要远离功率线。我见过一个案例,编码器线和电机线绑在一起走,结果编码器信号被耦合的噪声干扰得面目全非。后来加了屏蔽层和磁环才解决。