wuzhixuan
发表于 2024-5-9 17:16:00
晓飛飛 发表于 2024-5-9 08:43
长按、双击这些都可以在这个代码基础上进行扩展,需要额外增加代码实现的。 ...
明白,多谢大佬的例子,谢谢
xiangzichen
发表于 2024-5-9 18:39:40
本帖最后由 xiangzichen 于 2024-5-9 18:44 编辑
从左往右计算,每个按键按下的电压 8位ADC预估值:,以及二进制值如下:
电压值 ADC值 二进制值
4.08 208 1101 0000
3.37 172 1010 1100
2.78 142 1000 1110
2.27 116 0111 0100
1.82 93 0101 1101
1.39 71 0100 0111
0.96 49 0011 0001
0.51 26 0001 1010
采集值后,,结果再右移三位
新值为:
11010 0x1A
10101 0x15
10001 0x11
01110 0x0E
01011 0x0B
01000 0x08
00110 0x06
00011 0x03
程序中,ADC结果只取高8位,然后再向右移位3位,直接switch就可以判断了,这个速度绝对比各种 if 大于 if 小于 快多了.
key=(ADC_VALUE)>>3;
switch(key){
case 0x1A:
break;
case 0x15:
break;
case 0x11:
break;
case 0x0E:
break;
case 0x1B:
break;
.
.
.
.
}
这样移位后判断,绝对准确,当然了,主要是代码效率高..
不过细节上要处理一下,抖动什么的.直接参考晓飞飞大佬的代码就好了.
xiangzichen
发表于 2024-5-9 18:42:14
晓飛飛 发表于 2024-5-8 18:37
我常用的ADC按键代码,你可以参考一下,已经批量在产品上应用,比较稳定的。
大佬看看我的代码是不是够稳定,相当于降低了采集精度,直接取值判断
zhang32568
发表于 2024-5-9 20:18:11
xiangzichen 发表于 2024-5-9 18:39
从左往右计算,每个按键按下的电压 8位ADC预估值:,以及二进制值如下:
电压值 ADC值 二进制值
你这样理论甚好。可是实际上并不是这样的。比如理论电阻1K 计算。实际因为电阻误差或者按键有接触电阻。造成实际测试值偏差你的理论值。所以判断还是在 一个区间好一点。
xiangzichen
发表于 2024-5-9 20:30:52
本帖最后由 xiangzichen 于 2024-5-9 20:35 编辑
zhang32568 发表于 2024-5-9 20:18
你这样理论甚好。可是实际上并不是这样的。比如理论电阻1K 计算。实际因为电阻误差或者按键有接触电阻。 ...
移位了,重点是移位了...判断一个区间,和移位是一样的效果,你仔细想想看.
多说一句:绝对稳定,毕竟是已经在用的代码.再说了,
电阻自身误差这些,移位后完全消除了.
zhang32568
发表于 2024-5-9 20:35:56
xiangzichen 发表于 2024-5-9 20:30
移位了,降低了精度,绝对稳定,毕竟是已经在用的代码.再说了,判断一个区间,和移位是一样的效果,你仔细想想看 ...
哦 仔细想想就是 相当于将后面三位舍弃。也就是后面三位000---fff都不影响前面的结果
xiangzichen
发表于 2024-5-9 20:38:07
zhang32568 发表于 2024-5-9 20:35
哦 仔细想想就是 相当于将后面三位舍弃。也就是后面三位000---fff都不影响前面的结果 ...
000-fff的范围 给足了电阻误差和测量误差.
xiangzichen
发表于 2024-5-9 20:52:46
zhang32568 发表于 2024-5-9 20:35
哦 仔细想想就是 相当于将后面三位舍弃。也就是后面三位000---fff都不影响前面的结果 ...
可能也会遇到极端情况,比如后面数值如果是111 这个可能会导致进位,这个可以通过加减一个数值来消除,我的思路是一个框架,具体要根据实际情况去修改代码.总之这种方式应该检索速度很快
wuzhixuan
发表于 2024-5-11 15:50:38
xiangzichen 发表于 2024-5-9 18:39
从左往右计算,每个按键按下的电压 8位ADC预估值:,以及二进制值如下:
电压值 ADC值 二进制值
{:2_27:}都是厉害的大佬
zhange
发表于 2024-5-11 17:01:32
晓飛飛 发表于 2024-5-8 18:37
我常用的ADC按键代码,你可以参考一下,已经批量在产品上应用,比较稳定的。
这个不错学习正在学习adc