我用的F103zet6的板子。
首先知道你的编码器
1.减速比,我的是1:120
2.编码器的 线数=脉冲=分辨率 大约可以等于哈哈哈。我的是11线的。
那么就可以求得我们的电机转一圈需要多少个脉冲,11*120=1320个。
我之前有一段时间不知道自己的减速比和线数,其实是有方法的就是不太准,就是在编码器模式下用串口调试助手看看大约电机转一圈,数值的变化,建议还是不要这样弄,因为不准。
( ̄▽ ̄)话不多说上图上操作:
串口打开
TIM1来控制电机 打开两个通道
T IM4 1秒触发一次中断
TIM3 开启编码器模式
打开这个(不知道叫什么)
打开这个(只知道叫晶振也不知道干啥的)
最最最最重要的优先级TIM3设为1 TIM4设为0 后面再说
时钟树
我们再来接线
M+,M- 是电机线,A,B线是连在编码器模式的引脚上 我的是pa6,pa7.剩下俩连到板子相应的引脚上就行。如果你不会连电机线,那就看他https://www.bilibili.com/video/BV1Xt411372X?spm_id_from=333.337.search-card.all.click&vd_source=6f1f0eada9bd8f336a8298b4db2ffd5b
好了上程序 o-o
让串口助手可以用
该打开的都打开, 注意最后一行我将定时器三的值设置为30000(跟别人学的)
主函数就一句话
完整的定时器回调函数
等你敲完以上代码就可以看到效果了(那个**的值实际上是ocount的值)
为啥出现第一行的问题我也不知道。。。。。。。。可能是复位的原因吧
现在我讲讲写定时器三和定时器四回调函数的原因:先看定时器四它的作用是1秒触发一次中断同时对得到的编码器的脉冲值进行计算
dir得到电机正转还是反转,count的到编码器值。
rdata和 ldata分别计算正反转获得的值 这里的 /4就是当时T1T1的四倍频,而rflag和lflag的值就要看定时器三了他的意思是编码器定时器走完一个周期(即我设定的0-65535)计数就加一,你可能会问你当时不是把定时器三的值设置成了30000吗加到65535不是没走完一个周期吗,但是你想第一次从30000加到65535虽然没走完一个周期但是你可以把flag看成一个新周期的开始而不是旧周期的结束。这样就想通了。
rcir和lcir分别是正反转的圈数 ocount是上一次count的值。lspeed和rspeed就是正反转的速度啦。你可能会问为啥计算速度是会有一个if判断count和ocount这是因为无论是定时器的数值加(0加到65535)还是数值减(65535到0)都会有一个突变的过程(正方向65535到0,反方向0到65535)这个情况时需要注意的如果我不加这个判断那就会出现以下情况
可以看到这里面有一个速度值突变了。就是这个原因。
还有一个问题就是我求ldata时候为啥我的lflag-1呢了原因是我给单片机通电时它的count默认是0的这时候它的lflag自动加了1,所以我不得不减去1 (难受一批)
还有最重要一件事就是中断问题照理来说tim3是编码器的值这个需要不断获取不应该优先级最高吗但是我们注意恰恰因为tim3高的话就困在tim3里出不来了,也就是说此时tim4公式中获取不了tim3中flag的值导致tim4无法计算的问题。所以把tim4设优先级高。
最后从别人哪找了个速度计算公式摆上。当然我的单位时间可不是5ms啊!
其中还有些问题没有解决,代码如果由更好的写法,欢迎大佬的讲解 。抱拳抱拳~~~~~~~