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

这篇具有很好参考价值的文章主要介绍了STM32定时器捕获编码器模式测速和方向测不准问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

**

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

  1. 问题概述

关于STM32编码器模式电机测速的资料网上一抓一大把,却发现真的拿过来用还是有问题的,比如刚刚做了个东西,是个个头比较大的麦克纳姆轮车,控制运动就需要精确的测量转速和方向,我用的是直流有刷、减速比90、11线霍尔编码器的减速电机。
原本想着用个定时器的编码器模式直接把速度和方向读回来多省事,后面花点时间去调PID,然而问题来了,编码器我知道,定时器编码器模式我也知道,但是凑在一起就是不好好工作我就知道为什么了。
问题表现是什么样的呢:
接法是这样的,我用的STM32F103,TIM2、3、4、5的CH1、2分别接四个直流电机霍尔编码器的A/B信号,然后开了四个TIM的编码器模式捕获,计数器上限值设最大,起始值设中间值。
再开个TIM6,100模式溢出读四个定时器的计数值,来求转速和方向,计划很好,现实却让人无法理解。
调试嘛,我先用手拧轮子,想看看准不准,然而就发现,没有速度、也没有方向,中间值设的32767,拧完轮子发现计数值要么是32768要么就是32765,这也不对啊。
尝试着拧快点,多拧会,发现计数值确实变了,正常情况下减速比90、11线的电机轮子转一圈编码器出脉冲990个,但计数值明显不符,比实际少了很多。

  1. 问题分析

那么问题来了,为什么会少呢?线没问题,脉冲好像也没问题,我用单个编码器的A信号直接用定时器捕获上升沿测频率,并保存数据,发现转速很正常,低速高速都没问题。
所以问题一定是出在了定时器的编码器模式上,我尝试慢点转轮子,然后看测速结果,不出所料脉冲计数就没动过。快点拧呢,计数值变了,就是少了点,快速拧一圈和快速拧两圈好像丢的脉冲差不多,感觉好像抓住了点什么,难道是低转速时候测不了速?
反复尝试,确实是低速时计数器不涨,高速时候才涨,这个定时器的编码器模式有毛病吧,STM有毛病也不是一天两天了,但网上好像没人提出来有问题啊,没办法了,只能自己排故了。

  1. 编码器及输出波形

网上很多介绍电机测速的文章都会介绍下什么是编码器,编码器输出波形什么样,但基本上都是同一张图,除了能介绍基本原理,指导不了调试和排故,其实编码器很很多藏起来的坑,写文章的没遇到过,遇到了也没在意,就这么昏过去了。
因为看到网上都是光电编码的图,所以我来说霍尔编码器吧,电机后面的传感器是这样的:
stm32输入捕获编码器速度,stm32,单片机,嵌入式硬件

轮盘和电机转子连接在一起,转子转n圈输出轴转一圈,n就是减速比,磁铁在轮盘上均匀分布,所谓线数就是磁铁数量,也就是轮盘转一圈经过霍尔传感器的磁铁数量,AB两个霍尔传感器成90°分布在轮盘侧面,传感器调理电路就不说了。
这样配置之后,只要电机转动,那么磁铁就会不停的经过两个传感器,传感器就会输出脉冲,而且两个传感器输出脉冲个数是一样的,不一样的就是AB脉冲的相位,因为磁铁是奇数个,而传感器是在偶数对称位上,所以两个传感器输出的脉冲信号永远都会存在一个相位差。我们一般都觉得脉冲应该是这种相位关系的。
stm32输入捕获编码器速度,stm32,单片机,嵌入式硬件

看着多鼓舞人心,这种脉冲送进捕获器,拖拖的转速就出来了,然而没那么简单。编码器模式测不出低速,我用示波器观察传感器从低速到高速再低速直到0再反转低速、高速,来观察AB脉冲波形,发现脉冲可能会是这些样子
stm32输入捕获编码器速度,stm32,单片机,嵌入式硬件
stm32输入捕获编码器速度,stm32,单片机,嵌入式硬件
stm32输入捕获编码器速度,stm32,单片机,嵌入式硬件
stm32输入捕获编码器速度,stm32,单片机,嵌入式硬件
脉宽不一致是因为传感器是插焊的,所以容易被碰到,碰到之后可能就歪了,导致两个传感器距离轮盘的距离不一样,所以脉宽不一样,但频率一定是一样的,这里就可以看出由于传感器本身安装特性,导致脉冲宽度不一样,所以导致边沿捕获时AB无法正常识别相位尤其是双边沿捕获时,只有在高速时才能正常识别相位。
4 问题解决
尝试调传感器位置,好费劲,低速时波形边沿对齐状态应该与编码器模式捕获设定有一定出入所以一直捕获不到脉冲,知道高速后符合输入要求,才开始计数,所以至少我手上的这个编码器是没法用定时器的编码器模式测速了,只能靠AB波形关系来判断正反转,捕获波形周期来测速了。
虽然代码多了点,但至少没有错误,操作是这样的,四个电机的AB信号线分别接TIM2和TIM4的CH1~CH4,A线先捕获上升沿再捕获下降沿,B线先捕获下降沿再捕获上升沿,当A线捕获到两个下降沿和两个上升沿后开始每个上升沿的速度计算和方向判断。捕获到的数据计算时就如下面的波形,每个边沿捕获的都是据对时间。
stm32输入捕获编码器速度,stm32,单片机,嵌入式硬件

转速很好计算,任一一个脉冲两个上升沿间的时间差就是周期,乘以线数乘以减速比就是转一圈的时间,方向就用捕获到的边沿来计算了,正常情况下A线的一个正脉冲一定和B线的一个负脉冲相对应(和接线有关系),这两个脉冲的先后关系决定了电机是正着转还是反着转的,我是这么做的,计算A线正脉冲的上升沿和B线负脉冲的下降沿时间差,和A线正脉冲的下降沿和B线负脉冲的上升沿时间差,两个时间差绝对值比较,前面小后面大那就是B超前,前面大后面小就是A超前,这就分出来正反转了。
5 一些小问题
前面提到每个边沿都保存的绝对时间,绝对时间的意思是,只要有脉冲被捕获,边沿的时间就是越来越大的,这就牵扯到时间长了数据太大的情况,因为是电机,所以脉冲频率不是很高,测速精度也不是十分高,因此设置定时器时钟周期为10us,保存时间用unsigned int这样计时的最长时间为11.93小时,对于我做的东西,这足够了。
另外,多通道捕获的话会牵扯到定时器溢出的情况,一旦溢出只要将计时时间加上定时器的TOP值,但出问题也经常在这里,出现什么问题呢?当捕获中断和溢出中断同时发生就出问题了,说是同时发生还是有一定的时间差的,此时计数器离TOP只要几个周期,发生了捕获,在进中断的时候溢出中断也发生了,那么先做溢出处理捕获时间加了个TOP,再进行捕获处理时,时间已经被加了个TOP这时候得到的时间比实际就多了个TOP值。
所以同时发生溢出和捕获时要判断一下计数值是不是非常大接近TOP,如果是就需要减去溢出的TOP值。
我这人不喜欢贴代码就习惯码字……文章来源地址https://www.toymoban.com/news/detail-606087.html

到了这里,关于STM32定时器捕获编码器模式测速和方向测不准问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初出茅庐的小李博客之STM32CubeMx配置定时器的编码器模式

    上次文章写了编码器是如何工作的,今天就来用STM32F103C8T6的TIM3的通道1跟通道2编写一个编码器识别程序。 话不多说,上教程! 选择外部高速时钟源HSE 选择中断模式触发下降沿有效 默认是上拉输入 添加用户标签为SWITCH 使能NVIC配置 选择编码器模式 分频值设置为2-1 计数值设

    2024年02月12日
    浏览(33)
  • STM32一个定时器同时配置编码器和PWM输出时PWM无法正常输出的原因【避坑】

             最近我在做写代码的时候,因为定时器的资源紧张,就在一个定时器上同时配置了编码器和PWM,发现PWM无法正常输出,查了很久发现网上资料不多,在仔细翻阅手册研究后才发现是 时钟信号 的问题。 具体原因 定时器在设置编码器模式后,计数的时钟源就会变成编

    2024年02月04日
    浏览(44)
  • STM32(HAL)--使用定时器TIM的Encoder Mode来读取旋钮编码器的脉冲数

    目录 一 旋钮编码器相关知识 二 STM32CubeMx配置 三 程序编写 3.1 相关函数介绍 3.2 程序编写 四 实验结果 旋转编码器是一种位置传感器,输出脉冲信号可以用来确定编码器的旋转角度和旋转方向。 编码器中有两个开关,当旋钮旋转后,开关会依次导通,开关结构图如下图所示

    2024年02月15日
    浏览(43)
  • (四) timer+pit(定时器中断)+encoder(编码器)-逐飞TC264库学习(对比STM32 HAL库)

    PIT , 是programmable interval timer 可编程间隔定时器 DSC中的器件 的缩写,所以就是定时器中断,有点像32里的timer(TIMx) 目前看来一共能用通道的有四个 typedef enum // 枚举通道号 {     CCU60_CH0,     CCU60_CH1,     CCU61_CH0,     CCU61_CH1, }pit_index_enum; 因为涉及到中断,为方便设定中断优

    2024年03月15日
    浏览(63)
  • STM32定时器(输入捕获)

     上一章讲了输出比较的内容,输出比较就是定时器自增,同时和CCR比较,按照自己设置的比较要求,输出REF高低电平,这一章我们讲下面结构图输出比较左边部分,也就是 输入捕获 首先,介绍一下输入捕获 IC(input capture)输入捕获,输入捕获模式下,当通道输入引脚出现

    2024年02月09日
    浏览(30)
  • stm32---定时器输入捕获

            在定时器中断实验章节中我们介绍了通用定时器具有多种功能,输入捕获就是其中一种。 STM32F1除了基本定时器TIM6和TIM7,其他定时器都具有输入捕获功能 。输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,通常用于测量输入信号的脉宽、测量

    2024年01月19日
    浏览(38)
  • STM32定时器-输入捕获

    输入捕获工作过程 一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMxCCRx)里面,完成一次捕获。 步骤1:设置输入捕获滤波器(通道1为例) 输入捕获1滤

    2024年02月15日
    浏览(30)
  • stm32 定时器输入捕获实验

    目录 一,简介 二,配置过程  一,设置输入捕获滤波器​ 二,设置输入极性 三,设置输入捕获映射通道  四,设置输入捕获分频器  五,设置中断  ​三,寄存器 四,库函数 五,一般步骤   六,软件部分 输入捕获模式可以用来测量脉冲宽度或者测量频率 原理图 如图  

    2024年01月21日
    浏览(46)
  • 【嵌入式】STM32计时器编码器接口模式使用

    使用STM32调试电机或传感器时经常会使用到计数器的编码器接口模式,本文主要记录该模式的固件库配置方法,并给出使用该模式获取光栅测距值的实例。 硬件: STM32F103C8T6 光栅测距传感器 编码器接口模式为STM32计时器的一种特殊使用模式,该模式下可对编码器输出的脉冲信

    2024年02月20日
    浏览(39)
  • STM32 定时器输入捕获3——捕获超长高电平

            第一章:https://blog.csdn.net/m0_73671341/article/details/134773615?spm=1001.2014.3001.5501         第二章:https://blog.csdn.net/m0_73671341/article/details/134938332?spm=1001.2014.3001.5501         从第一章的定时器捕获我们可以知道,即使把定时器捕获时长设置到最大也只有65.536ms,而第二章就

    2024年01月18日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包