昨天的文章中分享了一个小技巧:
设计小技巧:如何用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到一个新技能?
继续关注电子森林,会有更多设计技巧分享给大家。