打印
[应用相关]

关于stm32的正交解码

[复制链接]
797|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧
看一下我用过的一种编码器

使用特权

评论回复
沙发
远芳侵古道|  楼主 | 2021-8-4 17:24 | 只看该作者

使用特权

评论回复
板凳
远芳侵古道|  楼主 | 2021-8-4 17:25 | 只看该作者

使用特权

评论回复
地板
远芳侵古道|  楼主 | 2021-8-4 17:28 | 只看该作者
编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说明这个编码器转一圈对应的信号线会输出500个脉冲,,,,为什么说是对应的,,,对于上面的编码器而言是这样的,,,,但是有的编码器里面有好多线,,,有的信号线是转一圈就输出对应多少线的脉冲,,,有的信号线是转一圈就输出一个脉冲,,,,这就要看编码器的资料了......

使用特权

评论回复
5
远芳侵古道|  楼主 | 2021-8-4 17:32 | 只看该作者
看我上面用过的这个编码器,,使用A,B,VCC,GND这四根线,,

使用特权

评论回复
6
远芳侵古道|  楼主 | 2021-8-4 17:39 | 只看该作者
编码器转一圈A信号线会输出500个脉冲,,,,B信号线也会输出500个脉冲,,不过

正转的时候

使用特权

评论回复
7
远芳侵古道|  楼主 | 2021-8-4 17:39 | 只看该作者

使用特权

评论回复
8
远芳侵古道|  楼主 | 2021-8-4 17:40 | 只看该作者

使用特权

评论回复
9
远芳侵古道|  楼主 | 2021-8-4 17:41 | 只看该作者
正转的时候信号线A先输出信号,B信号线后输出

反转的时候信号线B先输出信号,A信号线后输出

使用特权

评论回复
10
远芳侵古道|  楼主 | 2021-8-4 17:41 | 只看该作者

使用特权

评论回复
11
远芳侵古道|  楼主 | 2021-8-4 17:46 | 只看该作者
假设只是单纯的测正转脉冲或者单纯的测反转脉冲,那么只需要用单片机随意选择一个信号线就行了,,然后就是脉冲计数,,,,

如果说要是一个电机既有正转又有反转,,,,我想知道这个电机绝对正转了多少圈

那么就需要用正转的圈数减去反转的圈数了,,,,,,那么问题来了,,,怎么测正转圈数和反转圈数

使用特权

评论回复
12
远芳侵古道|  楼主 | 2021-8-4 17:46 | 只看该作者
其实传统的做法

使用特权

评论回复
13
远芳侵古道|  楼主 | 2021-8-4 17:47 | 只看该作者
关于D触发器,,,,当clk引脚来一个上升沿,D引脚是什么电平,,那么Q就输出什么电平,,Q非,,与Q相反

使用特权

评论回复
14
远芳侵古道|  楼主 | 2021-8-4 20:57 | 只看该作者
现在如果说电机正转

使用特权

评论回复
15
远芳侵古道|  楼主 | 2021-8-4 21:01 | 只看该作者
可以看到每当B来上升沿的时候,A信号总为高电平,,,所以Q会输出高电平

设置A为上升沿进入其,,,中断函数

然后判断一下Q是否为高电平,如果为高电平正转变量自加一

使用特权

评论回复
16
远芳侵古道|  楼主 | 2021-8-4 21:03 | 只看该作者
如果电机反转

使用特权

评论回复
17
远芳侵古道|  楼主 | 2021-8-4 21:03 | 只看该作者
可以看到每当B来上升沿的时候,A信号总为低电平,,,所以Q会输出低电平

设置B为上升沿进入其,,,中断函数

然后判断一下Q是否为低电平,如果为低电平反转变量自加一

然后 正转变量减去反转变量就能得到电机到底正转了多少圈......这样就会得到一个相对的变量,,这个变量呢,就是单片机正交解码的值

说白了单片机的正交解码功能就是得到一个正反转,,,相对的变量,,,,这个变量呢,,你正转的时候他会加,你反转的时候他会减,

不过呢,,,,STM32的这个变量有点坑,,,是太坑了,,,他内部定义的这个变量的类型是无符号整形,,,也就是说0---65535,,,,,,,,,,,,,

使用特权

评论回复
18
远芳侵古道|  楼主 | 2021-8-4 21:04 | 只看该作者

使用特权

评论回复
19
远芳侵古道|  楼主 | 2021-8-4 21:06 | 只看该作者
如果直接利用STM32的正交解码功能,,直接读这个值,,这样呢就会出现很麻烦的问题,,,,

假设你正转转到10,然后反转转到0之后还是反转,,他就会开始从65535开始往下减了,,,,假设转到了60000,,你又开始正转了,一直越过65535之后,他又开始从0开始往上加了,,,,要是你的电机就是这样的反反复复,而且正转与反转次数每次都在变化,,,,,,,你如何写程序来得到到底正转了多少圈??????????所以说STM32真是太坑了,,,害的我和我同学写算法测试算法耽搁了两天,,,,,,,最后还是会出现BUG,,,,,,,,网上也有大神写类似的算法来计算出到底转的圈数,,,,,,,,,,,,,,

最总我决定用最本质的方法也就是利用D触发器,,,,,,,不过因为手头并没有D触发器,,,但是STM32正交解码内部实质就是用的D触发器来做判断的,,,,,

使用特权

评论回复
20
远芳侵古道|  楼主 | 2021-8-4 21:08 | 只看该作者
而且他提供了一个寄存器来判断是正转还是反转

if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)//向下计数

else

就是向上计数......也就是能指明正反转,,,,,

所以我就打开他的正交解码功能,,就是把A,B信号线既接正交解码引脚上,又接在脉冲计数中断引脚上

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

783

帖子

0

粉丝