4、编码器与位置传感器:增量式编码器原理、绝对式编码器(SPI/SSI)读取、霍尔传感器换相逻辑、MT6701磁编码器驱动

做FOC控制,位置反馈是命根子。没有准确的位置信息,电流环和速度环就是瞎指挥。我见过不少新手,花大价钱买了电机和驱动板,结果死在编码器选型和调试上。今天咱们就把这几种常用的位置传感器掰开揉碎了讲清楚。

4.1 增量式编码器原理

增量式编码器,说白了就是只告诉你「动了多少」,不告诉你「在哪儿」。它输出两路正交的方波信号——A相和B相。电机每转一圈,还会输出一个Z相脉冲,用来校准零点。

核心原理:码盘上刻着明暗相间的条纹,光耦透过条纹产生脉冲。A相和B相相差90度电角度,通过判断谁先跳变,就能知道正反转。

关键参数

  • 分辨率:比如2500线,意思是电机转一圈产生2500个A相脉冲。经过4倍频后,一圈就是10000个计数。
  • 最大转速:受限于编码器的电气响应频率。比如100kHz的响应频率,配2500线的编码器,理论最大转速就是100000/2500*60 = 2400rpm。

我在项目中遇到过一个问题:电机低速运行时,编码器信号抖动特别厉害。后来发现是码盘和光耦之间有灰尘,清洁后就好了。嗯,环境适应性是增量式编码器的软肋。

避坑指南:我曾经在调试高速电机时,发现位置反馈突然丢失。查了半天,原来是编码器线缆太长,信号衰减严重。建议超过3米就用差分输出(RS422)的编码器,抗干扰能力强很多。

4.2 绝对式编码器(SPI/SSI)读取

绝对式编码器就高级多了。上电就知道当前绝对位置,不需要找零点。它通过SPI或SSI协议输出位置数据,通常是二进制或格雷码。

SPI模式:标准的4线制(CS、SCLK、MISO、MOSI)。主设备发时钟,从设备在MISO上返回位置数据。我习惯用STM32的硬件SPI,配置成Mode 0或Mode 3,具体看编码器手册。

SSI模式:这是工业上常用的同步串行接口。它只有3根线(CLK、DATA、CS)。主设备发一串时钟脉冲,从设备在时钟下降沿输出数据位。SSI的时序要求比较严格,时钟频率通常不超过5MHz。

我的经验:读取绝对式编码器时,一定要做数据校验。很多编码器会在数据末尾附加CRC校验位。我曾经偷懒没做校验,结果偶尔读到错误位置,电机突然抖动一下。加了校验后,问题彻底解决。

代码示例(STM32 HAL库,SPI读取绝对式编码器):

uint32_t ReadAbsoluteEncoder(void)
{
    uint8_t tx_data[4] = {0x00, 0x00, 0x00, 0x00};
    uint8_t rx_data[4] = {0x00, 0x00, 0x00, 0x00};
    uint32_t position = 0;

    HAL_GPIO_WritePin(ENC_CS_GPIO_Port, ENC_CS_Pin, GPIO_PIN_RESET);
    HAL_Delay(1);  // 有些编码器需要CS拉低后等待一段时间

    HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 4, 100);

    HAL_GPIO_WritePin(ENC_CS_GPIO_Port, ENC_CS_Pin, GPIO_PIN_SET);

    // 假设编码器返回24位数据,高8位是状态,低16位是位置
    position = ((uint32_t)rx_data[1] << 16) | ((uint32_t)rx_data[2] << 8) | rx_data[3];
    return position;
}

4.3 霍尔传感器换相逻辑

霍尔传感器是方波控制(BLDC)的标配,但在FOC里也能用。三个霍尔元件间隔120度安装,输出三路高低电平信号。通过这3位二进制数,就能知道转子在哪个扇区。

换相表

霍尔状态(H3 H2 H1) 扇区 导通相
101 1 A+ B-
100 2 A+ C-
110 3 B+ C-
010 4 B+ A-
011 5 C+ A-
001 6 C+ B-

你想想看,霍尔信号每60度电角度变化一次。在FOC里,我们可以用霍尔信号做初始位置检测,然后切换到无传感器算法。我做过一个项目,用霍尔信号做启动,到一定转速后切到观测器,效果还不错。

注意:霍尔传感器安装有偏差,会导致换相点不准。我曾经遇到过电机启动时抖动,后来用示波器量了霍尔信号的上升沿和下降沿,发现不对称。解决办法是在软件里做补偿,或者用带自动校准功能的霍尔芯片。

4.4 MT6701磁编码器驱动

MT6701是国产的磁编码器芯片,性价比很高。它基于霍尔效应,检测磁场角度变化。输出方式支持SPI、SSI、PWM和模拟电压。我比较喜欢用SPI模式,速度快,精度高。

关键特性

  • 分辨率:14位(0.022度)
  • 最大转速:30000rpm
  • 工作温度:-40°C ~ 125°C
  • 输出延迟:小于2us

驱动MT6701其实很简单。上电后,芯片会自动测量磁场角度。通过SPI读取16位数据,其中高14位是角度值,低2位是状态位。

我的习惯:读取MT6701时,我会连续读两次,比较结果是否一致。如果两次读数相差超过1个LSB,就认为数据不可靠,重新读取。这招在电机振动大的场合特别管用。

代码示例(读取MT6701角度):

uint16_t ReadMT6701Angle(void)
{
    uint8_t tx_data[2] = {0x00, 0x00};
    uint8_t rx_data[2] = {0x00, 0x00};
    uint16_t raw_data = 0;
    uint16_t angle = 0;

    HAL_GPIO_WritePin(MT6701_CS_GPIO_Port, MT6701_CS_Pin, GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi2, tx_data, rx_data, 2, 100);
    HAL_GPIO_WritePin(MT6701_CS_GPIO_Port, MT6701_CS_Pin, GPIO_PIN_SET);

    raw_data = ((uint16_t)rx_data[0] << 8) | rx_data[1];
    angle = (raw_data >> 2) & 0x3FFF;  // 取高14位

    return angle;
}

为什么推荐MT6701?说白了,它便宜又好用。以前用进口的磁编码器,一颗要几十块。MT6701只要几块钱,性能还够用。我在一个低成本伺服项目里用了它,量产几千台,没出过问题。

总结一下

  • 增量式编码器:适合中低速、环境干净的场合,成本低
  • 绝对式编码器:适合高速、高精度、需要上电即知位置的场合
  • 霍尔传感器:适合方波控制或FOC的初始位置检测
  • MT6701磁编码器:性价比之选,适合大多数FOC应用

选哪种传感器,取决于你的项目需求。我个人建议,如果预算允许,优先用绝对式磁编码器。省心,少踩坑。好了,这一章就到这儿。下一章咱们聊聊电流采样和PWM发波,那才是FOC的核心战场。