找回密码
 立即注册
楼主: wuzhixuan

ADC分压按键代码,有大佬教教小白马

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2024-05-15 10:03:08

3

主题

15

回帖

72

积分

注册会员

积分
72
发表于 2024-5-9 17:16:00 | 显示全部楼层
晓*** 发表于 2024-5-9 08:43
长按、双击这些都可以在这个代码基础上进行扩展,需要额外增加代码实现的。 ...

明白,多谢大佬的例子,谢谢
新手小白,请大佬指教
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-5-9 18:39:40 | 显示全部楼层
本帖最后由 xiangzichen 于 2024-5-9 18:44 编辑

截图202405091827009877.jpg

从左往右计算,每个按键按下的电压 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;
.
.
.
.
}

这样移位后判断,绝对准确,当然了,主要是代码效率高..

不过细节上要处理一下,抖动什么的.直接参考晓飞飞大佬的代码就好了.

点评

电路中取消R0,ADC值就是线性的,岂不更好?  发表于 2024-5-15 08:32
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-5-9 18:42:14 | 显示全部楼层
晓*** 发表于 2024-5-8 18:37
我常用的ADC按键代码,你可以参考一下,已经批量在产品上应用,比较稳定的。

大佬看看我的代码是不是够稳定,相当于降低了采集精度,直接取值判断
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:386
  • 最近打卡:2025-05-03 13:06:07

25

主题

113

回帖

729

积分

高级会员

积分
729
发表于 2024-5-9 20:18:11 | 显示全部楼层
xiangz*** 发表于 2024-5-9 18:39
从左往右计算,每个按键按下的电压 8位ADC预估值:,以及二进制值如下:

电压值 ADC值 二进制值

你这样理论甚好。可是实际上并不是这样的。比如理论电阻1K 计算。实际因为电阻误差或者按键有接触电阻。造成实际测试值偏差你的理论值。所以判断还是在 一个区间好一点。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-5-9 20:30:52 | 显示全部楼层
本帖最后由 xiangzichen 于 2024-5-9 20:35 编辑
zhang*** 发表于 2024-5-9 20:18
你这样理论甚好。可是实际上并不是这样的。比如理论电阻1K 计算。实际因为电阻误差或者按键有接触电阻。 ...

移位了,重点是移位了...判断一个区间,和移位是一样的效果,你仔细想想看.

多说一句:绝对稳定,毕竟是已经在用的代码.再说了,


电阻自身误差这些,移位后完全消除了.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:386
  • 最近打卡:2025-05-03 13:06:07

25

主题

113

回帖

729

积分

高级会员

积分
729
发表于 2024-5-9 20:35:56 | 显示全部楼层
xiangz*** 发表于 2024-5-9 20:30
移位了,降低了精度,绝对稳定,毕竟是已经在用的代码.再说了,判断一个区间,和移位是一样的效果,你仔细想想看 ...

哦 仔细想想就是 相当于将后面三位舍弃  。也就是后面三位000---fff都不影响前面的结果
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-5-9 20:38:07 | 显示全部楼层
zhang*** 发表于 2024-5-9 20:35
哦 仔细想想就是 相当于将后面三位舍弃  。也就是后面三位000---fff都不影响前面的结果 ...

000-fff的范围 给足了电阻误差和测量误差.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-5-9 20:52:46 | 显示全部楼层
zhang*** 发表于 2024-5-9 20:35
哦 仔细想想就是 相当于将后面三位舍弃  。也就是后面三位000---fff都不影响前面的结果 ...

可能也会遇到极端情况,比如后面数值如果是  111 这个可能会导致进位,这个可以通过加减一个数值来消除,我的思路是一个框架,具体要根据实际情况去修改代码.总之这种方式应该检索速度很快
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2024-05-15 10:03:08

3

主题

15

回帖

72

积分

注册会员

积分
72
发表于 2024-5-11 15:50:38 | 显示全部楼层
xiangz*** 发表于 2024-5-9 18:39
从左往右计算,每个按键按下的电压 8位ADC预估值:,以及二进制值如下:

电压值 ADC值 二进制值

都是厉害的大佬
新手小白,请大佬指教
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:236
  • 最近打卡:2025-05-04 07:52:37

61

主题

818

回帖

1502

积分

金牌会员

积分
1502
发表于 2024-5-11 17:01:32 | 显示全部楼层
晓*** 发表于 2024-5-8 18:37
我常用的ADC按键代码,你可以参考一下,已经批量在产品上应用,比较稳定的。

这个不错  学习  正在学习adc
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 10:28 , Processed in 0.147802 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表