打印

ADC口检测多个组合按键的方法

[复制链接]
1013|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qbwww|  楼主 | 2023-4-24 08:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, ADC, dc
一般情况下,一个GPIO口只能连接一个按键,通过检测外部输入的高、低电平判断按键的开闭状态。
使用按键切换串联或并联的电阻网络电压的通路,可能得到该网络与不同的按键状态相对应的分压值,处理器检测该分压值之后再映射到按键状态,从而实现按键检测。
接如果按键同一时刻只有一个闭合,可以用下图分压电阻相互串联的方式检测。
电阻串联分压的按键检测电路,适用于没有组合键的情况

如果按键存在多个同时闭合的情况,则应该用下图电阻并联的方式实现检测;
存在多个按键同时被按下时的ADC检测电路

当需要检测n个可能同时闭合的按键时,存在种按键状态的组合。
比如,2个按键存在以下4种按键状态的组合:
2个按键的4种组合状态

以下电路可用于2个组合按键的检测,
2个组合按键的检测电路

2种按键的4种不同状态,可以得到4个不同的分压值,经过12位ADC转换得到不同的ADC值,以此为中心划分为4个区间。
4种组合状态的ADC区间划分

处理器通过判断转换得到的ADC值所在区间,以判断输入按键的状态。
如果ADC区间范围太小,当按键处于该区间对应的状态时,转换的ADC值有可能因为误差而落在其它区间,造成按键状态的误检测,为了避免这一情况,应该选择合适的电阻值,使得每一组按键状态对应的ADC区间的范围尽量大。

电阻阻值的选取

对于3个组合按键的ADC检测,根据上面的分析,电阻阻值的选择转换为以下约束条件,最大值的求解:
选择一组电阻R2,R3,R4,R1的阻值,计算3个按键的8个组合状态下的并联电阻与R1的ADC值,以此为中心划分8个区间,与相邻值的平均值为边界,划分8个区间;
每一个区间的边界之差为区间范围,求得8个区间中的最小范围值;
在所有可选阻值中,求解使得8个区间的最小范围值最大的一组阻值。
我们可以通过编写octave程序,将R2,R3,R4,R1遍历所有可选阻值,求出其中使最小范围值最大的一组阻值,程序如下:
  • re = linspace(1, 20, 30);%1kΩ-20kΩ之间等间隔取30个阻值
  • rl=length(re);
  • rk = [0 0 0;0 0 1;0 1 0; 0 1 1; 1 0 0; 1 0 1; 1 1 0; 1 1 1];%3个按键的8种状态列成3*8的矩阵
  • maxdiff = 0;
  • r2o = 0;
  • r3o = 0;
  • r4o = 0;
  • r1o = 0;
  • for i=1:rl
  •   for j=1:rl
  •     for m=1:rl
  •       for n=1:rl
  •          r2=re(i);
  •          r3=re(j);
  •          r4=re(m);
  •          r1 = re(n);
  •          gn = rk * [1/r2; 1/r3; 1/r4] + 0.00001;%矩阵乘法计算R2,R3,R4并联的导纳
  •          rn = 1./gn;%计算3个电阻的并联阻抗
  •          ad = 4096 * r1 ./ (rn + r1);
  •          ads = sort(ad);
  •          mind = 65535;
  •          for p = 1:7
  •             nd = ads(p + 1) - ads(p);
  •             if(nd < mind)
  •               mind = nd;%计算8个区间的最小范围值
  •             endif
  •          end
  •          if(mind > maxdiff)
  •           r2o = r2;
  •           r3o = r3;
  •           r4o = r4;
  •           r1o = r1;
  •           maxdiff = mind;//求解最小范围值的最大值
  •          endif
  •       end
  •     end
  •   end
  • end
  • maxdiff
  • r2o
  • r3o
  • r4o
  • r1o


遍历得到,R2=8.2kΩ,R3=10.8kΩ,R4=18.0kΩ,R1=6.3kΩ,此时8个ADC区间的最小范围值为186。‘
3个按键8组状态的ADC区间划分


汽车电子设计规范对按键检测的要求
根据某百年车企某特的软硬件设计规范要求,对按键检测有以下要求:
1) 按键断开时,最小的绝缘电阻为100KΩ,对于涉水的开关(比如门状态开关,最小的绝缘电阻为10KΩ)
2) 接键闭合时,最大的接触电阻为50Ω
考虑了绝缘电阻和接触电阻的按键模式

3)对于有机械触点的按键,在闭合瞬间,需要提供不小于10mA的润湿电流(wetting current)
润湿电流是指能够通过维持一定的小电弧清理触头表面的尘垢和腐蚀以保持触头状态良好的最小电流值。

采用蒙特卡洛分析可靠性
R2、R3、R4、R1选择1%精度的电阻,考虑初始误差,老化和温度的影响,其阻值在95%至105%之间均匀分布;
按键断开时的绝缘电阻在100KΩ-1MΩ之间均匀分布;
按键闭合时的绝缘电阻在0-50Ω之间均匀分布;
ADC转换误差在-10LSB于+10LSB之间均匀分布;
用Octave编写蒙特卡洛仿真程序,
  • format long;
  • adc = 0:1:4095;
  • adcc = zeros(1, 4096);
  • r2=8.2;
  • r3=10.8;
  • r4=18;
  • r1=6.3;
  • n=1000000;
  • for i=1:n
  •   r2d = ((rand - 0.5)*10/100 + 1) * r2;
  •   r3d = ((rand - 0.5)*10/100 + 1) * r3;
  •   r4d = ((rand - 0.5)*10/100 + 1) * r4;
  •   r1n = ((rand - 0.5)*10/100 + 1) * r1;
  •   r2on =r2d + (rand -0.5) * 0.05 + 0.025;
  •   r3on =r3d + (rand -0.5) * 0.05 + 0.025;
  •   r4on =r4d + (rand -0.5) * 0.05 + 0.025;
  •   r2off =(rand - 0.5)*900 + 550;
  •   r3off =(rand - 0.5)*900 + 550;
  •   r4off =(rand - 0.5)*900 + 550;
  •   rk = [0 0 0;0 0 1;0 1 0; 0 1 1; 1 0 0; 1 0 1; 1 1 0; 1 1 1];
  •   rki = floor(rand*8);
  •   rkn = rk(rki + 1,:);
  •   r2n = r2on;
  •   r3n = r3on;
  •   r4n = r4on;
  •   if(rkn(1) == 0)
  •     r2n = r2off;
  •   end
  •   if(rkn(2) == 0)
  •     r3n = r3off;
  •   end
  •   if(rkn(3) == 0)
  •     r4n = r4off;
  •   end
  •   rs = 1/ (1 / r2n + 1 / r3n + 1 /r4n);
  •   adv = r1n * 4096 / (r1n + rs);
  •   adn = floor(adv +(rand - 0.5) *20);
  •   if(adn < 0)
  •     adn = 0;
  •   end
  •   if(adn >= 4096)
  •     adn = 4095;
  •   end
  •   adn=adn+1;
  •   adcc(adn)=adcc(adn)+1;
  • end
  • plot(adc, adcc);


取1000000个样本,统计仿真得到的ADC值,绘制分布图,如下:
ADC值分布图

可见,8个按键组合的ADC值没有限定在区间范围内,而是发生了重叠。
也就是发生了按键状态误检测的现象。
结束:
将一个ADC口用于检测3个可能同时按下的按键时,会发生误检测的情况。
同时使用ADC口检测按键还存在没办法提供润湿电流的情况,在工作环境比较恶劣时,按键的机械触点易沾染灰尘等杂质,易被氧化,大大降低按键的使用寿命。

使用特权

评论回复

相关帖子

沙发
qbwww|  楼主 | 2023-4-24 08:14 | 只看该作者

2种按键的4种不同状态,可以得到4个不同的分压值,经过12位ADC转换得到不同的ADC值,以此为中心划分为4个区间。

使用特权

评论回复
板凳
桂维| | 2023-4-29 20:19 | 只看该作者
通过对判断条件取反,代码在逻辑表达上会更加清晰

使用特权

评论回复
地板
井古| | 2023-4-29 20:24 | 只看该作者
51 单片机不使用线性编址

使用特权

评论回复
5
加西亚| | 2023-4-29 20:29 | 只看该作者
如果在编程时加密锁定位被使能/锁定,就无法用普通编程器直接读取单片机内的程序

使用特权

评论回复
6
Wilmot| | 2023-4-29 20:35 | 只看该作者
多次检查也会给单片机带来负荷,对功耗不利

使用特权

评论回复
7
蓝良工| | 2023-4-29 20:40 | 只看该作者
与15号引脚连接的C1称为旁路电容

使用特权

评论回复
8
Jim789| | 2023-4-29 20:45 | 只看该作者
使能主从模式,触发事件选择为更新事件,不需要开启中断。

使用特权

评论回复
9
John11111| | 2023-4-29 20:51 | 只看该作者
计算量小,计算快。缺点也严重:在不同的图像中,颜色分布差别大,处理效果也不会很好。

使用特权

评论回复
10
Needham| | 2023-4-29 20:56 | 只看该作者
将整个表面铺上一层薄薄的铜箔,并且把多余的部份给消除

使用特权

评论回复
11
Fowler556| | 2023-4-29 21:01 | 只看该作者
控制模块的时钟仍然由外设时钟PCLK提供

使用特权

评论回复
12
Howard1980| | 2023-4-29 21:06 | 只看该作者
写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

733

主题

4517

帖子

14

粉丝