Marxt 发表于 2012-5-12 22:42:34

4X4keyboard with 1 input of ADC for AVR

本帖最后由 Marxt 于 2012-5-12 22:43 编辑

            最近,脑子发热,想了一个电路,使用一个AVR 单片机的一个ADC口进行4X4键盘的检测。。。。关于ADC的电压检测,无非就是对ADC 口外接电阻网络进行分压后的电压值送入ADC口,然后利用单片机ADC的功能换算出ADC值来!
      具体电路请看下面原理图:
      


          后来这个电路和同事讨论后,发现有点问题,经同事的建议,再进行ADC之间,先进行一次外部中断检测,这样,大家就看到了上面的电路原型!
      现在我来简单的分析一下我的思路:
      电路很简单,和我们平时使用的4X4按键检测电路没太大不同,当某个按键按下时,相应的线路的电阻组成电路网络,然后进行分压后送ADC口!而电路中二极管接到INT0口,是为了提高按键的按下安全性,也就是消抖。。。。
      这个电路唯一相对难的就是电阻的组合选择。本人总结了3种方法:
      方法1:电阻任意选择,只要每一组合的电阻网络的ADC值之间的差值大于AVR ADC 能检测出的最小的分辨率即可!
      方法2:电压等分法,把电源电压16等分,即VCC/16。当某个按键按下时,这个按键相应的线路电阻组合为(VCC/16)倍数。即:1*VCC/16,2*VCC/16,3*VCC/16.......16*VCC/16.!利用这种关系算出电阻值。
      方法3:ADC值等分法,即把1023/16!某个按键按下时,这个按键相应的线路电阻组合的ADC值为(1023/16)的倍数。即:1*(1023/16),2*(1023/16)........16(1023/16)。利用这种关系算出电阻值。
      程序编写思想:
      1.I/O口,ADC,INT等硬件初始化就不说了!!!
      2.当有按键按下时,首先进行INT0上升沿中断检测,中断程序里打开ADEN!
      3.然后进行ADC扫描,以确定是哪个按键按下!、

最后的补充的事项:
   1.这个电路还有许多问题,如组合按键按下时,到底是哪个按键被检测,如,当二个按键同时按下时,由于是由电阻网络组合成的分压电路,所以最后送入ADC口的电压就不是上面我们的方式算出的电压值了(此时二路电阻网络是并联的)!
   2.在程序中,在进行ADC检测前要进行一次INT,这就涉及到时间问题了!虽然单片机速度快,但是INT要时间,当我们用很快的速度按下键后松手,单片机此时可能进行了INT检测但来不及ADC等!所以在编写程序时这个也是要考虑的一个问题之一!
    (本人正在编写程序中,程序还未最终完成,所以还不能和坛友们一同分享,有兴趣的坛友可以自己写写,然后一起分享和交流。Marxt期待与你一同分享与进步!)
   这次,我只简单的编写一个按键的检测!
献丑了,别见怪!

Marxt 发表于 2012-5-12 22:45:45

顶顶自己,给自己鼓励一下!!也希望大家一起参与!{:victory:}
页: [1]
查看完整版本: 4X4keyboard with 1 input of ADC for AVR