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只能提供初始扇区,角度需要靠速度积分来推算。

具体做法是这样的:

  1. 上电时,读UVW,得到初始扇区,取扇区中间值作为初始角度(比如扇区1取30°)
  2. 电机转动后,每次UVW信号变化,说明转子进入了下一个扇区,把角度更新为当前扇区的中间值
  3. 在两个扇区之间,用速度积分来插值

我一般这样写代码:

// 扇区中间角度表
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换相的核心逻辑串起来了。从信号输入到角度输出,每一步都离不开。

UVW编码器换相知识体系 UVW三相信号输入 信号滤波 + 扇区查表 磁极对数换算 → 机械角度 / 电角度 方波控制:直接查换相表 FOC:角度积分 PWM换相输出 关键:扇区过零校正 + 磁极对数配置 → 角度误差不累积

4.5 调试要点总结

最后,把我这些年调试UVW编码器踩过的坑,总结成几条:

  • 磁极对数必须配准 —— 这是最容易犯的错。配错了,角度全乱。
  • 上电先读扇区 —— 别急着转,先确认UVW信号稳定。
  • 扇区过零校正不能省 —— 高速时角度积分会漂,必须靠扇区边沿拉回来。
  • 示波器是好朋友 —— 把UVW三路信号和相电流一起抓,一眼就能看出换相点对不对。