使用MCU连接旋转编码器的方法

描述

昨天的文章中分享了一个小技巧:

设计小技巧:如何用MCU或FPGA的一个数字IO测量2个电位计的阻值变化?

实际上是利用了我们常用的PWM功能的一个逆向思维应用。

今天再分享一个小技巧 - 如何使用一个MCU的模拟输入端口连接多个旋转编码器?

作为一种输入控制器件,旋转编码器被大量使用,尤其在测试测量领域,有的设备上会有多个旋转编码器用于调节多个参量。

旋转编码器

一般来讲,旋转编码器需要至少2根微控制器的输入管脚,如果有内置的按键,还需要第三根。如果连接2个旋转编码器那就要消耗掉6根输入管脚,连接3个旋转编码器需要9根,以此类推。。。

旋转编码器

常用的旋转编码器的外形

旋转编码器

旋转编码器的典型检测电路

然而,如果你用的MCU有ADC的功能,其实只需要一根模拟输入管脚就可以搞定多个旋转编码器的连接。

旋转编码器

硬禾学堂的STM32 DIY示波器板用一个旋转编码器和2个按键作为输入

听起来不可思议?

我们先看一下旋转编码器是如何使用的。

确定旋转方向:

编码器在旋转的时候会同时在其”A“和”B“管脚输出一串脉冲,从这两串脉冲的相位关系上就可以确定编码器的旋转方向 - 将一路脉冲延迟”一步“并将2个脉冲进行异或操作。

旋转编码器

比如:

假设管脚 'A'的输出为:'00110011...' ,管脚'B'的输出为 '01100110...', 将 'A'的信号延迟一步,得到'01100110...'., 将延迟后的'A'同'B'异或,将得到'00000000...'. ,向另外要给方向旋转,管脚'A'的输出变为'11001100...' ('B'不变), 这样'A' 延迟一步编程'10011001...'.再跟'B'信号异或,就给出结果'11111111...'.

旋转编码器

用模拟的方式来实现:

我们可以把'A'和'B'输出的信号一起看,当成是一个2bit的并行总线,能够有4种组合的输出: 0b00, 0b01, 0b10 and 0b11 (格雷码).多个位数的二进制值可以转换成一个模拟电压信号,这本质上就是一个数模转换器.

R-2R电阻网络

有一种非常简单实现的DAC是R-2R电阻网络,这种方法只使用两个电阻值R和2R就可以构成一个网络,每增加一个位数,只需要增加两个电阻。一个2根管脚的旋转编码器只需要4个电阻,如下图:

旋转编码器

这个电路可以产生4个不同电压值的信号,这个信号用单片机的ADC进行量化解码,即可解码得到管脚”A“和”B“的值。一般旋转编码器还有一个按键,考虑到按键的输入检测,电路可以变成下面这样:

旋转编码器

一个实际的实现

两个旋转编码器再加上内置的按键,共需要一个6位的DAC.一般MCU内置的ADC为10位,可以非常轻松地解码由此生成的模拟信号,并且每1位相当于还有4bit的分辨率余量,因此我们可以使用5%精度的电阻 (当然1% 会更好).

R-2R的阻值相对于上拉电阻要足够大,以避免引起R-2R的比值失衡,同时上拉电阻也不能太小,否则流过开关触点的电流会太大。

2R电阻可以简单地将两个R阻值的电阻串联起来,还可以节省一种阻值的电阻.

为防止触点的抖动需要加一个0.01uF的电容,否则会引起两个编码器之间的干扰。

旋转编码器

触点抖动噪声

旋转编码器

通过电容滤除掉触点抖动噪声

是不是又Get到一个新技能?

继续关注电子森林,会有更多设计技巧分享给大家。

原文标题:逆向思维: 如何用一根MCU的模拟输入检测多个旋转编码器?

文章出处:【微信公众号:电子森林】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分