带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)
时间:2022-12-09 18:00:00
查看: 14294|回复: 83
高级会员, 积分 891, 还需要离下一级 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
电梯直达
发表于 2019-7-25 20:38:57
|
只看该作者
|只看大图
|倒序浏览
|阅读模式
本帖最后由 1209943162 于 2020-10-11 07:36 编辑
发完第一篇帖子,突然爱上了发帖。发帖的时候发现自己也在总结自己学到的东西,看着密密麻麻的。更重要的是,我很高兴能把我的理解告诉读这篇文章的人,并帮助他们。但是,我还是强调我真的是菜,所以有些地方说错了,希望能理解。 最近,我在学习带霍尔传感器编码器的直流减速电机测速原理。我在网上读了很多帖子,但很少有帖子能让我觉得好。如果很多帖子不知道芯片写源代码,随意解释几句话,然后下载代码发现代码写非常混乱,阅读很差,或各种帖子你复制我复制你,是纸,读帖子,原则是理解,但对于一些细节,但这些细节往往是初学者最令人困惑的地方。我承认,对于一些老板来说,他们很快就能理解,但对于一些初学者来说,这真的很头疼,这样的信息会浪费很多学习时间。
所以,我写下这篇帖子也是想帮助这些初学者,我的代码都是用原子的探索者写的,这样大家都会好看懂一些。看代码的时候,相信你很快就能理解我的解释。但唯一的缺点是,我可能很少解释概念原则,因为我的表达能力真的很差,所以在阅读这篇文章时,如果你甚至不知道编码原理是什么,看看别人的帖子,虽然我上面说一些帖子在纸上,但他们在纸上可以,哈哈,一些原则或非常清楚。废话不多说,开始正题。
用编码器解释什么是直流减速电机:
相信大家都知道直流电机是什么,但偏偏这个东西不仅减速,还配备了编码器。先解释一下为什么要带编码器。毕竟要测速,需要一个传感器来完成这个功能,所以编码器就充当了这个传感器。但有时编码器和电机是分开的,比如做过智能车的朋友就会知道。我们使用的电机使编码器和电机成为一个整体。为什么我们需要减速?学过物理的人应该知道这个公式P=FV,也就是说,当输出功率相同时,力与速度成反比,即电机转速越慢,转动力越大。所以在这个时候,你应该明白为什么当你购买电机时,制造商会有不同的减速比。
解释一个概念:
编码器线数: 就是电机旋转你的A(B)会输出多少脉冲? ,这里的A B它是上面的输出脉冲信号线,它们的A相和B相转发出的脉冲数相同,但有90个°相位差。通常是360线,线数越高,编码器能反应的位置精度越高。因此,如果你想追求精度,试着选择线数越高的电机。
首先,我们的第一步是了解编码器的配置,最重要的是它被称为stm32编码器模式配置的是这一串TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising );什么是编码器模式?如果你不知道,去百度看看别人怎么说。其中使用编码器模式3,编码器模式3是A和B上升和下降沿你的定时器会计一次,你使用模式1或2,定时器只计算A或B上升,但模式3是你的A和B上升和下降一次。假设你的电机线数是360,就是转一圈产生360个脉冲,而你使用编码器模式3后,就会产生360*4个脉冲了。有人可能会问,为什么要这样,那是因为它可以提高分辨率,你想,A相和B相是一个90度的脉冲,这意味着每90度就有一个上升或下降的边缘,这意味着每90度计数一次,当你使用模式1或2时,你只计数一次360度。如果编码器输出有一段时间不正常,A相和B相之间只有90度的差异,此时你的信号不稳定,在此期间,会计数量不正常。使用编码器模式3后,误差会减少4倍。我不知道我是否解释清楚。如果你不明白,在下面留言,我会再说一遍。
然后,让我谈谈我认为非常重要的事情,因为这个问题让我头疼了很长时间,最后找到了很多帖子和信息来理解。定时器的重装载值对计数有什么影响?相信看过很多帖子的人都会知道,定时器的重装载值是(线数-1)*4.然后有很多代码。他的重装载值为65535-1,少数代码为其他值。当我看到这些代码时,我想知道为什么它们的重装值不同。然而,最后,他们都说他们可以完成速度测量。我试过。如果我改变重装值,计数会有所不同。最后,我终于看到了一篇文章。在那篇文章的后面,有人问房东重装值的问题,然后房东谈到了重装载值对计数的影响。我放下这篇文章的网站。我建议不懂的人可以看看https://blog.csdn.net/wxc971231/ ... 322957#commentsedit 如果你的电机转1圈产生800个脉冲,而你的重装载值为1,那么你最多可以记录A相和B相的脉冲数。也就是说,当你的电机转动时,你的定时器会溢出800次。如果你的重载值是400,你的电机会溢出2次。在这里,你可能会明白为什么四倍频时那里的重装载是(线数-1)*4.你想,我之前说过,你使用编码器模式3,脉冲数是你的线数*4.这意味着当你转身时,脉冲数正好是你定时器溢出的时候。这样,如果您的定时器打开溢出中断,则溢出一次意味着您的电机转动,此时,您使用另一个定时器定时为1s,计录1s内溢次数,这样你就可以得到你的电机1s转圈数。这样,如果您的定时器打开溢出中断,则溢出一次意味着您的电机转动,此时,您使用另一个定时器定时为1s,计录1s内溢次数,这样你就可以得到你的电机1s旋转的圆数。当然,如果只测量速度,数据误差会很大,因为这种方法只能测量整个圆数,如果你的转数是每秒1.5圈,所以这种方法不好。例如,如果您的重装载值为(360-1)*4,这样你1秒转1.5圈就计数360*但是你的重装值是(360-1)*4.所以此时你的定时器只溢出一次,此时的定时器计值为360*2.将脉冲数转换为360*6.你认为你的电机线数是360,编码器模式3是转一圈产生360*4个脉冲,这个速度是(360*6)/(360*4)精度会好很多。至于如何获得脉冲值,你可以看看我的代码。如果你不明白,你可以在下面问我。至于如何获得具体的脉冲值,你可以看看我的代码。如果你不明白,你可以在下面问我。我建议你是测量速度定时还是不是1秒,因为我认为是1s记录的脉冲累积误差可能比较大,所以你定时定点,比如5ms,这样你以后就可以转换了。最后,再提下为何一些代码重装载值65535也行,你想,你转一圈,产生360*四个脉冲,如果你在1秒内转8圈,即在1秒内产生360*4*只要这个值不超过你的溢出值,你只需要在开始时清除计数器,然后开始计数。计时1秒后,记下此时的脉冲数,清除计数器,然后使用我上面的计算方法。记住,你的重装值实际上可以是多少,但其他人使用65535和(360-1)*4只是计算方便。我再举个例子。如果你的重装载值是2,你可以转一圈产生360*四个脉冲意味着你转一圈产生360*两次溢出,用另一个定时器定时1秒,记录1秒s如果溢出次数为360,*6次,这个速度是(360*6)/(360*4)。
如果你不明白,请在下面留言。如果有人发现我说错了什么,我希望有人能告诉我。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割线
2020.3.15
让我谈谈带有编码器的直流减速电机的速度测量原理。首先,我们必须明白,电机旋转一圈会产生脉冲,一圈能产生多少脉冲取决于电机的编码器线数。线数越高,精度越高。至于脉冲的原因,这就是编码器传感器的原理。我不说这个。
由于电机旋转一圈可以产生脉冲,我们可以记录一段时间产生的脉冲数来计算速度。如何检测和记录单片机脉冲的数量是我们的重点。我想在这里提一件事——定时器。我们用定时器定相应的时间?首先是设置预分频系数,将主频时钟分频,假设主频时钟168MHZ,如果你的预分频系数是168,分频后的时钟频率是1MHZ(频率倒数是周期,这里是1us),此时TIMx_CNT 寄存器,即定时器的计数器是按照这个频率(即10us)递增的。如果重装载值为10,则定时器的最终固定时间为10us。
从上面的例子可以看出,此时TIMx_CNT 寄存器的值增加是由内部时钟频率引起的,时钟频率无非是脉冲。嗯,我们能用这个寄存器记录编码器产生的脉冲吗?这是真的,但是如何增加内部时钟呢?TIMx_CNT 由于外部时钟的增加,将寄存器改为?这就是为什么我们需要使用正交编码模式。至于为什么使用正交编码模式,我不知道。不管怎样,我知道这个过程可以通过使用正交编码模式来实现。
我以前谈过重装载值对我们的影响。现在你知道我们对预分频系数的影响了吗?原来预分频系数分的内部时钟,现在分频系数分的是外部时钟。为什么我代码中的预分频系数是1?其他数字可以吗?当然可以,但没必要。因为你现在要记录电机旋转一圈产生的真实脉冲数。如果预分频系数为2,假设电机旋转一圈产生200个脉冲,此时单片机只能记录100个脉冲。
实际啊,其实直流减速电机测速度的本质很简单,以前我们定时器初始化设置重装载值和与分频系数时是基于部时钟而定的。而现在是基于外部时钟而定的,这个外部时钟就是编码器产生的脉冲。
顺带提下,我这份代码只能测正转或者反转,如果想正反转都能测(当然实际工程就需要这样),去看下17楼,那里我讲了下思路。这是其中一个思路,这里我还想说下另外一个思路,通过定时器的TIMx_CR寄存器的第四位DIR标志位来判断。
11111.png (27.16 KB, 下载次数: 0)
2020-3-15 15:45 上传
,而我目前修改后的代码用的就是这个思路。
我修改后的代码也会传上来,但是由于我没有实物,我无法测试,我不知道我修改的代码究竟实际能不能成功,所以这个代码只供参考用。
2020-3-15 16:15 上传
点击文件名下载附件
2019-7-25 20:38 上传
点击文件名下载附件
11.14 MB, 下载次数: 5156
新手上路, 积分 48, 距离下一级还需 2 积分
积分金钱48
注册时间2019-6-30
在线时间9 小时
发表于 2019-7-25 20:52:17
|
只看该作者
老哥 讲的很透彻,我喜欢实战派,不喜欢理论派,嘿嘿:
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-8-4 17:47:24
|
只看该作者
emmm,我没懂你的意思,Current_Count - Previous_Count和-Previous_Count+Current_Count不是一样的么........我先讲你这里为啥这样,看能帮助你理解不
Enc_Timer_Overflow_one是溢出的次数,这个相信你能理解,即脉冲数为Enc_Timer_Overflow_one*4*ENCODER_PPR。我们先假定此时定时器计数器的值为200,即Previous_Count=200,而你这时开始记录脉冲,溢出了2次,而你此时定时器计数器的值为300,即Current_Count=300,那么你记录的脉冲值就不仅仅只是Enc_Timer_Overflow_one*4*ENCODER_PPR了,而是还需要加上Current_Count-Previous_Count。
当前离线积分
新手上路, 积分 34, 距离下一级还需 16 积分
积分金钱34
注册时间2019-7-21
在线时间13 小时
发表于 2019-8-3 17:24:06
|
只看该作者
大佬 还有这里我不太理解 我知道前面算的是电机转的圈数,但是后面除以0.05是什么意思啊? 怎么跟速度联系起来了?
2019-8-3 17:21 上传
中级会员, 积分 272, 距离下一级还需 228 积分
积分金钱272
注册时间2019-5-27
在线时间66 小时
发表于 2019-7-26 08:28:21
|
只看该作者
多谢分享
初级会员, 积分 79, 距离下一级还需 121 积分
积分金钱79
注册时间2019-6-8
在线时间30 小时
发表于 2019-7-26 09:46:37
|
只看该作者
多谢分享
新手上路, 积分 29, 距离下一级还需 21 积分
积分金钱29
注册时间2019-2-27
在线时间6 小时
发表于 2019-7-26 10:17:46
|
只看该作者
不懂就问:想问一下up主,在TIM_EncoderInterfaceConfig的时候,声明的是TI1的上升沿和TI2的上升沿(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising ),那么它应该是在每一次TI1的上升沿和TI2的上升沿记录一次脉冲吧,应该不包括下降沿的。
然后想问一下编码器模式和输入捕获之间的关系,或者说,输入捕获时定时器设置的自动重装载值(up主已经解释了)和预分频系数的作用以及他们对编码器的影响。
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-7-26 15:11:56
|
只看该作者
先说你的第一个问题:相信你在找正交编码模式资料的时候你看到最多的是这两张图
~04P4_W@0Z5OEE5Q@4K3IK1.png (12.7 KB, 下载次数: 16)
2019-7-26 12:19 上传
6QGORAMYD%_W~F183VH1Y]1.png (32.3 KB, 下载次数: 4)
2019-7-26 12:19 上传
对于第二张表格可能有很多人就直接跳过,没怎么去分析它(当初我也一样),后来有人告诉我怎么去分析这张表我才知道才怎么去分析。因为我表达能力不好,所以我直接粘贴复制别人的回答:我先放下他的帖子:https://blog.csdn.net/zoe512622789/article/details/54378948
8J0_FO929XN~EC{N1UV$C}P.png (21.58 KB, 下载次数: 6)
2019-7-26 14:51 上传
看过解释过后,你再去分析编码器模式3的时候你就会发现,在TI1和TI2上升沿和下降沿都在递增。
然后就是第二问题:
首先我们先分析普通定时器的重装载值和预分频系数的作用,普通定时器的时候,假设时钟频率84MHZ,重装载为10,预分频为84000000,这样系统时钟预分频过后的频率就为1HZ,就是1s递增一次,而你的重装载值为10,所以就要递增10次,也就是10s,那么你的定时中断时间就为10s。所以,普通定时器的预分频系数分频的是系统时钟的频率,然而正交编码模式下,你预分频系数分频的是A相或者B相的频率。在你不分频的时候,定时器的计数器就会按照A相或者B相的频率递增,即有一个下降沿或者上升沿就递增一次。然而你改了预分频系数过后,假设为2,你的A相或者B相的频率就会为原来的一半,这样本来是一个脉冲计数一次,然而现在就为2个脉冲计数一次。说白了,正交编码模式下,你输入的时钟频率是AB相的频率而不是系统时钟频率。所以,假如你该我的代码的时候,将预分频系数改为2的话,你会发现比原来的计数值少了一半。
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-7-29 00:14:17
来自手机
|
只看该作者
https://blog.csdn.net/weixin_44692935/article/details/97419594推荐一篇帖子,讲的很很细致,很适合一些原理性知识还不怎么了解的初学者,而且不懂的可以问这个楼主,很热心的一位楼主
新手上路, 积分 29, 距离下一级还需 21 积分
积分金钱29
注册时间2019-2-27
在线时间6 小时
发表于 2019-7-29 10:52:51
|
只看该作者
嗯,很感谢你的回复,不好意思现在才看到你的回复,没能及时回复你。
但是在你帖子留言之后我自己又去琢磨了很久,自己最后也把它弄明白了。跟你回复的应该是同一个意思。我发了个帖子,你看看我的理解对不对。
http://www.openedv.com/thread-297679-1-1.html
当前离线积分
新手上路, 积分 34, 距离下一级还需 16 积分
积分金钱34
注册时间2019-7-21
在线时间13 小时
发表于 2019-8-3 16:48:11
|
只看该作者
大佬 我拜读了您的代码 这里算一段时间转过的脉冲数 不知道是不是我理解错了 前面这里Current_Count - Previous_Count是不是应该写成:重装载值-Previous_Count+Current_Count,也就是除了算溢出的这一部分。javascript:;
2019-8-3 16:42 上传
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-8-4 17:51:47
|
只看该作者
我定时器定时的是50ms,就是说我记录的是50ms的脉冲数,你要算速度的话,即每秒转多少圈,你就要把50ms记录的脉冲数除以50ms,就得到了每秒转过的圈数
当前离线积分
新手上路, 积分 34, 距离下一级还需 16 积分
积分金钱34
注册时间2019-7-21
在线时间13 小时
发表于 2019-8-5 00:05:23
|
只看该作者
哦!!我想明白了,既然要溢出的话,那么也必然包括从200这一次计时开始。而无论最后的Current_Count以及之前的Previous_Count谁大谁小,用Current_Count-Previous_Count都是正确的,大了就加上,小了就减掉。真心感谢!
当前离线积分
新手上路, 积分 34, 距离下一级还需 16 积分
积分金钱34
注册时间2019-7-21
在线时间13 小时
发表于 2019-8-5 00:26:16
|
只看该作者
我真白痴,哈哈哈,没看到您还有个定时器5在计时,而且得出的结果是在TIM5的溢出中断里面的。 我还有最后一个问题,拜托大佬再帮我解答一下(感激不尽啊):就是你之前解释的那个关于配置编码器TI1FP1信号以及TI2FP2信号只在上升沿计数的问题,对应到上面那张表上面的的话(也就是先不看二者的下降沿部分),那结果应该是只在二者的上升沿计数啊,也就是分辨率提升了一倍,而不是变成四倍啊,看了您之前的解释,我还是没明白(对不起,我有点笨)。。。
新手上路, 积分 48, 距离下一级还需 2 积分
积分金钱48
注册时间2018-8-9
在线时间19 小时
发表于 2019-8-6 16:38:39
|
只看该作者
楼主,我想请问下编码器的正反相需要自己设置吗?没有看到有关的设置啊,是根据接线确定的吗?还是说板子自己判定先出现信号的为正方向呢?比如我先顺时针扭一下,再逆时针扭一下,计数器之后就会在顺时针加值逆时针减值吗?还有就是如果计数器减值减到0之后,我再往反相扭,计数值会变成最大吗?我自己试了下感觉方向是固定的,我设置当脉冲数够一圈LED就会闪,我开头往反方向扭一小下灯直接就闪了。。。
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-8-6 20:17:18
|
只看该作者
正交编码模式1和2只会在TI1FP1信号或者TI2FP2上升沿计数,而正交编码模式3在TI1FP1信号和TI2FP2上升沿和下降沿都会计数,相比正交编码模式1和2来说在一个脉冲周期内只递增了一次,而正交编码模式3却在一个脉冲周期递增了四次。而我设置的真好是正交编码模式3.你可以再仔细的分析下那张表,我实在不好表达,只能靠你去分析,分析好了,你会发现在正交编码模式3时两者的上升沿和下降沿确实都在递增
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-8-6 20:25:42
|
只看该作者
emm,这个是我的错,我这份代码只能测正转或者反转,如果想要又能测反转又能正转的话,得稍微改一下代码。举个例子:你假如定时器重装载值为65535,你记录50ms内的脉冲数,你正转的话,就能测到10个脉冲,而你反转的话按照我的代码来看就是65535-10个脉冲,你会发现,反转的脉冲值就是你的重装载值减去你应该得到的脉冲数。所以这时候你得做下处理,就是说你要做个判断,比如如果脉冲数大于65535/2,就用65535-你得到的脉冲数,按照上面的例子来说就是65535-10-65535,这样你就能得到反转的脉冲数了。
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-8-6 20:30:30
|
只看该作者
emmm,大家用这份代码时,可能只能测反转或者正转,如果想要两者都能测的话,可以看下我后面的回复,我有讲解了思路,等我这段时间忙完,我会发一个正反转都能测得
中级会员, 积分 277, 距离下一级还需 223 积分
积分金钱277
注册时间2019-5-16
在线时间30 小时
发表于 2019-8-21 10:36:11
|
只看该作者
楼主讲的很好,小白很受用!!!
还有个问题:
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising )
请问这个函数选择模式3之后,在AB相上升沿和下降沿都会检测,那么后面两个通道的记性设置又是为了设置什么?这里我还有疑问,请大佬提点一下。谢谢。
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-8-23 13:47:59
|
只看该作者
说实话我也不太清楚,我个人理解设置是为了设置捕获极性为上升沿,就是说在上升沿来的时候计数一次,而为何下降沿也会计数呢,我个人认为是stm32芯片里面的一些信号处理,使得下降沿反向,把下降沿变成了上升沿,从而把下降沿也当成的上升沿。具体想知道为什么,你只有去查阅资料了。
高级会员, 积分 623, 距离下一级还需 377 积分
积分金钱623
注册时间2019-6-3
在线时间107 小时
发表于 2019-8-23 14:41:56
|
只看该作者
感谢分享,很不错的资料讲解,
中级会员, 积分 277, 距离下一级还需 223 积分
积分金钱277
注册时间2019-5-16
在线时间30 小时
发表于 2019-8-23 20:11:01
|
只看该作者
这个函数我弄明白了,查看中文参考手册里面(表75),后面两个参数就是设置的计数的时候另一个通道的标志,这个函数就是设置的表75,楼主需要的话可以对着看一下。
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-8-26 11:21:35
|
只看该作者
哈哈,谢谢
当前离线积分
初级会员, 积分 52, 距离下一级还需 148 积分
积分金钱52
注册时间2019-8-12
在线时间24 小时
发表于 2019-8-26 18:52:18
|
只看该作者
楼主牛皮,,,
初级会员, 积分 150, 距离下一级还需 50 积分
积分金钱150
注册时间2018-5-17
在线时间45 小时
发表于 2019-9-11 19:46:56
|
只看该作者
楼主请问,你算的是每秒转多少圈,如果换成每分钟多少圈,比如每秒1圈1min就是60圈,每秒2圈1min就是120圈,结果不全是60的整数倍了吗?我想看到结果是50圈、51圈,是不是就算不出来?
当前离线积分
初级会员, 积分 52, 距离下一级还需 148 积分
积分金钱52
注册时间2019-8-12
在线时间24 小时
发表于 2019-9-12 13:03:28
|
只看该作者
学习 牛!!!!!!
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-9-12 19:16:44
|
只看该作者
这个每秒几圈并不是你想要它什么速度就是什么速度,这个速度是由你给直流减速电机所加电压和它自己的减速比决定的。你只能通过代码去测它的速度,而不是去决定它的速度。
高级会员, 积分 685, 距离下一级还需 315 积分
积分金钱685
注册时间2019-6-6
在线时间87 小时
发表于 2019-9-16 16:30:52
|
只看该作者
首先非常感谢楼主分享的经验,并且也理解楼主说的计数四次。但是还是想追问一下如果都设置成Botheage会怎么样,望楼主解惑。
1.png
(3.3 KB, 下载次数: 20)
2019-9-16 16:29 上传
不会就要俯身倾耳以请啊,博客地址:https://blog.csdn.net/qq_39521541?spm=1001.2101.3001.5343
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-9-17 10:24:29
来自手机
|
只看该作者
Advent 发表于 2019-9-16 16:30
首先非常感谢楼主分享的经验,并且也理解楼主说的计数四次。但是还是想追问一下如果都设置成Botheage会怎么 ...
这个我没有试过,所以我也不知道怎么给你说。但是我有两个我觉得可行方法。第一个就是用示波器看波形与串口打印数据配合,经过多次实验得出经验,总结出结果。第二个就是查32的数据手册,这些应该在里面都讲了,只是可能有点难找。
高级会员, 积分 685, 距离下一级还需 315 积分
积分金钱685
注册时间2019-6-6
在线时间87 小时
发表于 2019-9-17 14:46:41
|
只看该作者
thanks
不会就要俯身倾耳以请啊,博客地址:https://blog.csdn.net/qq_39521541?spm=1001.2101.3001.5343
高级会员, 积分 685, 距离下一级还需 315 积分
积分金钱685
注册时间2019-6-6
在线时间87 小时
发表于 2019-9-17 20:44:43
|
只看该作者
网上的大部分编码器的程序如图所示,但是我觉得在捕获初始化的时候有问题,明显是只初始化了定时器的一个通道,楼主应该也发现过这个问题把?还是只初始化一个捕获通道就行呢?我看楼主的程序是初始化两个通道的。
3.png
(10.67 KB, 下载次数: 17)
2019-9-17 20:42 上传
不会就要俯身倾耳以请啊,博客地址:https://blog.csdn.net/qq_39521541?spm=1001.2101.3001.5343
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-9-19 11:28:19
来自手机
|
只看该作者
Advent 发表于 2019-9-17 20:44
网上的大部分编码器的程序如图所示,但是我觉得在捕获初始化的时候有问题,明显是只初始化了定时器的一个通 ...
直流减速电机的编码器有两个输出口,A相和B相,你如果只初始化一个通道就只能检测一个相位的方波。
当前离线积分
初级会员, 积分 86, 距离下一级还需 114 积分
积分金钱86
注册时间2019-4-30
在线时间23 小时
发表于 2019-9-20 20:14:32
|
只看该作者
初级会员, 积分 73, 距离下一级还需 127 积分
积分金钱73
注册时间2019-8-30
在线时间24 小时
发表于 2019-9-27 09:29:11
|
只看该作者
楼主是不是没有用到LCD显示呀~
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-9-27 09:44:10
|
只看该作者
新手上路, 积分 22, 距离下一级还需 28 积分
积分金钱22
注册时间2019-9-16
在线时间5 小时
发表于 2019-9-28 21:12:41
来自手机
|
只看该作者
看到了一半,先来谢谢你
初级会员, 积分 167, 距离下一级还需 33 积分
积分金钱167
注册时间2019-9-4
在线时间19 小时
发表于 2019-10-25 20:19:26
|
只看该作者
感谢楼主
新手上路, 积分 28, 距离下一级还需 22 积分
积分金钱28
注册时间2019-10-30
在线时间8 小时
发表于 2019-11-21 12:25:51
|
只看该作者
楼主,我有一个问题想问一下
就是我用你的代码在测试的时候打印在串口上的时候会出现 变化很大的值 比如脉冲数大部分是三千多 有一个数是五千多 这是什么原因啊
中级会员, 积分 310, 距离下一级还需 190 积分
积分金钱310
注册时间2019-1-3
在线时间40 小时
发表于 2019-11-21 15:55:25
|
只看该作者
楼主,我想问一下 假如你的电机线数是360,就是转一圈产生360个脉冲,而你用了编码器模式3后,就产生390*4个脉冲了。 这句话的390*4是怎么得到的我没理解
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-11-21 16:29:49
|
只看该作者
你可以去6楼看我的评论,我有讲解为什么编码器模式3的脉冲数是4倍。你好好分析那张图就可以分析出编码器模式3下的确A和B相的脉冲都在计数。
中级会员, 积分 310, 距离下一级还需 190 积分
积分金钱310
注册时间2019-1-3
在线时间40 小时
发表于 2019-11-21 17:36:53
|
只看该作者
我理解的应该是360*4才对,你上边写的390*4 并且代码里也是用390算得 不知道是不是搂主的笔误,还是我没理解对
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-11-21 19:09:17
|
只看该作者
呃,我的锅。帖子上我用的是线数为360的减速电机举的例子。而我代码中用的减速电机的线数为390。emm,总之你记住编码器模式3下,转一圈产生的脉冲数就为你直流减速电机的线数乘4。
中级会员, 积分 310, 距离下一级还需 190 积分
积分金钱310
注册时间2019-1-3
在线时间40 小时
发表于 2019-11-21 19:22:33
|
只看该作者
好的,谢谢楼主解答
中级会员, 积分 310, 距离下一级还需 190 积分
积分金钱310
注册时间2019-1-3
在线时间40 小时
发表于 2019-11-22 15:47:34
|
只看该作者
楼主,还要麻烦您解答一下: TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising );//编码器配置(定时器、编码模式、上升沿、上升沿) 看了上边六楼的解释,我还是没理解这段代码后边设置的两个上升沿是什么意思,我认为应该设置边沿触发(TIM_ICPolarity_BothEdge)才对.
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-11-22 17:11:33
|
只看该作者
这个就是你得到的脉冲数是线数*4的原因,这一步设置的就是编码器模式3。在编码器模式3下,你看懂那个图后,你会发现A相和B相不管是在上升沿也好还是下降沿也好,都在递增。而在编码器1和2下,只会在A相或者B相下的上升沿递增。
新手上路, 积分 28, 距离下一级还需 22 积分
积分金钱28
注册时间2019-10-30
在线时间8 小时
发表于 2019-12-12 21:42:27
|
只看该作者
串口打印的脉冲数出现了负数 什么原因 就是我一旦将定时器设置的时间改小 也就是由1s改为100ms时串口打印的脉冲数就为负数 这是什么问题啊 求教
新手上路, 积分 28, 距离下一级还需 22 积分
积分金钱28
注册时间2019-10-30
在线时间8 小时
发表于 2019-12-12 21:52:38
|
只看该作者
我将定时的时间由1s改为了100ms结果打印在串口上的脉冲数出现了负数 怎么办啊
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-12-14 19:16:29
来自手机
|
只看该作者
孙晓天123 发表于 2019-12-12 21:52
我将定时的时间由1s改为了100ms结果打印在串口上的脉冲数出现了负数 怎么办啊
如果1s是正数,100ms是负数的话,说明就是程序哪里出了问题,这个问题只有看你自己才行。我这份程序有个bug,就是反转的时候是负数,然后这样的解决方法我在前面说过,你可以翻一下。
初级会员, 积分 73, 距离下一级还需 127 积分
积分金钱73
注册时间2019-8-30
在线时间24 小时
发表于 2019-12-23 17:15:27
|
只看该作者
楼主,想请教一下,如果想在你的程序里面加入一个PID调速的程序,放在什么位置合适一些
高级会员, 积分 891, 距离下一级还需 109 积分
积分金钱891
注册时间2019-4-22
在线时间199 小时
楼主|
发表于 2019-12-25 20:54:03
|
只看该作者
就放在我程序里面的那个定时器5中断里面,里面得到你的速度过后,即得到你想要的数据后,不就可以进行pid么