1. 课程导入
各位工程师朋友,咱们开始第一讲。编码器这东西,说白了就是个角度或位置传感器。你想想看,电机转了多少圈、机械臂摆到了什么角度、传送带走了多远——这些信息都得靠它来告诉单片机。我最早接触编码器是在一个伺服项目里,当时选型没经验,结果分辨率不够,电机低速时抖得像筛子……嗯,从那以后我每次选编码器都会先算一笔账。
增量式编码器原理
增量式编码器,我习惯叫它“相对位置传感器”。它只输出脉冲信号,不告诉你位置。你得自己数脉冲个数,才能知道转了多少角度。
它的核心结构其实很简单:
- 码盘:一圈均匀刻着透光/遮光条纹
- 光耦:发光管+接收管,检测条纹变化
- 输出: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位定时器或者软件扩展。
下面这张图,是我自己总结的编码器选型决策流程,你照着走基本不会错。
最后说一句,选型时别只看参数表。我建议你实际测一下编码器的输出波形——用示波器看A、B相的上升沿和下降沿是否干净。有一次我遇到编码器输出有毛刺,结果STM32定时器多计了好几个脉冲,位置越跑越偏。后来加了RC滤波才搞定。