位置检测元件:从增量式编码器到磁编码器

做FOC位置环,说白了就是让电机知道「自己转到哪了」。

我刚开始搞这个的时候,总觉得位置检测不就是读个角度嘛,有啥难的?结果第一次调试,电机抖得像筛糠一样。后来才明白——位置检测的精度和实时性,直接决定了你的闭环能不能稳住。

这一章,咱们就把几种主流的位置检测元件掰开揉碎讲清楚。

增量式编码器:ABZ信号与原理

增量式编码器,我个人习惯叫它「增量码盘」。它不告诉你绝对位置,只告诉你「我动了多少」。

工作原理

码盘上刻着密密麻麻的条纹。光透过条纹,被接收器检测到,就产生脉冲。A相和B相相差90度电角度,用来判断方向。Z相每转一圈出一个脉冲,用来找零点。

我举个例子你就明白了:

  • A相上升沿,B相是高电平 → 正转
  • A相上升沿,B相是低电平 → 反转
  • Z相脉冲 → 一圈的参考点

核心参数:

  • 分辨率:比如2500线,就是一圈2500个脉冲
  • 倍频:4倍频后,2500线变成10000个计数/圈
  • 最大响应频率:决定了你能跑多快

ABZ信号怎么用?

我建议你用定时器的编码器模式。STM32的TIM有专门的编码器接口,硬件自动处理A/B相计数,CPU几乎零开销。

// 以STM32为例,配置TIM3为编码器模式
TIM_EncoderInterfaceConfig(TIM3, TIM_ENCODERMODE_TI12, TIM_ICPOLARITY_RISING, TIM_ICPOLARITY_RISING);
TIM_EncoderInterfaceConfig(TIM3, TIM_ENCODERMODE_TI12, TIM_ICPOLARITY_RISING, TIM_ICPOLARITY_RISING);
// 使能定时器
TIM_Cmd(TIM3, ENABLE);
// 读取位置
int16_t position = TIM_GetCounter(TIM3);

我的经验:Z相一定要接!我有个项目没接Z相,每次上电位置都是随机的,电机直接飞车。后来加了Z相归零,世界清净了。

绝对式编码器:多圈数据与单圈角度

绝对式编码器就高级多了。它一上电就知道自己转了多少度,不需要找零点。

单圈 vs 多圈

  • 单圈绝对式:只能记录0~360度内的位置。断电后位置丢失?不会,它靠机械码盘记住。
  • 多圈绝对式:内部有齿轮或电池,能记录转了多少圈。比如4096圈,每圈4096个位置。

我做过一个机械臂项目,用的就是多圈绝对式编码器。每次上电直接读位置,不用回零,用户体验好很多。

通信协议

绝对式编码器一般走SSI、BiSS、EnDat等协议。我常用SSI,简单可靠:

// SSI读取24位数据示例
uint32_t ReadSSI(void) {
    uint32_t data = 0;
    for(int i=0; i<24; i++) {
        CLK_LOW;
        delay_us(1);
        data = (data << 1) | MISO_READ;
        CLK_HIGH;
        delay_us(1);
    }
    return data;
}

注意:多圈数据有溢出问题。比如4096圈,转超过4096圈后,圈数会回零。我遇到过客户机器连续运行一周,圈数溢出导致位置跳变。解决方案是软件记录圈数,或者用更大范围的多圈编码器。

磁编码器:以AS5048为例

磁编码器是近几年的热门方案。它靠霍尔效应检测磁场角度,没有光学码盘,不怕油污和振动。

AS5048的特点

  • 14位分辨率,即0.022度/步
  • SPI接口,读取速度快
  • 内置自诊断功能
  • 工作温度范围宽

我有个项目在高温高湿环境,光学编码器三天两头坏。换成AS5048后,再也没出过问题。

SPI读取示例

// AS5048 SPI读取角度
uint16_t AS5048_ReadAngle(void) {
    uint16_t raw = 0;
    CS_LOW;
    // 发送0xFFFF读取角度寄存器
    raw = SPI_ReadWrite(0xFFFF);
    CS_HIGH;
    // 解析数据,去掉奇偶校验位
    raw = raw & 0x3FFF;
    // 转换为角度:0~16383对应0~360度
    float angle = (float)raw * 360.0f / 16384.0f;
    return raw;
}

避坑指南:磁编码器对安装距离很敏感。我曾经把磁铁装得太远,角度读数跳来跳去。后来查手册,发现距离要控制在0.5~1.5mm之间。你想想看,0.1mm的偏差就能让精度掉一个档次。

三种编码器对比

类型 优点 缺点 适用场景
增量式 便宜、简单、高速 需回零、怕掉电 普通伺服、步进电机
绝对式 上电即用、精度高 贵、协议复杂 机器人、高端设备
磁编码器 抗污染、体积小 精度有限、对安装敏感 恶劣环境、低成本方案

知识体系图

位置检测元件 增量式编码器 ABZ信号 A/B相差90°判方向 Z相每圈一个脉冲 绝对式编码器 单圈/多圈数据 SSI/BiSS/EnDat协议 上电即用,无需回零 磁编码器 AS5048等 霍尔效应检测磁场 抗污染,体积小 选型关键:精度、成本、环境、接口 FOC位置环要求:至少12位分辨率,1kHz以上更新率

嗯,到这里你应该对三种编码器心里有数了。我个人建议:

  • 做产品原型,先用磁编码器,便宜好调试
  • 做高性能伺服,上绝对式编码器
  • 做低成本方案,增量式加Z相回零

下一章咱们聊怎么把这些位置信号变成FOC能用的角度值。到时候你会看到,同样的编码器,不同人的代码读出来的角度能差十万八千里。


公众号:蓝海资料掘金营,微信deep3321