这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » 使用MCU连接旋转编码器的方法

共1条 1/1 1 跳转至

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

工程师
2022-05-17 22:26:06     打赏

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

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

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

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

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

bb987082-c203-11ec-bce3-dac502259ad0.png

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

bbb2ec8c-c203-11ec-bce3-dac502259ad0.png

常用的旋转编码器的外形

bbd67580-c203-11ec-bce3-dac502259ad0.jpg

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

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

bbebc4ee-c203-11ec-bce3-dac502259ad0.jpg

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

听起来不可思议?

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

确定旋转方向:

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

bc00afb2-c203-11ec-bce3-dac502259ad0.png

比如:

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

bc1433e8-c203-11ec-bce3-dac502259ad0.jpg

用模拟的方式来实现:

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

R-2R电阻网络

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

bc268a0c-c203-11ec-bce3-dac502259ad0.jpg

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

bc4011c0-c203-11ec-bce3-dac502259ad0.jpg

一个实际的实现

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

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

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

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

bc5032bc-c203-11ec-bce3-dac502259ad0.png

触点抖动噪声

bc61a7e0-c203-11ec-bce3-dac502259ad0.png

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

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

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




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]