4、转子位置与速度检测:霍尔传感器原理与安装、增量式编码器接口电路、SPI绝对值编码器读取、零位校准与对齐

做PMSM控制,说白了,最核心的一件事就是——你得知道转子在哪儿。

不知道位置,你就没法换相,更别提什么FOC了。我刚开始做电机驱动那会儿,就吃过这个亏。以为随便接个编码器就能转,结果电机抖得像筛糠,还嗡嗡响。后来才明白,位置检测是整个控制系统的眼睛,眼睛瞎了,再好的算法也白搭。

这一章,咱们就把几种常用的位置检测手段掰开揉碎了讲清楚。

4.1 霍尔传感器:便宜但够用

霍尔传感器,成本低,原理简单。很多无刷直流电机(BLDC)和低成本的PMSM都在用。

原理是什么?

霍尔元件能感应磁场。转子上的永磁体转过来,磁场变化,霍尔就输出高低电平。三个霍尔(一般间隔120°电角度),就能拼出6个状态,对应6个扇区。

我个人的习惯是,在调试初期,先用霍尔把电机转起来。虽然精度不高,但胜在可靠,不容易出幺蛾子。

关键点:霍尔只能提供60°电角度的分辨率。想用它做FOC?不够。但做方波控制(六步换向)绰绰有余。

安装注意事项

霍尔安装的位置,直接决定了你读到的角度对不对。我见过有人把霍尔焊歪了,结果电机正转和反转的换相时序完全不对称。

  • 机械对齐:霍尔传感器必须与定子绕组轴线对齐。通常霍尔板上有定位孔,别偷懒,对准了再焊。
  • 电气对齐:安装好后,用手转动转子,用示波器看三路霍尔波形。理想情况是占空比50%,相位互差120°。如果波形不对称,检查安装角度。
  • 磁钢强度:霍尔对磁场强度有要求。磁钢太弱,霍尔可能检测不到边沿。我曾经遇到过一批电机,磁钢充磁不均匀,导致霍尔信号抖动,最后换了更高灵敏度的霍尔才解决。

警告:霍尔信号在电机高速旋转时,容易受干扰。布线时,霍尔信号线要远离功率线,最好加屏蔽。否则你会看到毛刺,然后换相错乱,电机直接卡死。

4.2 增量式编码器:精度与成本的平衡点

增量式编码器,是工业伺服里用得最多的。它输出A、B、Z三路信号。A和B相位差90°,用来判断方向和计数。Z信号每转一圈输出一个脉冲,用来做零位参考。

接口电路设计

编码器输出信号,一般是差分信号(RS-422)或者单端信号(推挽或集电极开路)。

我个人强烈建议用差分信号。为什么?抗干扰能力强。电机驱动器里,IGBT开关会产生巨大的共模干扰,单端信号很容易被淹没。

典型的接口电路是这样的:

// 差分信号接收(以AM26LS32为例)
// A+ 和 A- 接芯片输入,输出为单端A信号
// B+ 和 B- 接芯片输入,输出为单端B信号
// Z+ 和 Z- 接芯片输入,输出为单端Z信号

// 然后进入MCU的定时器捕获引脚
// 配置为编码器模式,自动计数

嗯,这里要注意。MCU的编码器接口模式,通常支持4倍频。也就是说,如果编码器是2500线,4倍频后就是10000个脉冲每圈。分辨率够用了吧?

小技巧:Z信号一定要接。很多新手觉得Z信号没用,结果每次上电都不知道转子在哪儿,还得手动找零。Z信号就是你的“回家”信号,每次上电后,让电机转一圈,找到Z脉冲,位置就确定了。

避坑指南

我曾经遇到过一个问题:电机高速旋转时,编码器读数突然跳变。查了半天,发现是编码器线缆太长,信号衰减严重。后来加了差分接收器,并在终端并联了120Ω匹配电阻,问题解决。

你想想看,编码器信号频率 = 转速 × 线数 / 60。如果电机6000rpm,编码器2500线,频率就是250kHz。这么高的频率,线缆超过10米,不加终端匹配,信号反射就会导致误码。

4.3 SPI绝对值编码器:一劳永逸的选择

绝对值编码器,上电就知道位置,不需要找零。SPI接口的绝对值编码器,在高端伺服里越来越常见。

读取流程

SPI读取绝对值编码器,一般分两步:

  1. 发送命令:MCU向编码器发送读命令(比如0x3FFF,具体看芯片手册)。
  2. 接收数据:编码器返回位置数据,通常是16位或18位。

代码示例(伪代码):

uint16_t ReadAbsoluteEncoder(void)
{
    uint16_t position = 0;
    // 片选拉低
    HAL_GPIO_WritePin(ENC_CS_GPIO_Port, ENC_CS_Pin, GPIO_PIN_RESET);
    // 发送读命令,同时接收数据
    HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)&cmd, (uint8_t*)&position, 2, HAL_MAX_DELAY);
    // 片选拉高
    HAL_GPIO_WritePin(ENC_CS_GPIO_Port, ENC_CS_Pin, GPIO_PIN_SET);
    // 解析数据,去掉状态位等
    return position & 0x3FFF; // 假设14位分辨率
}

这里有个坑:SPI通信速率不能太高。绝对值编码器内部有光耦隔离,速率太高容易出错。我一般用1MHz到5MHz,稳妥。

重要:绝对值编码器也有多圈和单圈之分。单圈的,转一圈后位置归零。多圈的,可以记录转了多少圈。如果你的应用需要做连续旋转(比如机器人关节),必须用多圈绝对值编码器。

4.4 零位校准与对齐:成败在此一举

不管你用哪种传感器,最后一步都是零位校准。说白了,就是让传感器的0°和电机的0°(即反电动势过零点)对齐。

为什么必须对齐?

PMSM的FOC控制,需要知道转子磁极的精确位置。如果传感器零位和电机零位差了几度,电流矢量就会偏,转矩输出就不对。严重时,电机发热、抖动、甚至失步。

校准方法

我常用的方法有两种:

  • 直流注入法:给电机通一个固定的直流电流(比如U相正,V相负),转子会被拉到某个固定位置。此时记录传感器的读数,这个读数就是零位偏移量。
  • 反电动势法:用外力拖动电机旋转,用示波器看反电动势过零点,同时记录传感器的读数。两者对比,就能算出偏移。

我个人更推荐直流注入法,简单粗暴,不需要额外设备。

校准代码逻辑:

// 1. 给U相通正电流,V相通负电流,W相悬空
// 2. 等待转子稳定(约500ms)
// 3. 读取传感器位置值,记为offset
// 4. 以后每次读取传感器后,实际角度 = 读取值 - offset

注意:直流注入法给的电流不能太大,否则会烧电机。我一般给额定电流的10%~20%,够用就行。另外,注入时间不要太长,转子稳定后就立刻停止,防止过热。

嗯,零位校准这件事,看似简单,但很多人栽在这里。我曾经有一台样机,怎么调都抖,最后发现是零位偏移量算错了符号。正负搞反,电流矢量方向完全反了,电机当然不听话。

所以,校准完成后,一定要验证。怎么验证?给一个小的q轴电流,看电机能不能平稳转动。如果转起来有卡顿或者异响,八成是零位没对齐。

好了,这一章的内容就这些。位置检测是PMSM控制的地基,地基不稳,楼盖得再高也得塌。下一章,咱们聊聊电流采样和调理电路,那又是另一个容易踩坑的地方。