我们要观察的世界,主要还是连续量的模拟世界,一般都是采用ADC对被观测的模拟电压进行量化后,通过数字的方式进行处理。现在越来越多的单片机(也叫微控制器)都内置了ADC,但仍然还有不少单片机没有模拟信号的输入端口,或者它的模拟端口被其它更重要的信号占用,留给我们能用的就是数字的输入管脚。还有就是FPGA,一般都不带ADC,如何在没有外部ADC的情况下对一些模拟量进行测量呢?
我们最容易想到的就是通过电压 - 频率变化的方式来测量频率的变化,进而推算出外部电压的值,测频和计算都可以在数字域进行,单片机或FPGA都可以轻松搞定。
那如果同时用一根数字线,测量两个模拟参量的变化该如何实现呢?
比如“硬禾学堂2022寒假在家一起练”的游戏机平台上有一个用两个电位计构成的游戏摇杆:
硬禾2022寒假在家一起练的游戏机平台
摇杆内部本质上是两个电位计,X、Y方向各一个,按动摇杆,会改变这两个电位计的位置,从而改变中间抽头的分压值。
游戏摇杆的内部结构及等效电路
这个平台使用了RP2040的两个模拟电压输入管脚来对电位计的变化引起的电压值进行ADC转换,再通过程序判断摇杆的方向。那我们可以设想一下,如何在没有ADC的微处理器上或FPGA上使用这个游戏摇杆?
我们可以逆向使用PWM波形,因为它有两个典型的参量 - 频率和占空比。如果设计一个PWM波形发生电路,能够用两个电位计分别调节PWM的频率和占空比,将这个PWM波形通过数字输入端口送到微处理器或FPGA,就可以通过闸门计数的方式来监测PWM的两个参量,推算出两个电位计的值,进而判断出电位计的变动方向。
参考Elektor网站上的一篇文章:How to Connect 2 Potentiometers to 1 Digital Input,我设计了如下一个测试板,使用了一颗内部带有四个运算放大器的芯片,经典的LM324,再搭配几个电阻和电容:
原理图如下,图中的VR1(型号FJ08K)就是游戏摇杆。图中的U1D和U1A两个运算放大器构成了一个可变频率的三角波发生器,频率可由VR1的X轴的电阻来调节;U1B用作比较器,将三角波的电信号同可变的直流电压进行比较,直流电压的变化用VR1的Y轴来调节,这样就可以在U1B的第7个管脚,也就是整个电路的输出端得到占空比和频率都可以改变的PWM波形。
工作原理如下图:
用KiCad6设计的PCB板图:
测试效果:
使用ADALM2000口袋仪器,给板子提供5V的电源,再通过示波器端口采集PWM_Out的输出信号,可以看到滑动摇杆,屏幕上的波形的频率和占空比都会发生变化。
对这个波形的测量和进一步的应用在后面的项目中再发布。