我是靠谱客的博主 冷傲天空,最近开发中收集的这篇文章主要介绍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值。
我这人不喜欢贴代码就习惯码字……

最后

以上就是冷傲天空为你收集整理的STM32定时器捕获编码器模式测速和方向测不准问题的全部内容,希望文章能够帮你解决STM32定时器捕获编码器模式测速和方向测不准问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(127)

评论列表共有 0 条评论

立即
投稿
返回
顶部