OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 47965|回复: 98

带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)

  [复制链接]

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
发表于 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   这里面的重装载值就是你最多能记录A相和B相的脉冲数,假如你的电机转1圈产生800个脉冲,而你的重装载值为1,就是说你电机转一圈,你的定时器会溢出800次,假如你重装载值为400,那么你电机转一圈,你的定时器就会溢出2次。这里大家可能就明白为何四倍频时那里的重装载为(线数-1)*4,你想,我前面讲了,你用编码器模式3,产生的脉冲数就是你的线数*4,这样意思就说,你转一圈,产生的脉冲数恰好是你定时器溢出的时候。这样,假如你定时器开启溢出中断,这样溢出一次就代表你电机转了一圈,而你这时,再用另一个定时器定时为1s,计录1s内溢出的次数,这样就能得到你的电机1s转过的圈数了。当然只是这样测速的话,得到的数据误差会很大,因为这种方法只能测到整圈数,万一你的转数是每秒1.5圈呢,这样这种方法就不行了。还是举例说明,假如你的重装载值为(360-1)*4,这样你1秒转1.5圈就计数360*6次,然而你的重装值是(360-1)*4,所以这时你的定时器只溢出一次,并且此时的定时器计数值为360*2,转换成脉冲数也就是360*6,你想你的电机线数是360,用的编码器模式3,就是转一圈产生360*4个脉冲,这样的速度就为(360*6)/(360*4),这样精度就会好很多。至于怎么具体得到脉冲值的,大家可以看下我的代码,如果不懂,可以在下面问我。我建议你要测速定时还是不要1秒,因为我觉得定1s记录的脉冲累计误差可能会比较大,所以你把定时器定时定小点,比如5ms,这样你后面在转换下就行了。最后,再提下为何一些代码重装载值65535也行,你想,你转一圈,产生360*4个脉冲,假如你1秒转8圈,也就是1秒产生360*4*8个脉冲,只要这个值不超过你的溢出值,那么你只需要在最开始时,将计数器清零,然后开始计数,计时1秒后,记下此时的脉冲数,又将计数器清零,然后再用我上面的计算方法就可以了。记住,你的重装值其实为多少都可以,只是别人用65535和(360-1)*4只是计算时方便而已,我再举个例子,假如你重装载值为2,你转一圈产生360*4个脉冲,就是说你转一圈产生360*2次溢出,你用再一个定时器定时1秒,记录1s被溢出的次数,假如溢出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 ,而我目前修改后的代码用的就是这个思路。
我修改后的代码也会传上来,但是由于我没有实物,我无法测试,我不知道我修改的代码究竟实际能不能成功,所以这个代码只供参考用。
带编码器的直流减速电机代码(正反转版).zip (5.57 MB, 下载次数: 3115)

带编码器的直流减速电机.zip

11.14 MB, 下载次数: 6775

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2019-6-30
在线时间
9 小时
发表于 2019-7-25 20:52:17 | 显示全部楼层
老哥 讲的很透彻,我喜欢实战派,不喜欢理论派,嘿嘿:
回复 支持 6 反对 0

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-7-21
在线时间
20 小时
发表于 2019-8-3 17:24:06 | 显示全部楼层
大佬   还有这里我不太理解    我知道前面算的是电机转的圈数,但是后面除以0.05是什么意思啊?  怎么跟速度联系起来了?
QQ截图20190803172015.png
回复 支持 3 反对 0

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-7-26 15:11:56 | 显示全部楼层
how2051 发表于 2019-7-26 10:17
不懂就问:想问一下up主,在TIM_EncoderInterfaceConfig的时候,声明的是TI1的上升沿和TI2的上升沿(TIM3,TI ...

先说你的第一个问题:相信你在找正交编码模式资料的时候你看到最多的是这两张图 ~04P4_W@0Z5OEE5Q@4K3IK1.png 6QGORAMYD%_W~F183VH1Y]1.png
对于第二张表格可能有很多人就直接跳过,没怎么去分析它(当初我也一样),后来有人告诉我怎么去分析这张表我才知道才怎么去分析。因为我表达能力不好,所以我直接粘贴复制别人的回答:我先放下他的帖子:https://blog.csdn.net/zoe512622789/article/details/54378948   
8J0_FO929XN~EC{N1UV$C}P.png 看过解释过后,你再去分析编码器模式3的时候你就会发现,在TI1和TI2上升沿和下降沿都在递增。
然后就是第二问题:
首先我们先分析普通定时器的重装载值和预分频系数的作用,普通定时器的时候,假设时钟频率84MHZ,重装载为10,预分频为84000000,这样系统时钟预分频过后的频率就为1HZ,就是1s递增一次,而你的重装载值为10,所以就要递增10次,也就是10s,那么你的定时中断时间就为10s。所以,普通定时器的预分频系数分频的是系统时钟的频率,然而正交编码模式下,你预分频系数分频的是A相或者B相的频率。在你不分频的时候,定时器的计数器就会按照A相或者B相的频率递增,即有一个下降沿或者上升沿就递增一次。然而你改了预分频系数过后,假设为2,你的A相或者B相的频率就会为原来的一半,这样本来是一个脉冲计数一次,然而现在就为2个脉冲计数一次。说白了,正交编码模式下,你输入的时钟频率是AB相的频率而不是系统时钟频率。所以,假如你该我的代码的时候,将预分频系数改为2的话,你会发现比原来的计数值少了一半。


回复 支持 1 反对 0

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-8-4 17:47:24 | 显示全部楼层
一念花开 发表于 2019-8-3 16:48
大佬 我拜读了您的代码   这里算一段时间转过的脉冲数    不知道是不是我理解错了   前面这里Current_Count ...

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。
回复 支持 1 反对 0

使用道具 举报

12

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-5-27
在线时间
74 小时
发表于 2019-7-26 08:28:21 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-6-8
在线时间
41 小时
发表于 2019-7-26 09:46:37 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
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主已经解释了)和预分频系数的作用以及他们对编码器的影响。
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-7-29 00:14:17 来自手机 | 显示全部楼层
https://blog.csdn.net/weixin_44692935/article/details/97419594推荐一篇帖子,讲的很很细致,很适合一些原理性知识还不怎么了解的初学者,而且不懂的可以问这个楼主,很热心的一位楼主
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-2-27
在线时间
6 小时
发表于 2019-7-29 10:52:51 | 显示全部楼层
1209943162 发表于 2019-7-26 15:11
先说你的第一个问题:相信你在找正交编码模式资料的时候你看到最多的是这两张图
对于第二张表格可能有很 ...

嗯,很感谢你的回复,不好意思现在才看到你的回复,没能及时回复你。
但是在你帖子留言之后我自己又去琢磨了很久,自己最后也把它弄明白了。跟你回复的应该是同一个意思。我发了个帖子,你看看我的理解对不对。
http://www.openedv.com/thread-297679-1-1.html
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-7-21
在线时间
20 小时
发表于 2019-8-3 16:48:11 | 显示全部楼层
大佬 我拜读了您的代码   这里算一段时间转过的脉冲数    不知道是不是我理解错了   前面这里Current_Count - Previous_Count是不是应该写成:重装载值-Previous_Count+Current_Count,也就是除了算溢出的这一部分。javascript:;
QQ截图20190803164145.png
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-8-4 17:51:47 | 显示全部楼层
一念花开 发表于 2019-8-3 17:24
大佬   还有这里我不太理解    我知道前面算的是电机转的圈数,但是后面除以0.05是什么意思啊?  怎么跟速 ...

我定时器定时的是50ms,就是说我记录的是50ms的脉冲数,你要算速度的话,即每秒转多少圈,你就要把50ms记录的脉冲数除以50ms,就得到了每秒转过的圈数
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-7-21
在线时间
20 小时
发表于 2019-8-5 00:05:23 | 显示全部楼层
1209943162 发表于 2019-8-4 17:47
emmm,我没懂你的意思,Current_Count - Previous_Count和-Previous_Count+Current_Count不是一样的么... ...

哦!!我想明白了,既然要溢出的话,那么也必然包括从200这一次计时开始。而无论最后的Current_Count以及之前的Previous_Count谁大谁小,用Current_Count-Previous_Count都是正确的,大了就加上,小了就减掉。真心感谢!
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-7-21
在线时间
20 小时
发表于 2019-8-5 00:26:16 | 显示全部楼层
1209943162 发表于 2019-8-4 17:51
我定时器定时的是50ms,就是说我记录的是50ms的脉冲数,你要算速度的话,即每秒转多少圈,你就要把50ms记 ...

我真白痴,哈哈哈,没看到您还有个定时器5在计时,而且得出的结果是在TIM5的溢出中断里面的。   我还有最后一个问题,拜托大佬再帮我解答一下(感激不尽啊):就是你之前解释的那个关于配置编码器TI1FP1信号以及TI2FP2信号只在上升沿计数的问题,对应到上面那张表上面的的话(也就是先不看二者的下降沿部分),那结果应该是只在二者的上升沿计数啊,也就是分辨率提升了一倍,而不是变成四倍啊,看了您之前的解释,我还是没明白(对不起,我有点笨)。。。
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-9
在线时间
19 小时
发表于 2019-8-6 16:38:39 | 显示全部楼层
楼主,我想请问下编码器的正反相需要自己设置吗?没有看到有关的设置啊,是根据接线确定的吗?还是说板子自己判定先出现信号的为正方向呢?比如我先顺时针扭一下,再逆时针扭一下,计数器之后就会在顺时针加值逆时针减值吗?还有就是如果计数器减值减到0之后,我再往反相扭,计数值会变成最大吗?我自己试了下感觉方向是固定的,我设置当脉冲数够一圈LED就会闪,我开头往反方向扭一小下灯直接就闪了。。。
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-8-6 20:17:18 | 显示全部楼层
一念花开 发表于 2019-8-5 00:26
我真白痴,哈哈哈,没看到您还有个定时器5在计时,而且得出的结果是在TIM5的溢出中断里面的。   我还有最 ...

正交编码模式1和2只会在TI1FP1信号或者TI2FP2上升沿计数,而正交编码模式3在TI1FP1信号和TI2FP2上升沿和下降沿都会计数,相比正交编码模式1和2来说在一个脉冲周期内只递增了一次,而正交编码模式3却在一个脉冲周期递增了四次。而我设置的真好是正交编码模式3.你可以再仔细的分析下那张表,我实在不好表达,只能靠你去分析,分析好了,你会发现在正交编码模式3时两者的上升沿和下降沿确实都在递增
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-8-6 20:25:42 | 显示全部楼层
s710618781 发表于 2019-8-6 16:38
楼主,我想请问下编码器的正反相需要自己设置吗?没有看到有关的设置啊,是根据接线确定的吗?还是说板子自 ...

emm,这个是我的错,我这份代码只能测正转或者反转,如果想要又能测反转又能正转的话,得稍微改一下代码。举个例子:你假如定时器重装载值为65535,你记录50ms内的脉冲数,你正转的话,就能测到10个脉冲,而你反转的话按照我的代码来看就是65535-10个脉冲,你会发现,反转的脉冲值就是你的重装载值减去你应该得到的脉冲数。所以这时候你得做下处理,就是说你要做个判断,比如如果脉冲数大于65535/2,就用65535-你得到的脉冲数,按照上面的例子来说就是65535-10-65535,这样你就能得到反转的脉冲数了。
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-8-6 20:30:30 | 显示全部楼层
emmm,大家用这份代码时,可能只能测反转或者正转,如果想要两者都能测的话,可以看下我后面的回复,我有讲解了思路,等我这段时间忙完,我会发一个正反转都能测得
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
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相上升沿和下降沿都会检测,那么后面两个通道的记性设置又是为了设置什么?这里我还有疑问,请大佬提点一下。谢谢。
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-8-23 13:47:59 | 显示全部楼层
玖乌御酒 发表于 2019-8-21 10:36
楼主讲的很好,小白很受用!!!

还有个问题:

说实话我也不太清楚,我个人理解设置是为了设置捕获极性为上升沿,就是说在上升沿来的时候计数一次,而为何下降沿也会计数呢,我个人认为是stm32芯片里面的一些信号处理,使得下降沿反向,把下降沿变成了上升沿,从而把下降沿也当成的上升沿。具体想知道为什么,你只有去查阅资料了。
回复 支持 反对

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-8-23 14:41:56 | 显示全部楼层
感谢分享,很不错的资料讲解,
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2019-5-16
在线时间
30 小时
发表于 2019-8-23 20:11:01 | 显示全部楼层
1209943162 发表于 2019-8-23 13:47
说实话我也不太清楚,我个人理解设置是为了设置捕获极性为上升沿,就是说在上升沿来的时候计数一次,而为 ...

这个函数我弄明白了,查看中文参考手册里面(表75),后面两个参数就是设置的计数的时候另一个通道的标志,这个函数就是设置的表75,楼主需要的话可以对着看一下。
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-8-26 11:21:35 | 显示全部楼层
玖乌御酒 发表于 2019-8-23 20:11
这个函数我弄明白了,查看中文参考手册里面(表75),后面两个参数就是设置的计数的时候另一个通道的标志 ...

哈哈,谢谢
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2019-8-12
在线时间
24 小时
发表于 2019-8-26 18:52:18 | 显示全部楼层
楼主牛皮,,,
回复 支持 反对

使用道具 举报

21

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-5-17
在线时间
45 小时
发表于 2019-9-11 19:46:56 | 显示全部楼层
楼主请问,你算的是每秒转多少圈,如果换成每分钟多少圈,比如每秒1圈1min就是60圈,每秒2圈1min就是120圈,结果不全是60的整数倍了吗?我想看到结果是50圈、51圈,是不是就算不出来?
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2019-8-12
在线时间
24 小时
发表于 2019-9-12 13:03:28 | 显示全部楼层
1209943162 发表于 2019-8-6 20:25
emm,这个是我的错,我这份代码只能测正转或者反转,如果想要又能测反转又能正转的话,得稍微改一下代码 ...

学习  牛!!!!!!
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-9-12 19:16:44 | 显示全部楼层
XUENV 发表于 2019-9-11 19:46
楼主请问,你算的是每秒转多少圈,如果换成每分钟多少圈,比如每秒1圈1min就是60圈,每秒2圈1min就是120圈 ...

这个每秒几圈并不是你想要它什么速度就是什么速度,这个速度是由你给直流减速电机所加电压和它自己的减速比决定的。你只能通过代码去测它的速度,而不是去决定它的速度。
回复 支持 反对

使用道具 举报

37

主题

212

帖子

0

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2019-6-6
在线时间
100 小时
发表于 2019-9-16 16:30:52 | 显示全部楼层
首先非常感谢楼主分享的经验,并且也理解楼主说的计数四次。但是还是想追问一下如果都设置成Botheage会怎么样,望楼主解惑。
1.png
不会就要俯身倾耳以请啊,博客地址:https://blog.csdn.net/qq_39521541?spm=1001.2101.3001.5343
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-9-17 10:24:29 来自手机 | 显示全部楼层
Advent 发表于 2019-9-16 16:30
首先非常感谢楼主分享的经验,并且也理解楼主说的计数四次。但是还是想追问一下如果都设置成Botheage会怎么 ...

这个我没有试过,所以我也不知道怎么给你说。但是我有两个我觉得可行方法。第一个就是用示波器看波形与串口打印数据配合,经过多次实验得出经验,总结出结果。第二个就是查32的数据手册,这些应该在里面都讲了,只是可能有点难找。
回复 支持 反对

使用道具 举报

37

主题

212

帖子

0

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2019-6-6
在线时间
100 小时
发表于 2019-9-17 14:46:41 | 显示全部楼层
1209943162 发表于 2019-9-17 10:24
这个我没有试过,所以我也不知道怎么给你说。但是我有两个我觉得可行方法。第一个就是用示波器看波形与串 ...

thanks
不会就要俯身倾耳以请啊,博客地址:https://blog.csdn.net/qq_39521541?spm=1001.2101.3001.5343
回复 支持 反对

使用道具 举报

37

主题

212

帖子

0

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2019-6-6
在线时间
100 小时
发表于 2019-9-17 20:44:43 | 显示全部楼层
网上的大部分编码器的程序如图所示,但是我觉得在捕获初始化的时候有问题,明显是只初始化了定时器的一个通道,楼主应该也发现过这个问题把?还是只初始化一个捕获通道就行呢?我看楼主的程序是初始化两个通道的。
3.png
不会就要俯身倾耳以请啊,博客地址:https://blog.csdn.net/qq_39521541?spm=1001.2101.3001.5343
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-9-19 11:28:19 来自手机 | 显示全部楼层
Advent 发表于 2019-9-17 20:44
网上的大部分编码器的程序如图所示,但是我觉得在捕获初始化的时候有问题,明显是只初始化了定时器的一个通 ...

直流减速电机的编码器有两个输出口,A相和B相,你如果只初始化一个通道就只能检测一个相位的方波。
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2019-4-30
在线时间
24 小时
发表于 2019-9-20 20:14:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2019-8-30
在线时间
24 小时
发表于 2019-9-27 09:29:11 | 显示全部楼层
楼主是不是没有用到LCD显示呀~
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-9-27 09:44:10 | 显示全部楼层
animalvideo 发表于 2019-9-27 09:29
楼主是不是没有用到LCD显示呀~

嗯,是的,我用串口打印的
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-9-16
在线时间
5 小时
发表于 2019-9-28 21:12:41 来自手机 | 显示全部楼层
看到了一半,先来谢谢你
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2019-9-4
在线时间
24 小时
发表于 2019-10-25 20:19:26 | 显示全部楼层
感谢楼主
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-10-30
在线时间
8 小时
发表于 2019-11-21 12:25:51 | 显示全部楼层
楼主,我有一个问题想问一下
就是我用你的代码在测试的时候打印在串口上的时候会出现 变化很大的值 比如脉冲数大部分是三千多  有一个数是五千多  这是什么原因啊
回复 支持 反对

使用道具 举报

3

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2019-1-3
在线时间
44 小时
发表于 2019-11-21 15:55:25 | 显示全部楼层
楼主,我想问一下    假如你的电机线数是360,就是转一圈产生360个脉冲,而你用了编码器模式3后,就产生390*4个脉冲了。   这句话的390*4是怎么得到的我没理解
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-11-21 16:29:49 | 显示全部楼层
有为青年 发表于 2019-11-21 15:55
楼主,我想问一下    假如你的电机线数是360,就是转一圈产生360个脉冲,而你用了编码器模式3后,就产生390 ...

你可以去6楼看我的评论,我有讲解为什么编码器模式3的脉冲数是4倍。你好好分析那张图就可以分析出编码器模式3下的确A和B相的脉冲都在计数。
回复 支持 反对

使用道具 举报

3

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2019-1-3
在线时间
44 小时
发表于 2019-11-21 17:36:53 | 显示全部楼层
1209943162 发表于 2019-11-21 16:29
你可以去6楼看我的评论,我有讲解为什么编码器模式3的脉冲数是4倍。你好好分析那张图就可以分析出编码器 ...

我理解的应该是360*4才对,你上边写的390*4 并且代码里也是用390算得  不知道是不是搂主的笔误,还是我没理解对
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-11-21 19:09:17 | 显示全部楼层
有为青年 发表于 2019-11-21 17:36
我理解的应该是360*4才对,你上边写的390*4 并且代码里也是用390算得  不知道是不是搂主的笔误,还是我没 ...

呃,我的锅。帖子上我用的是线数为360的减速电机举的例子。而我代码中用的减速电机的线数为390。emm,总之你记住编码器模式3下,转一圈产生的脉冲数就为你直流减速电机的线数乘4。
回复 支持 反对

使用道具 举报

3

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2019-1-3
在线时间
44 小时
发表于 2019-11-21 19:22:33 | 显示全部楼层
1209943162 发表于 2019-11-21 19:09
呃,我的锅。帖子上我用的是线数为360的减速电机举的例子。而我代码中用的减速电机的线数为390。emm,总 ...

好的,谢谢楼主解答
回复 支持 反对

使用道具 举报

3

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2019-1-3
在线时间
44 小时
发表于 2019-11-22 15:47:34 | 显示全部楼层
楼主,还要麻烦您解答一下:    TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising );//编码器配置(定时器、编码模式、上升沿、上升沿)  看了上边六楼的解释,我还是没理解这段代码后边设置的两个上升沿是什么意思,我认为应该设置边沿触发(TIM_ICPolarity_BothEdge)才对.
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-11-22 17:11:33 | 显示全部楼层
有为青年 发表于 2019-11-22 15:47
楼主,还要麻烦您解答一下:    TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Ri ...

这个就是你得到的脉冲数是线数*4的原因,这一步设置的就是编码器模式3。在编码器模式3下,你看懂那个图后,你会发现A相和B相不管是在上升沿也好还是下降沿也好,都在递增。而在编码器1和2下,只会在A相或者B相下的上升沿递增。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-10-30
在线时间
8 小时
发表于 2019-12-12 21:42:27 | 显示全部楼层
串口打印的脉冲数出现了负数 什么原因  就是我一旦将定时器设置的时间改小 也就是由1s改为100ms时串口打印的脉冲数就为负数 这是什么问题啊  求教
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-10-30
在线时间
8 小时
发表于 2019-12-12 21:52:38 | 显示全部楼层
我将定时的时间由1s改为了100ms结果打印在串口上的脉冲数出现了负数 怎么办啊
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-12-14 19:16:29 来自手机 | 显示全部楼层
孙晓天123 发表于 2019-12-12 21:52
我将定时的时间由1s改为了100ms结果打印在串口上的脉冲数出现了负数 怎么办啊

如果1s是正数,100ms是负数的话,说明就是程序哪里出了问题,这个问题只有看你自己才行。我这份程序有个bug,就是反转的时候是负数,然后这样的解决方法我在前面说过,你可以翻一下。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2019-8-30
在线时间
24 小时
发表于 2019-12-23 17:15:27 | 显示全部楼层
楼主,想请教一下,如果想在你的程序里面加入一个PID调速的程序,放在什么位置合适一些
回复 支持 反对

使用道具 举报

15

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1427
金钱
1427
注册时间
2019-4-22
在线时间
272 小时
 楼主| 发表于 2019-12-25 20:54:03 | 显示全部楼层
animalvideo 发表于 2019-12-23 17:15
楼主,想请教一下,如果想在你的程序里面加入一个PID调速的程序,放在什么位置合适一些

就放在我程序里面的那个定时器5中断里面,里面得到你的速度过后,即得到你想要的数据后,不就可以进行pid么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表