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. 编码器及输出波形

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

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

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

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

  • 18
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:根据引用内容,你提到了在使用定时器编码器模式进行测速时遇到了问题。你发现在低速时计数器不涨,只有在高速时才涨。你怀疑是定时器编码器模式问题。你还提到了使用的是STM32F103芯片,TIM2、3、4、5的CH1、2分别接四个直流电机霍尔编码器的A/B信号,并开启了四个TIM的编码器模式捕获。你还尝试了拧轮子来试,发现计数值不符合预期。你希望了解关于定时器编码器捕获脉冲问题。 回答: 定时器编码器模式用于量旋转物体的速度和方向。根据你的描述,你使用了STM32F103芯片的定时器编码器模式量直流电机霍尔编码器脉冲。然而,你发现在低速时计数器不涨,只有在高速时才涨。这可能是由于编码器模式的设置不正确导致的。你可以检查以下几个方面来解决这个问题: 1. 确保编码器的接线正确。A/B信号应正确连接到定时器的CH1/CH2引脚。 2. 检查定时器编码器模式设置。确保计数模式设置为增量模式,并选择正确的计数方向。 3. 检查定时器计数器上下限值设置。确保上限值设置为最大值,起始值设置为适当的中间值。 4. 检查定时器的时钟源和预分频器设置。确保时钟源和预分频器设置正确,以确保计数器的计数频率正确。 5. 检查定时器的中断设置。确保捕获中断和溢出中断的优先级设置正确,并正确处理中断事件。 通过仔细检查和调整这些设置,你应该能够解决定时器编码器捕获脉冲问题。如果问题仍然存在,你可以参考STM32的官方文档或咨询STM32的技术支持团队以获取更详细的帮助。 #### 引用[.reference_title] - *1* *2* *3* [STM32定时器捕获编码器模式测速方向不准问题](https://blog.csdn.net/jjk_a/article/details/128302323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值