因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验

stm32f4编码器模式

花费一下午时间研究编码器的使用,简单总结如下

  • E6B2-CWZ1X编码器
  • stm32f407 定时器编码器模式

一、编码器简介

1、分类

编码器可按以下方式来分类。

(1)增量型:

每转过单位的角度就发出一个脉冲信号,通常为A相、B相(某些包括Z相)输出。A相、B相为相互延迟1/4周期的脉冲输出(即正交信号),根据延迟关系可以区别正反转,而且通过取A相、B相的上升和下降沿可以进行2或4倍频。Z相为单圈脉冲,即每圈发出一个脉冲,常用于校正累计误差。

(2)绝对值型:

对应一圈,每个基准的角度发出一个唯一与该角度对应二进制的数值,通过外部记圈器件可以进行多个位置的记录和测量。

2、编码器中的线、位、分辨率

请参考:链接

3、编码器原理


前文提到编码器通过发送正交脉冲信号表示角度信息,如图为一个示例。(其中TI1和TI2分别对应编码器输出A、B项)

脉冲信号特性 表示信息
两项先后关系 旋转方向
脉冲个数 转过角度

注意到A、B项信号都可能出现毛刺,需要算法修正毛刺


二、stm32f4编码器模式

1、简介

我们可以利用外部中断分别捕获A、B项边沿,手写逻辑消除毛刺并解析编码器数据,但这是比较复杂的。其实这里的脉冲输入是一种特殊的输入捕获情况,因此stm32专门在定时器中提供了编码器模式,可大大简化解析过程。

(1)、stm32f407中定时器1、2、3、4、5、8提供编码器接口模式
(2)、可以对输入信号TI1,TI2进行滤波处理,数字滤波器由事件器组成,每N个事件才视为一个有效边沿,可以在TIMx_CCMR1、TIMx_CCMR2中的IC1F位域设置
(3)、stm32提供了单项计数(只能测速度)和双项计数模式(可测速度&方向),双项模式可以更好地消除毛刺干扰,一般使用双项模式,具体见下图

下图为双项模式下计数效果,可见在A、B中仅一项有毛刺时,计数值加减后保持不变,实现了抖动补偿

(4)、 编码器A、B相输入的信号TI1、TI2经滤波和反相后成为TI1FP1 或 TI2FP2 ,定时器的时钟由他们上的每次有效信号转换提供,也就是说最终计数值即反映转过角度。
(5)、 TI1FP1 或 TI2FP2反相可以改变计数方向,如下图:

(6)、定时器配置为编码器接口模式时,会提供传感器当前位置的相关信息。使用另一个配置为捕获模式的定时器测量两个编码器事件之间的周期,可获得动态信息(速度、加速度和减速度)。
(7)、计数溢出后,定时器会装载“重装载值”,并清零重新计数,此值可设置为编码器旋转一周的脉冲个数,这样既可利用溢出中断次数判断转了几圈。但若只要求旋转角度,此值可以任意。任意时刻角度为:溢出中断次数*重装载值+当前计数值
(8)、TIMx_CR1寄存器的 DIR 位指示当前旋转方向

2、示例代码

(1)定时器初始化设置

void TIM3_Int_Init()
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_ICInitTypeDef TIM_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //定时器设置-------------------------------------------------------------   TIM_TimeBaseInitStructure.TIM_Period = 3600;   //重装载值TIM_TimeBaseInitStructure.TIM_Prescaler=0x0;  //预分频TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3//编码器模式设置--------------------------------------------------------------                  TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//计数模式3TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 10;//滤波器值TIM_ICInit(TIM3, &TIM_ICInitStructure);
//溢出中断设置--------------------------------------------------------------  TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许TIM3溢出中断NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);//Reset counter-----------------------------------------------TIM_SetCounter(TIM3,0); //TIM3->CNT=0TIM_Cmd(TIM3, ENABLE);
}

(2)在中断服务函数中进行圈数计算

int circle_count=0;//全局变量-圈数
void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET){        if((TIM3->CR1>>4 & 0x01)==0) //DIR==0circle_count++;else if((TIM3->CR1>>4 & 0x01)==1)//DIR==1circle_count--;}TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}

(3)获取当前角度值

int Encoder=0;
extern int circle_count;Encoder=TIM_GetCounter(TIM3)+3600*circle_count;//当前角度
  • 上述代码在stm32f407平台测试通过
  • 使用另一个配置为捕获模式的定时器测量两个编码器事件之间的周期,可获得动态信息(速度、加速度和减速度)。

stm32f4编码器模式相关推荐

  1. STM32学习笔记——基于正点原子例程编码器模式小结

    STM32学习笔记--基于正点原子例程编码器模式小结 最近一段时间学习了,STM32f4的编码器功能,经过自己探索和他人的热心帮助,对于编码器模式有了一定了解.STM32f4单片机提供编码器模式,以便 ...

  2. 电机控制基础——定时器编码器模式使用与转速计算

    上篇电机控制基础--定时器捕获单输入脉冲原理介绍了定时器捕获输入脉冲的原理,那种方式是根据捕获的原理,手动切换上升沿与下降沿捕获,计算脉冲宽度的过程原理比较清晰,但编程操作起来比较麻烦. 对于电机测速 ...

  3. STM32之通用定时器编码器模式

    1.编码器原理 如果两个信号相位差为90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根据每个信号脉冲数量的多少及整个编码轮的周长就可以算出当前行走的距 ...

  4. 【STM32】 定时器---正交解码编码器模式详解

    增量式编码器 增量式编码器也成为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,一个输出脉冲信号就对应于一个增量位移,编码器每转动固定的位移,就会产生一个脉冲信号  通过读取单位时间脉冲信号的数 ...

  5. stm32编码器正反转计数程序_第六章:STM32CubeMx 定时器编码器模式基本使用方法...

    前言: 增量式编码器在实际应用中还是很常见.stm32的定时器带的也有编码器模式.所用的编码器是有ABZ三相,其中ab相是用来计数,z相输出零点信号.AB相根据旋转的方向不同,输出的波形如下图所示: ...

  6. STM32 定时器编码器模式时,如何理解编码器计数

    编码器的使用 增量式编码器倍频技术 增量式编码器输出的脉冲波形信号形式常见的有两种: 一种是占空比 50% 的方波,通道 A 和 B 相位差为 90°: 另一种则是正弦波这类模拟信号,通道 A 和 B ...

  7. STM32定时器捕获编码器模式测速和方向测不准问题

    ** STM32定时器捕获编码器模式测速和方向测不准问题 问题概述 关于STM32编码器模式电机测速的资料网上一抓一大把,却发现真的拿过来用还是有问题的,比如刚刚做了个东西,是个个头比较大的麦克纳姆轮 ...

  8. STM32CUBEMX F103 HAL库开发 两路定时器的Encoder编码器模式

    机器人开发过程中,对于直流电机来说,编码器至关重要,它不仅可以使我们对电极进行精确的速度闭环,位置闭环,还可以通过时间积分,根据运动学关系,获得速度.位置等信息 STM32的定时器有编码器模式,大大的 ...

  9. 编码电机测速(stm32f1/HAL库/CubeMX/编码器模式/平衡小车/直流减速电机/超详细)

    系列文章目录(STM32常用外设/HAL库版) 一.HC-SR04超声波模块的使用 二.OLED的HAL库代码介绍及使用 三.直流减速电机的测速以及电机驱动的使用(本篇) 文章目录 系列文章目录(ST ...

最新文章

  1. 【JAVA笔记——道】对象生命周期详解
  2. 程序员吐槽:去再好的互联网公司也就是个打工仔,还累出一身病
  3. java.lang.NoSuchMethodError
  4. spring配置数据源(加载properties文件)
  5. 两个或者多个图片上下之间有空隙
  6. postfix导致maillog填满磁盘空间的巨坑!
  7. python如何得到13位时间戳?
  8. java递归简易应用教程
  9. 设计模式:单例模式7种写法
  10. 浅谈String str = 和 new String()的区别
  11. python登录接口测试_接口测试,基于Python
  12. 在Linux环境下select函数的初体验
  13. Python空间分析| 03 利用Python进行地理加权回归(GWR)
  14. 基于stm32的智能输液系统设计
  15. ❤️【独家】挑战全网最通俗易懂的神经网络的表达能力解释
  16. 算法语句高中数学计算机,高中数学《基本算法语句》文字素材3 新人教A版必修3...
  17. 天下武功,无坚不破,唯快不破
  18. 【原创】BERT知识融合
  19. Golang之自旋锁
  20. 如何在Google搜索到我的网站?

热门文章

  1. 第四范式陈雨强:企业智能决策的下一代技术「强化学习 + 环境学习」
  2. ARIMA模型——平稳时间序列分析
  3. android 转语音助手,多言文字转语音助手
  4. 你知道可以配音的软件有哪些?推荐几款文字转语音配音软件
  5. Java线程池的原理
  6. (提词器)它的作用与运用
  7. iOS开发的一些奇巧淫技3
  8. 曲线运动与万有引力公式_高中物理概念+公式大全
  9. vue elementui 年份列表和月份列表
  10. 泸州田家炳中学2021高考成绩查询,2021年四川高中排名,高中高考成绩排名一览表...