入门电机系列,基于STM32硬件

本文章学习借鉴于野火团队资料,以表感谢。官网http://products.embedfire.com/
编码器的原理与应用。


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 入门电机系列,基于STM32硬件
  • 前言
  • 一、编码器分类?
    • 增量式编码器
    • 绝对式编码器
    • 混合式绝对式编码器
    • 旋转编码器原理
    • 增量式编码器原理
    • 绝对式编码器原理
    • 编码器基本参数
  • 编码器的使用
    • 增量式编码器倍频技术
    • 常用测速方法简介
    • STM32 的编码器接口简介
    • 编码器接口初始化结构体详解
    • TIM_Base_InitTypeDef

前言

编码器,是一种用来测量机械旋转或位移的传感器。这种传感器能够测量机械部件在旋转或直线
运动时的位移位置或速度等信息,并将其转换成一系列电信号。编码器是工业中常用的传感器之
一,广泛应用于工业生产当中需要对机械系统进行监视或控制的场景,包括工业控制、机器人、
照相机镜头、雷达平台以及部分计算机输入设备例如轨迹球和鼠标滚轮等等。
编码器可以根据不同的方式分出很多种类型。例如根据检测原理,可分为光学式、磁式、感应式
和电容式。根据内部机械结构的运动方式,可分为线性编码器和旋转编码器。根据其刻度实现方
法及信号输出形式,又可分为增量式、绝对式以及混合式三种。编码器种类繁多,本章主要讲解
旋转编码器,如下图所示,外形很像一个电机。


旋转编码器如上如所示


提示:以下是本篇文章正文内容,下面案例可供参考

一、编码器分类?

增量式编码器

增量式旋转编码器是将设备运动时的位移信息变成连续的脉冲信号,脉冲个数表示位移量的大
小。只有当设备运动的时候增量式编码器才会输出信号。编码器一般会把这些信号分为通道 A
和通道 B 两组输出,并且这两组信号间有 90° 的相位差。同时采集这两组信号就可以知道设备的
运动和方向。除了通道 A、通道 B 以外,很多增量式编码器还会设置一个额外的通道 Z 输出信
号,用来表示编码器特定的参考位置,传感器转一圈 Z 轴信号才会输出一个脉冲。增量式编码器
只输出设备的位置变化和运动方向,不会输出设备的绝对位置

绝对式编码器

绝对式旋转编码器是将设备运动时的位移信息通过二进制编码的方式变成数字量直接输出。这
种编码器与增量式编码器的区别主要在内部的码盘。绝对式编码器的码盘利用若干透光和不透
光的线槽组成一套二进制编码,这些二进制码与编码器转轴的每一个不同角度是唯一对应的,读
取这些二进制码就能知道设备的绝对位置,所以叫它绝对式编码器。绝对式编码器一般常用自然
二进制、格雷码或者 BCD 码等编码方式。

混合式绝对式编码器

混合式绝对式编码器,它输出两组信息:一组信息用于检测磁极位置,带有绝对信息功能;另一
组则和增量式编码器的输出信息完全相同。

旋转编码器原理

旋转编码器的原理示意图如下图所示。旋转编码器内部大都由码盘、光电检测装置和信号处理电
路等部分构成。码盘上刻了若干圈线槽,线槽等距并且可透光,当码盘旋转时就会周期性的透过
和遮挡来自光电检测装置的光线,这样检测装置就会周期性的生成若干电信号。但是这些电信号
通常比较微弱,需要加入一套处理电路对信号进行放大和整形,最后把信号整形为脉冲信号并向
外输出。

增量式编码器原理

首先来看增量式编码器。上节提到过,增量式编码器都有 A、B 两通道信号输出,这是因为增量
式编码器的码盘上有两圈线槽,两圈线槽的之间会错开一定的角度,这个角度会使得光电检测装
置输出的两相信号相差 1/4 周期 (90°)。码盘的具体工作方式如下图所示。图中黑色代表透光,白
色代表遮光。当码盘转动时,内圈和外圈的线槽会依次透过光线,光电检测装置检测到光线通断
的变化,就会相应的输出脉冲信号,因为内外圈遮光和透光时候存在时间差,所以也就有了 A、
B 两通道信号的相位差。



根据两相信号变化的先后顺序就可以判断运动方向,记录输出的脉冲个数可以知道位移量的大
小,同时通过输出信号的频率就能得到速度。
一些增量式编码器上会有 4 圈线槽,分别对应 A、B、-A、-B 四相信号,相邻两相信号间也是差
1/4 周期,只不过这种编码器会把-A 和-B 两相信号反相,然后叠加到 A、通道 B,用来增强信号。
除了通道 A、通道 B 以外,很多增量式编码器还会设置一个额外的通道 Z 输出信号。通道 Z 信
号也在码盘上有对应的线槽,不过只有一条,码盘转一圈才会经过一次。通道 Z 信号一般用做参
考零位,指示设备位置或者清除积累量。
另一种较为常用的增量式编码器是霍尔编码器。霍尔增量式编码器在结构上和光电式几乎相同,
只不过检测原理变成了霍尔效应。内部元件也稍有不同,霍尔编码器的码盘上不是线槽,而是不
同的磁极,或者有些直接把电机的旋转磁场当作码盘,然后检测装置换成了霍尔传感器。输出和
光电式相同,仍然是相位差 1/4 周期的 A、B 两通道信号。
增量式编码器计数起点任意设定,可实现多圈无限累加和测量。需要提高分辨率时,可触发 A、
B 两通道信号的上升沿和下降沿对原脉冲数进行倍频。但是当接收设备停机重启后,增量式编码
器需要重新寻找参考零点。

绝对式编码器原理

接着是绝对式编码器。绝对式编码器在总体结构上与增量式比较类似,都是由码盘、检测装置和
放大整形电路构成,但是具体的码盘结构和输出信号含义不同。绝对式编码器的码盘上有很多圈
线槽,被称为码道,每一条码道内部线槽数量和长度都不同。它们共同组成一套二进制编码,一
条码道对应二进制数的其中一个位,通常是码盘最外侧的码道表示最低位,最内侧的码道表示最
高位。码道的数量决定了二进制编码的位数,一个绝对式编码器有 N 条码道,它就能输出 N 位
二进制数,且输出二进制数的总个数是 2
N 个。这些二进制数与转轴的机械位置是固定的,和编
码器外部因素无关,所以叫做绝对式编码器。在接收设备断电重启后绝对式编码器无需寻找参考
零点。
下图是一个简化版的绝对式编码器码盘,其中白色块透光表示 0,黑色块不透光表示 1。码盘上
的二进制数逆时针依次增大

图中码盘有 3 条码道,一共可表示 2
3=8 个二进制数,所以整个码盘被分成了 8 个扇区,每个扇区
表示一个 3 位二进制数,每个二进制数对应一个转轴的位置信息。码盘采用自然二进制编码,自
然二进制编码的优点是很方便直观,但是受编码器制造和安装精度的影响,实际应用中二进制数
的每一位不可能同时改变,或者出现码盘停在两个扇区中间,这些情况都很容易造成读数错误。
为了避免出现读数错误,可以使用格雷码来解决。下图是一个使用格雷码的码盘,同样的,白色
块透光表示 0,黑色块不透光表示 1。码盘上的二进制数逆时针依次增大。

图中码盘的码道数与上面的自然二进制码盘完全一致,也能表示 8 个 3 位二进制数,只不过将编
码方式换成了格雷码。利用任意相邻的二进制格雷码数都只有一位不同的特性,采用这种编码的
码盘在一定程度上克服了自然二进制码盘容易产生读数错误的问题。
绝对式编码器还分为单圈绝对式编码器和多圈绝对式编码器,上面举的两个例子都是针对单圈
也就是 360° 以内的情况,当码盘转动超过 360°,输出的编码会重复,这样不符合绝对式编码器
数据唯一的要求,所以就出现了多圈绝对式编码器。多圈绝对式编码器的量程可以超过 360°,并
且通常超出很多,其内部结构也比单圈的复杂,但是基本原理都是一样的。

编码器基本参数

• 分辨率:指编码器能够分辨的最小单位。对于增量式编码器,其分辨率表示为编码器转轴
旋转一圈所产生的脉冲数,即脉冲数/转 (Pulse Per Revolution 或 PPR)。码盘上透光线槽的数
目其实就等于分辨率,也叫多少线,较为常见的有 5-6000 线。对于绝对式编码器,内部码
盘所用的位数就是它的分辨率,单位是位 (bit),具体还分单圈分辨率和多圈分辨率。
• 精度:首先明确一点,精度与分辨率是两个不同的概念。精度是指编码器每个读数与转轴
实际位置间的最大误差,通常用角度、角分或角秒来表示。例如有些绝对式编码器参数表
里会写 ±20′′,这个就表示编码器输出的读数与转轴实际位置之间存在正负 20 角秒的误差,
精度由码盘刻线加工精度、转轴同心度、材料的温度特性、电路的响应时间等各方面因素
共同决定。
• 最大响应频率:指编码器每秒输出的脉冲数,单位是 Hz。计算公式:最大响应频率 = 分辨
率 * 轴转速/60。
• 信号输出形式:对于增量式编码器,每个通道的信号独立输出,输出电路形式通常有集电
极开路输出、推挽输出、差分输出等。对于绝对式编码器,由于是直接输出几十位的二进
制数,为了确保传输速率和信号质量,一般采用串行输出或总线型输出,例如同步串行接
口 (SSI)、RS485、CANopen 或 EtherCAT 等,也有一部分是并行输出,输出电路形式与增量
式编码器相同

编码器的使用

增量式编码器倍频技术

首先来看一下增量式编码器的输出信号和它的信号倍频技术。增量式编码器输出的脉冲波形信
号形式常见的有两种:

  1. 一种是占空比 50% 的方波,通道 A 和 B 相位差为 90°;
  2. 另一种则是正弦波这类模拟信号,通道 A 和 B 相位差同样为 90°。
    对于第 1 种形式的方波信号,如果把两个通道组合起来看的话,可以发现 A 和 B 各自的上升沿
    和下降沿都能计数,至少在 1/2 个原始方波周期内就可以计数一次,最多 1/4 个原始方波周期。
    这样计数频率就是原始方波信号的 2 倍或 4 倍,换句话说就是,将编码器的分辨率提高了 2 到 4
    倍,具体如下图所示。


图中的方波信号如果只看其中一个通道的上升沿,那计数频率就等于这个通道信号的频率。如果
在通道 A 的上升沿和下降沿都进行计数,计数频率就是通道 A 的两倍,即 2 倍频。如果同时对
两个通道的上升沿和下降沿都计数,那计数频率就变成了原始信号的 4 倍,即 4 倍频。

假设有个增量式编码器它的分辨率是 600PPR,能分辨的最小角度是 0.6°,对它进行 4 倍频之后
就相当于把分辨率提高到了 600*4=2400PPR,此时编码器能够分辨的最小角度为 0.15°。编码器
倍频技术还可用来扩展一些测速方法的速度适用范围。例如电机测速通常使用 M 法进行测量(M
法在下节介绍),编码器 4 倍频后可以扩展 M 法的速度下限。
以上就是方波信号的编码器倍频技术,其实输出模拟信号的增量式编码器同样也可以倍频,不过
这种倍频原理与方波完全不同,教程当中就不讲解了。

常用测速方法简介

上一节提到了增量式编码器倍频技术可以扩展 M 法的测量范围,那么现在我们就来讲解下这个
M 法究竟是怎样测速的,以及简单介绍一些常用的编码器测速方法。对于电机转速的测量,可以
把增量式编码器安装到电机上,用控制器对编码器脉冲进行计数,然后通过特定的方法求出电机
转速,常用的编码器测速方法一般有三种:M 法、T 法和 M/T 法。
• M 法:又叫做频率测量法。这种方法是在一个固定的定时时间内(以秒为单位),统计这段
时间的编码器脉冲数,计算速度值。设编码器单圈总脉冲数为 C,在时间 T0 内,统计到的
编码器脉冲数为 M0,则转速 n 的计算公式为:

公式中的编码器单圈总脉冲数 C 是常数,所以转速 n 跟 M0 成正比。这就使得在高速测量时 M0
变大,可以获得较好的测量精度和平稳性,但是如果速度很低,低到每个 T0 内只有少数几个脉
冲,此时算出的速度误差就会比较大,并且很不稳定。也有一些方法可以改善 M 法在低速测量
的准确性,上一节提到的增量式编码器倍频技术就是其中一种,比如原本捕获到的脉冲 M0 只有
4 个,经过 4 倍频后,相同电机状态 M0 变成了 16 个,也就提升了低速下的测量精度。
• T 法:又叫做周期测量法。这种方法是建立一个已知频率的高频脉冲并对其计数,计数时
间由捕获到的编码器相邻两个脉冲的间隔时间 TE 决定,计数值为 M1。设编码器单圈总脉冲数为 C,高频脉冲的频率为 F0,则转速 n 的计算公式为:

公式中的编码器单圈总脉冲数 C 和高频脉冲频率 F0 是常数,所以转速 n 跟 M1 成反比。从公式
可以看出,在电机高转速的时候,编码器脉冲间隔时间 TE 很小,使得测量周期内的高频脉冲计
数值 M1 也变得很少,导致测量误差变大,而在低转速时,TE 足够大,测量周期内的 M1 也足够
多,所以 T 法和 M 法刚好相反,更适合测量低速。
• M/T 法:这种方法综合了 M 法和 T 法各自的优势,既测量编码器脉冲数又测量一定时间内
的高频脉冲数。在一个相对固定的时间内,计数编码器脉冲数 M0,并计数一个已知频率为
F0 的高频脉冲,计数值为 M1,计算速度值。设编码器单圈总脉冲数为 C,则转速 n 的计算
公式为:

由于 M/T 法公式中的 F0 和 C 是常数,所以转速 n 就只受 M0 和 M1 的影响。电机高速时,M0 增
大,M1 减小,相当于 M 法,低速时,M1 增大,M0 减小,相当于 T 法。

STM32 的编码器接口简介

STM32 芯片内部有专门用来采集增量式编码器方波信号的接口,这些接口实际上是 STM32 定时
器的其中一种功能。不过编码器接口功能只有高级定时器 TIM1、TIM8 和通用定时器 TIM2 到
TIM5 才有。编码器接口用到了定时器的输入捕获部分,功能框图如下图所示。输入捕获功能在
《STM32 HAL 库开发指南》中已有详细讲解,所以这部分内容在此就不再赘述了。
我们重点关注编码器接口是如何实现信号采集和倍频的。《STM32F4xx 参考手册》给出了的编码
器信号与计数器方向和计数位置之间的关系,如下表所示。


这个表格将编码器接口所有可能出现的工作情况全都列了出来,包括它是如何实现方向检测和
倍频的。虽然信息很全面但是乍看上去却不容易看懂。首先需要解释一下,表中的 TI1 和 TI2 对
应编码器的通道 A 和通道 B,而 TI1FP1 和 TI2FP2 则对应反相以后的 TI1、TI2。STM32 的编码器
接口在计数的时候,并不是单纯采集某一通道信号的上升沿或下降沿,而是需要综合另一个通道
信号的电平。表中“相反信号的电平”指的就是在计数的时候所参考的另一个通道信号的电平,
这些电平决定了计数器的计数方向。
为了便于大家理解 STM32 编码器接口的计数原理,我们将表中的信息提出转换成一系列图像。
首先看下图,下图所展示的信息对应表格中“仅在 TI1 处计数”。图中包含 TI1、TI2 两通道的信
号,以及计数器的计数方向,其中 TI1 比 TI2 提前 1/4 个周期,以 TI1 的信号边沿作为有效边沿。
当检测到 TI1 的上升沿时,TI2 为低电平,此时计数器向上计数 1 次,下一时刻检测到 TI1 的下
降沿时,TI2 为高电平,此时计数器仍然向上计数一次,以此类推。这样就能把 TI1 的上升沿和
下降沿都用来计数,即实现了对原始信号的 2 倍频。


接下来看如下图像,图中同样包含 TI1、TI2 两通道的信号,以及计数器的计数方向,其中 TI1 比
TI2 滞后 1/4 个周期,以 TI1 的信号边沿作为有效边沿。当检测到 TI1 的上升沿时,TI2 为高电平,
此时计数器向下计数 1 次,下一时刻检测到 TI1 的下降沿时,TI2 为低电平,此时计数器仍然向
下计数一次,以此类推。这样同样是把 TI1 的上升沿和下降沿都用来计数,同样实现了对原始信
号的 2 倍频,只不过变成向下计数了


以上两幅图像都是只以 TI1 的信号边沿作为有效边沿,并且根据 TI2 的电平决定各自的计数方
向,然后判断计数方向就能得到编码器的旋转方向,向上计数正向,向下计数反向。“仅在 TI2
处计数”也是同样的原理,在这里就不重复讲了。
最后如下图所示,下图所展示的信息对应表格中“在 TI1 和 TI2 处均计数”。这种采样方式可以
把两个通道的上升沿和下降沿都用来计数,计数方向也是两个通道同时参考,相当于原来仅在一
个通道处计数的 2 倍,所以这种就能实现对原始信号的 4 倍频。

编码器接口初始化结构体详解

HAL 库函数对定时器外设建立了多个初始化结构体,其中编码器接口用到的有时基初始化结构
体 TIM_Base_InitTypeDef ,和编码器初始化配置结构体 TIM_Encoder_InitTypeDef 。初始化结构
体成员用于设置定时器工作环境参数,并由定时器相应初始化配置函数调用,最终这些参数将会
写入到定时器相应的寄存器中。

TIM_Base_InitTypeDef

时基结构体 TIM_Base_InitTypeDef 用于定时器基础参数设置,与 HAL_TIM_Base_Init 函数配合
使用完成配置。这个结构体在《STM32 HAL 库开发指南》的定时器章节有详细的讲解,这里我
们只简单的提一下。

2 {
3 uint32_t Prescaler; //预分频器
4 uint32_t CounterMode; //计数模式
5 uint32_t Period; //定时器周期
6 uint32_t ClockDivision; //时钟分频
7 uint32_t RepetitionCounter; //重复计算器
8 uint32_t AutoReloadPreload; //自动重载值
9 }TIM_Base_InitTypeDef;typedef struct
2 {
3 uint32_t EncoderMode; //编码器模式
4 uint32_t IC1Polarity; //输入信号极性
5 uint32_t IC1Selection; //输入通道
6 uint32_t IC1Prescaler; //输入捕获预分频器
7 uint32_t IC1Filter; //输入捕获滤波器
8 uint32_t IC2Polarity; //输入信号极性
9 uint32_t IC2Selection; //输入通道
10 uint32_t IC2Prescaler; //输入捕获预分频器
11 uint32_t IC2Filter; //输入捕获滤波器
12 }TIM_Encoder_InitTypeDef;

`1. EncoderMode:编码器模式选择,用来设置计数器采集编码器信号的方式,可选通道 A 计
数、通道 B 计数和双通道计数。它设定 TIMx_SMCR 寄存器的 SMS[2:0] 位。这个成员实际
是用来设置编码器接口的倍频数的,当选择通道 A 或 B 计数时为 2 倍频,双通道计数时为
4 倍频。
2. ICxPolarity:输入捕获信号极性选择,用于设置定时器通道在编码器模式下的输入信号是否
反相。它设定 TIMx_CCER 寄存器的 CCxNP 位和 CCxP 位。
3. ICxSelection: 输 入 通 道 选 择,ICx 的 信 号 可 来 自 三 个 输 入 通 道, 分 别
为 TIM_ICSELECTION_DIRECTTI、TIM_ICSELECTION_INDIRECTTI 或
IM_ICSELECTION_TRC。它设定 TIMx_CCMRx 寄存器的 CCxS[1:0] 位的值。定时器
在编码器接口模式下,此成员只能设置为 TIM_ICSELECTION_DIRECTTI。
4. ICxPrescaler:输入捕获通道预分频器,可设置 1、2、4、8 分频。它设定 TIMx_CCMRx 寄
存器的 ICxPSC[1:0] 位的值。
5. ICxFilter:输入捕获滤波器设置,可选设置 0x0 至 0x0F。它设定 TIMx_CCMRx 寄存器
ICxF[3:0] 位的值。

入门电机系列之5编码器相关推荐

  1. 入门电机系列之6PID 算法的原理与应用

    入门电机系列,基于STM32硬件 本文章学习借鉴于野火团队资料,以表感谢.官网http://products.embedfire.com/ 入门电机系列之6PID 算法的原理与应用. 提示:写完文章后 ...

  2. 入门电机系列之3舵机

    入门电机系列,基于STM32硬件 本文章学习借鉴于野火团队资料,以表感谢.官网http://products.embedfire.com/ 舵机的原理与应用. 文章目录 入门电机系列,基于STM32硬 ...

  3. 入门电机系列之4步进电机

    入门电机系列,基于STM32硬件 本文章学习借鉴于野火团队资料,以表感谢.官网http://products.embedfire.com/ 舵机的原理与应用. 文章目录 入门电机系列,基于STM32硬 ...

  4. 入门电机系列之1认识电机

    入门电机系列,基于STM32硬件 本文章学习借鉴于野火团队资料,以表感谢.官网http://products.embedfire.com/ 内容比较多,有一些名词之说明了部分,不理解的可以百度一下.哈 ...

  5. ODrive踩坑(二)3508电机和TLE5012B磁编码器参数配置、校准、位置闭环模式转动电机(TLE5012B-E1000)

    ODrive对无刷电机进行闭环控制,需要提前获取电机和编码器的参数. 电机极对数 电机需要配置的参数为 极对数.最大电流.校准电流.电机类型.其他参数如相电阻.电感等可由驱动器自动测量. 极对数 = ...

  6. Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.1  运行环境说明 1.1.1 硬软件环境 l  主机操作系统:Windows 64位, ...

  7. Spark入门实战系列--5.Hive(下)--Hive实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.Hive操作演示 1.1 内部表 1.1.1 创建表并加载数据 第一步   启动HDFS ...

  8. Visual Studio2005入门.Net系列视频教程

    Visual Studio2005入门.Net系列视频教程 严正声明:任何个人或者团体不得将本系列教程用于商业用途,一经发现,我们将追究其法律责任. 我做这个教程的主旨是为了帮助更多的人少走弯路,少花 ...

  9. WPF入门教程系列三——Application介绍(续)

    接上文WPF入门教程系列二--Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...

最新文章

  1. pandas打乱行次序
  2. SQLServer中进行sql除法运算结果为小数时显示0的解决方案
  3. iOS11正式推出,第一批AR应用上线App Store!
  4. brew 安装mysql5.6_mac使用brew安装mysql的坑
  5. linux学习随笔第一天
  6. 看完源码记不住,是我记性太差了吗?
  7. Python 同一个类中不同函数相互调用
  8. java for循环死循环_Java for循环进化
  9. okhttp离线缓存_Android改造OkHttp离线缓存
  10. Scala 解析 URL
  11. jupyterlab nb_conda 增加 删除_Jupyter lab
  12. hdu--1073--字符串处理
  13. Atitit.月度计划日程表 每月流程表v5
  14. 【指纹识别】基于matlab GUI指纹打卡系统【含Matlab源码 867期】
  15. 科立捷默认频率_科立捷电子产品技术参数.doc
  16. 计算机内部总线和外部总线,总线分为内部总线和外部总线
  17. 鸿合一体机触屏没反应怎么办_一体机屏幕触摸不准的原因以及解决方法
  18. android webp格式的图片,Android应用中对webp格式图片的处理
  19. c++ map查找key
  20. SICK LMS511 LiDAR系统集成

热门文章

  1. 如何让说话的声音悦耳动听
  2. 支付宝小程序自定义Map地图marker
  3. Java 程序如何正确地打日志
  4. tplink显示网络连接已断开_TP-Link无线路由器经常突然断开连接,如何解决?
  5. imshow与显示图像时的全白问题
  6. poj1408 四边形面积
  7. 使用conga部署RHCS
  8. php锻炼逻辑的问题,锻炼逻辑思维能力的:5道高难度逻辑思维训练题
  9. Docker容器(ubuntu)使用VNC设置远程桌面,在Windows中显示
  10. 趣味博弈论 -- 阶梯博弈