基于STM32的编码器详解

基本原理:

光电编码器由三个部分组成:发光二极管,码盘以及码盘背面的光传感器。

这个码盘安装在旋转轴上,上面均匀地排列着透光和不透光的扇形区域。当码盘转动时,不透光的部分能够挡住光线,而透光区则允许光线透过,那么码盘背面的光传感器就会周期性地收到光信号,从而输出一列方波。

我们知道,码盘转动一周时,光传感器输出的脉冲个数是一定的,通过检测一定时间内收到的脉冲个数,就可以知道在这段时间内码盘转动了多少圈,进而换算为速度。例如,一个码盘转动一周时会输出100个脉冲,在0.1s内我们收到了500个脉冲,这意味着0.1s内码盘转动了5周,即码盘的转速为50r/s。

但是,还有一个问题。设想,如果编码器只输出一列方波(假设为A),我们该怎样判断码盘是正转还是反转?因为无论是正转还是反转,都会产生同样的方波,而它们对速度的贡献显然是相反的!

接下来我们看一看这个问题该怎样解决:

上面我们已经说过,码盘上均匀地刻着透光和不透光的扇形区域,我们在这一圈扇形区域内再均匀地刻上一圈透光和不透光的扇形区域,不同的是,外圈和内圈的区域是“交错”的。也就是说,当外圈处于不透光区域时,内圈对应的一半为透光区域,一半为不透光区域;当外圈处于透光区域时,内圈对应的一半为不透光区域,一半为透光区域。

于是,当码盘转动时编码器会输出两列相位差为90°方波,波形如下:

下面左图为正转时的波形,右图为反转时的波形:

当码盘正转时,在方波A的上升沿,方波B恒为低电平;当码盘反转时,在方波A的上升沿,方波B恒为高电平。通过判断A处于上升沿时,B的电平状态就可以方便地知道码盘旋转的方向。

速度计算:

不同型号的编码器,码盘旋转一周输出的脉冲个数是不同的,我使用的编码器码盘旋转一周输出的脉冲个数为90,小车轮子的直径为75mm 。

假如我们在时间T内统计到的有效脉冲数目为S(正转脉冲数+1,反转脉冲数-1),小车轮子的直径为D,圆周率为pi(约为3.14),那么小车的速度换算公式如下:

V = pi*S*D / (90*T)

例如,我们每隔1 s统计一次有效脉冲数目,某一次得到的有效脉冲数目为500,那么小车此时的速度为:

V = 3.14*500*75*10^(-3) / (90*1)≈ 1.31 m/s

我们可以看出,问题的关键在于,如何统计一定时间内的脉冲数目?目前有两种思路:

①利用中断检测A的上升沿,触发中断时判断B的电平,来决定计数值加还是减;

②将定时器设置为编码器模式,直接读取计数值和方向。

下面分别介绍这两种方法的实现:

代码实现

  1. 利用中断检测A的上升沿,触发中断时判断B的电平,来决定计数值加还是减

    (1)打开CubeMX,设置相关管脚,我这里使用的是PC2和PC3来接A、B相

设置A、B相接口

将PC2设置为上升沿触发

(2)为方便观察,打开UART串口,从串口读取采集到的数据

打开UART1

UART串口设置(3)

(3)打开定时器2,定时器响应时通过UART串口把计数值打印出来

配置TIM2

计时200ms

(4)导入Cube工程

定义相关变量

重写中断回调函数

定时器响应后通过UART串口发送数据

在主函数中打开定时器2

实际测试

测试效果如图:

实际效果

2. 使用定时器的编码器模式

(1)设置TIM4为编码器模式

设置Combined Channels

(2)配置编码模式

Prescaler:分频系数

Counter Mode:计数模式,设置为UP代表码盘正转时计数值增加,反转时计数值减小

Counter Period:当编码器计数值等于该值时,计数值会清零,一般避免编码器清零设置为65535(最大值)

Encoder Mode:计数模式,编码器计数有三种模式可选

①T1

只在上升沿计数,例如在一定时间内A产生了100个脉冲,那么编码器计数值为200(A、B产生脉冲数相等),由于分频系数的存在,实际调用函数得到的计数值为200 / ( Prescaler + 1 );

②T2

只在下降沿计数,计数值与T1相等( Prescaler相等的情况下);

③TI and T2

在上升沿、下降沿都计时,计数值为T1的两倍( Prescaler相等的情况下);

(3)导入CubeMx工程

定义相关变量

打开定时器模式

读取相关值并通过OLED显示出来

实际效果

用函数发生器模拟两列方波,配置编码器时我采用T1 and T2模式,分频系数为3,所以1s内采集到的脉冲个数为( 50 * 4 ) / ( 3 + 1 ) = 100,延时时间为500ms,所以实际读取出来的值为 100 / 2 = 50 。

实际效果

源码开源地址

https://github.com/ljing431/HAL_Encoder

(0)

相关推荐

  • 运用NE555实现直流倍压稳压电源

    倍压整流电路一般使用在需要高电压.低电流的场合.倍压整流顾名思义作用就是将电压进行升压操作:一般可以将较低的交流电压,用耐压较高的整流二极管和电容器,整流出一个较高的直流电压. 倍压整流电路一般按照输 ...

  • 步进电机驱动算法——梯形加减速算法

    步进电机梯形加减速 电机的控制方式一般分为开环控制与闭环控制两种控制方式,其中开环控制原理框图如下: 这种种控制方式的特点是:控制简单.实现容易.价格较低,这种开环控制方式,负载位置对控制电路没有反馈 ...

  • 嵌入式开发,掌握数据手册是一个合格工程师的重要标志

    做嵌入式开发,特别是底层相关的开发,不管是软件还是硬件,数据手册必须掌握才行,否则,你就是一个不合格的工程师. 概述 比如:我们写STM32底层驱动代码,或者画板子的时候,会牵涉到一些与芯片引脚.电气 ...

  • 用CubeMX + HAL库开发它不香吗?

    干货福利,第一时间送达! 摘要:如果你学过STC51,你一定知道STC51操作是极其方便的.如果你学过STM32的库函数,你一定知道STM32操作是极其繁琐的.传统的库函数开发方式,将太多时间花费在各 ...

  • AVR446

    如:1rad/1s,1分钟转过的弧度为=1rad*60,则每分钟转数:(1rad*60分钟/2π)=9.55rpm 步距角为1.8°则:1.8/360=x/2*π-->步距角弧度为单位:0.03 ...

  • STM32启动模式详解

    一.三种boot启动模式: 一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式. ...

  • 基于Cortex-A9的pwm详解

    一.什么是PWM PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码 ...

  • 【转】STM32的FSMC详解

    STM32的FSMC真是一个万能的总线控制器,不仅可以控制SRAM,NOR FLASH,NAND FLASH,PC Card,还能控制LCD,TFT. 一般越是复杂的东西,理解起来就很困难,但是使用上 ...

  • 用PLC怎么实现编码器的定位功能详解!

    因为情怀还未了 所以四海为家 欢迎转发朋友圈,欢迎收藏 严格来讲,编码器只会告诉你改如何定位,要如何执行,是需要靠PLC之类控制器或者步进电机来实现定位的,编码器好比人的眼睛,知道电机轴或者负载处于当 ...

  • 详解基于以太网的现场总线技术 | EtherCAT

    高质量的PLC程序应该从何入手? 如何在西门子博途中实现工艺配方? 电子工程师从入门到应用全彩图教程 秒懂S7-1500PLC读写SQL微软数据库 分享一组污水处理3D画面,谈谈上位机设计原则![导读 ...

  • 基于100个案例,详解最高法“合同目的不能实现”裁判规则

    " 合同解除制度作为债务履行不能的救济方式,可以使当事人摆脱原有合同权利义务关系的束缚,在公平合理的基础上重新获得交易自由.<民法典>规定的合同解除制度包括约定解除与法定解除,其 ...

  • 图文详解ME-C电喷主机角度编码器的拆检和调整(中英文)

    图文详解ME-C电喷主机角度编码器的拆检和调整(中英文)

  • 技术贴 | 16S专题 |基于QIIME2 dada2插件的16S扩增子测序数据的分析流程详解(下)

    本文由Bayegy根据实践经验而整理,希望对大家有帮助. 原创微文,欢迎转发转载. 导  读 明明测了100000条序列,为什么我用dada2得到的OTU丰度只有8000?是人性的扭曲还是道德的沦丧? ...

  • 基于Linux的tty架构及UART驱动详解

    一.模块硬件学习 1.1.Uart介绍 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称为UART,是一种异步收发传输器,是电脑硬件 ...