4、UVW编码器换相:信号、位置与角度计算
UVW编码器,说白了就是三个霍尔传感器。它不像绝对式编码器那样能告诉你精确的机械角度,但它能告诉你——电机转子现在在哪个扇区。这对无刷电机的方波控制来说,已经够用了。
我刚开始做电机驱动时,总觉得UVW信号很简单。三个信号,高低电平,一共6种组合,对应6个扇区,对吧?对,但真正上电机一转,问题就来了——信号和磁极对怎么对应?初始位置怎么测?换相角度怎么算?
这一章,咱们就把这三个问题彻底讲清楚。
4.1 UVW信号与电机磁极对的关系
先看一个基本事实:UVW编码器的三个信号,每个信号都是120°电角度的方波。三个信号组合起来,把360°电角度分成6个扇区,每个扇区60°。
但这里有个坑——电机有磁极对数。如果电机是4对极,机械转一圈,电角度转4圈。UVW信号也跟着重复4次。
我遇到过一位同事,调试时发现换相角度总是不对。查了半天,原来是磁极对数设成了1,实际电机是4对极。你想想看,角度差了4倍,电机能转才怪。
核心关系:
- UVW信号周期 = 360° 电角度
- 机械角度 = 电角度 / 磁极对数
- 6个扇区 = 6 × 60° 电角度
举个例子。一个4对极电机,UVW信号变化一次,转子实际只转了360°/4 = 90°机械角度。所以,用UVW做换相,必须知道磁极对数,否则算出来的角度全是错的。
| 磁极对数 | 电角度一圈 | 机械角度一圈 | UVW重复次数/机械圈 |
|---|---|---|---|
| 1 | 360° | 360° | 1 |
| 2 | 360° | 180° | 2 |
| 4 | 360° | 90° | 4 |
| 8 | 360° | 45° | 8 |
4.2 UVW初始位置检测
电机上电时,转子在什么位置?UVW编码器能直接告诉你吗?能,但只能告诉你它在哪个扇区,不能告诉你精确角度。
初始位置检测,其实就是读UVW三个引脚的电平,然后查表得到扇区号。
我的习惯做法:
上电后先读一次UVW,确认电平稳定。如果信号抖动,加个10ms的软件滤波。我曾经遇到过电机刚上电时UVW信号乱跳的情况,后来发现是电源还没稳定。加了个50ms延时再读,问题就解决了。
UVW信号与扇区的对应关系,一般是这样的:
| U | V | W | 扇区 | 电角度范围 |
|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 0° ~ 60° |
| 1 | 0 | 0 | 2 | 60° ~ 120° |
| 1 | 1 | 0 | 3 | 120° ~ 180° |
| 0 | 1 | 0 | 4 | 180° ~ 240° |
| 0 | 1 | 1 | 5 | 240° ~ 300° |
| 0 | 0 | 1 | 6 | 300° ~ 360° |
注意: 不同厂家的编码器,UVW信号与扇区的对应关系可能不同。一定要看数据手册,或者自己用示波器实测确认。我曾经吃过这个亏,照着别人的代码抄,结果电机反转。
4.3 换相角度计算
有了扇区,怎么算换相角度?
方波控制下,换相角度其实不需要精确值,只需要知道当前扇区,然后查表得到该扇区对应的导通相序就行。
但如果你要做正弦波控制或FOC,就需要一个连续的角度值。这时候,UVW只能提供初始扇区,角度需要靠速度积分来推算。
具体做法是这样的:
- 上电时,读UVW,得到初始扇区,取扇区中间值作为初始角度(比如扇区1取30°)
- 电机转动后,每次UVW信号变化,说明转子进入了下一个扇区,把角度更新为当前扇区的中间值
- 在两个扇区之间,用速度积分来插值
我一般这样写代码:
// 扇区中间角度表
const float sector_center_angle[6] = {
30.0f, // 扇区1: 0~60°
90.0f, // 扇区2: 60~120°
150.0f, // 扇区3: 120~180°
210.0f, // 扇区4: 180~240°
270.0f, // 扇区5: 240~300°
330.0f // 扇区6: 300~360°
};
// 当前电角度
float electrical_angle = 0.0f;
// UVW中断或定时读取
void uvw_update(uint8_t u, uint8_t v, uint8_t w) {
uint8_t sector = get_sector_from_uvw(u, v, w);
if (sector != last_sector) {
// 扇区变化,更新角度
electrical_angle = sector_center_angle[sector - 1];
last_sector = sector;
} else {
// 扇区不变,用速度积分
electrical_angle += speed * dt;
if (electrical_angle >= 360.0f) electrical_angle -= 360.0f;
if (electrical_angle < 0.0f) electrical_angle += 360.0f;
}
}
避坑指南: 我曾经在高速运行时发现角度积分误差越来越大,换相点越来越偏。后来加了扇区过零校正——每次UVW信号变化时,强制把角度修正到扇区中心值。这样误差就不会累积了。
4.4 知识体系总览
下面这张图,把UVW换相的核心逻辑串起来了。从信号输入到角度输出,每一步都离不开。
4.5 调试要点总结
最后,把我这些年调试UVW编码器踩过的坑,总结成几条:
- 磁极对数必须配准 —— 这是最容易犯的错。配错了,角度全乱。
- 上电先读扇区 —— 别急着转,先确认UVW信号稳定。
- 扇区过零校正不能省 —— 高速时角度积分会漂,必须靠扇区边沿拉回来。
- 示波器是好朋友 —— 把UVW三路信号和相电流一起抓,一眼就能看出换相点对不对。