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的核心战场。