这两天在做AD键盘,关于AD采集后的数据处理,自己有些头痛。刚开始根据键盘数量将采集值均分,考虑到所使用的电阻也肯定有差别,所以出现了有的键值在两个数之间跳动的现象。有同学提议,用数字万用表先测采集到的电压,根据不同的测量值来分配不同按键的AD采集值。这样处理之后,效果确实好了许多。在这里提出来,是想看看,大家是否还有更好的关于AD键盘数据处理的想法,可以提一提,一起学习一下。
首先ad采样要多采几个点,然后加上滤波。可以根据电压的区间来区分是那个按键
*我的EMAIL: sunke9@qq.com
*我的博客http://blog.ednchina.com/sunke9/
*我网店:https://sunke9.taobao.com/
承接:电子、自动控制产品设计开发;单片机、ARM编程。
AD键盘个人感觉不是很实用,采集的键值要在一个范围内判断,不能只判断一个值,由于分压电阻的精度以及按键的抖动,都会使采集的电压值出现波动。
如果对按键进行硬件消抖,并且提高分压电阻的精度。效果会好一些。
我觉得楼主还是先把设计的目的和要求说清楚,比如是出于学习目的还是生产项目,如果是学习我觉得楼主说的方法还不错,实测比较准确,电阻的误差就避免了,但是实测也有问题,毕竟温湿度对阻值也有影响,可能会对你的测量有影响;如果是实际生产项目,我觉得这样是不现实的,还是需要再仔细考虑处理方法,比如提高电阻精度、提高AD分辨率,考虑预设程序开机预存储测量键值等
我想问一下楼主是对一个值进行判断还是一个区间呢,有对按键的消抖处理吗,我想如果考虑普通电阻的误差是5%的话,只要你的区间大于这个,且消抖,应该问题不是很大吧?
[ 本帖最后由 crazyk 于 2010-4-22 11:18 编辑 ]
http://ourdev.taobao.com
过去心不可得 现在心不可得 未来心不可得
一般同批次的电阻差别不会太大,采集过AD之后,划定一个误差区间,在此区间范围之内,就认为是某个按键按下来了。
键少了还可以。7,8个以上键的话就不要用AD方式了。
还要AD滤波,什么什么,太麻烦。
总感觉AD键盘不太实用,提高AD的分辨率是个不错的方法,而且提高电阻的精度也会有所帮助,用表测只是不得已而为之!
除非特殊情况,一般不推荐A/D读键的做法,因为这是以牺牲可靠性的代价换取的键数。
数字电路为什么抗干扰性强,就是因为把每个信号都二值化了,不承认中间结果,在同一时刻下每根线只用于一个信号,于是理想阈值为Vcc/2。
用A/D方式只读一个键时阈值为Vcc/2,读2个键则阈值变为Vcc/3,依此类推,读n个键时的阈值是Vcc/(n+1)。阈值越小意味着抗干扰性越差。
答5楼:
首先,我没有做项目,是在学校学习。刚觉到AD键盘并不好用(当然,指的是在数据处理),自己感觉如果能做好,AD键盘也还不错的。项目自己还从来没做过,不知道实际生产中的键盘多是应用的什么键盘。
还有,就是我在对数据处理上,是判定的区间。至于程序上的防抖处理,自己也没怎么做,希望大家也给提供些源程序。
回复 5楼 crazyk 的帖子
首先,我没有做项目,是在学校学习。刚觉到AD键盘并不好用(当然,指的是在数据处理),自己感觉如果能做好,AD键盘也还不错的。项目自己还从来没做过,不知道实际生产中的键盘多是应用的什么键盘。
还有,就是我在对数据处理上,是判定的区间。至于程序上的防抖处理,自己也没怎么做,希望你也能给提供些意见。
回复 楼主 radio_xh 的帖子
给出个人关于AD键盘的解决方案
1。硬件上,
1.1 显然按键过程中要考虑滤波消抖,一般是选用瓷片电容,电容容量一般为0.01uF~1uF
1.2 你不必须“用数字万用表先测采集到的电压,根据不同的测量值来分配不同按键的AD采集值”,你可以在硬件电路上增加一个校准电路,这样在不同的环境不同的.温度,只要对产品进行校准操作就可以了,显然,这增强了你的键盘的鲁棒性。
2。 软件上,时间延迟滤波是必须的,然后还需要考虑多次采样,举手表决以确定其所代表的键值的方法
模板如下
void delay();//延迟函数
char get_key_value(char ad_value);//这个函数通过对AD采样的结果进行处理,返回键值,其中ad_value是AD采样的值,最快的算法是建立一个查询表
char get_ad_value();//这个函数用于获得ad采样的值,注意不是键值
用着3个函数,我们可以调用get_key_value5次,假设有3次返回的键值是132,又一次返回的是128,有一次返回的是134,我们可以认为此次采样的键值为132,
当然你也可以调用get_ad_value()5次,获得平均值,然后调用et_key_value,求的键值。