编码器基础与选型

各位工程师朋友,咱们开始第一讲。编码器这东西,说白了就是个角度或位置传感器。你想想看,电机转了多少圈、机械臂摆到了什么角度、传送带走了多远——这些信息都得靠它来告诉单片机。我最早接触编码器是在一个伺服项目里,当时选型没经验,结果分辨率不够,电机低速时抖得像筛子……嗯,从那以后我每次选编码器都会先算一笔账。

增量式编码器原理

增量式编码器,我习惯叫它“相对位置传感器”。它只输出脉冲信号,不告诉你绝对位置。你得自己数脉冲个数,才能知道转了多少角度。

它的核心结构其实很简单:

  • 码盘:一圈均匀刻着透光/遮光条纹
  • 光耦:发光管+接收管,检测条纹变化
  • 输出:A相、B相两路脉冲,相位差90°

为什么要有A、B两相?因为靠相位关系能判断旋转方向。A相领先B相90°就是正转,反过来就是反转。我见过不少新手只接了一路信号,结果方向信息全丢了。

关键点:增量式编码器断电后位置信息会丢失。每次上电必须回零,这是它的“死穴”。

绝对式编码器原理

绝对式编码器就高级多了。它每个位置都有唯一的二进制编码,断电再上电,位置还在。你想想看,这多省心。

它的码盘不是均匀条纹,而是一圈圈同心码道。每一圈代表二进制的一位。常见的有:

  • 二进制码:直接二进制编码,但相邻位置可能多位跳变
  • 格雷码:相邻位置只变1位,抗干扰能力强

我个人更推荐格雷码。为什么?因为二进制码在边界处容易出错——比如从0111变到1000,4位同时跳变,万一某一位没跟上,位置就全乱了。格雷码每次只变1位,容错性好得多。

小技巧:STM32的TIM编码器模式只支持增量式编码器。如果你用绝对式编码器,得走SPI或SSI接口,别搞混了。

编码器关键参数

选编码器,说白了就是看三个数:分辨率、精度、响应频率。我列个表,方便你对比。

参数 定义 典型值 我的建议
分辨率 一圈输出的脉冲数(PPR) 100~10000 PPR 低速场合选高分辨率,高速场合别太高
精度 实际位置与理论位置的偏差 ±0.1°~±1° 取决于码盘加工和安装同心度
响应频率 编码器能输出的最高脉冲频率 100kHz~1MHz 必须大于电机最高转速×分辨率

这里有个坑,我曾经踩过。有一次我选了个5000 PPR的编码器,电机转速3000 RPM。算一下:3000/60×5000=250kHz。结果编码器标称响应频率只有200kHz,高速时脉冲直接丢失了。嗯,从那以后我每次都会先算这个公式:

f_max = (RPM_max / 60) × PPR

选编码器时,响应频率至少要留20%余量。

STM32选型建议

STM32的编码器接口,说白了就是定时器的编码器模式。不是所有STM32都支持,你得挑对型号。

我常用的搭配是这样的:

  • STM32F103:经典款,TIM2~TIM5支持编码器模式,适合中低速场合
  • STM32F4系列:主频高,TIM支持正交解码,适合高速编码器
  • STM32G4系列:带HRTIM,分辨率更高,适合伺服驱动

注意:STM32的编码器模式只支持3种计数方式——仅在TI1边沿计数、仅在TI2边沿计数、在TI1和TI2双沿计数。双沿计数相当于把分辨率翻了4倍,但频率也翻了4倍,别让定时器溢出。

我个人习惯用双沿计数。比如一个1000 PPR的编码器,双沿计数后相当于4000个计数/圈。配合STM32的16位定时器,最大计数65535,算下来最多能记16圈。如果圈数更多,就得用32位定时器或者软件扩展。

下面这张图,是我自己总结的编码器选型决策流程,你照着走基本不会错。

编码器选型决策流程图 开始选型 是否需要断电记忆位置? (上电后能否回零?) 是 绝对式编码器 SPI/SSI接口 否 增量式编码器 A+B+Z相输出 计算所需分辨率 f_max = (RPM_max/60) × PPR 响应频率 ≥ f_max × 1.2? (留20%余量) 是 选型完成 否 降低PPR或换高速型号 重新计算频率 STM32推荐:F103/F4/G4 双沿计数可×4分辨率

最后说一句,选型时别只看参数表。我建议你实际测一下编码器的输出波形——用示波器看A、B相的上升沿和下降沿是否干净。有一次我遇到编码器输出有毛刺,结果STM32定时器多计了好几个脉冲,位置越跑越偏。后来加了RC滤波才搞定。