打印
[应用相关]

ST32之电容触摸按键实验

[复制链接]
1157|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1 电容触摸按键原理:
  1)RC充放电原理:       RC充放电电路就是一个电容和一个电阻串联起来,开关没有按下时,没有电流,CX两端的电压是0。当开关按下时,Cx电压从0开始充电,一直到V1


使用特权

评论回复
沙发
自动化陈稳|  楼主 | 2021-3-31 23:37 | 只看该作者

使用特权

评论回复
板凳
自动化陈稳|  楼主 | 2021-3-31 23:38 | 只看该作者
2)电容触摸按键原理:

使用特权

评论回复
地板
自动化陈稳|  楼主 | 2021-3-31 23:38 | 只看该作者
手指没按下的时候,TPAD与PCB之间有一个杂散电容。
手指按下后,相当于又并联一个电容Cx,电容值为Cs+Cx,电容变大,充电时间变长,通过判断充电时间长短来判断TPAD是否被按下。
这样在手指没按下的时候,去检测充电到某一个值的时间是t1,手指按下的时候再从0充电到某一个值的时间是t2,t2肯定要大于t1,这样就可以判断触摸按键有没有被按下

使用特权

评论回复
5
自动化陈稳|  楼主 | 2021-3-31 23:39 | 只看该作者
2 硬件连接讲解:

使用特权

评论回复
6
自动化陈稳|  楼主 | 2021-3-31 23:40 | 只看该作者

使用特权

评论回复
7
自动化陈稳|  楼主 | 2021-3-31 23:40 | 只看该作者
把电容放电到0后,要把计数器的值设为0,浮空之后,电容开始充电,充电到Vx之后,又把计数器的值记下来。然后就可以计算出充电的时间。每一次都去检测这个时间,进行比较,来确定是不是手按下了。我们需要通过 TIM5_CH2(PA1)采集 TPAD 的信号,所以本实验需要用跳线帽短接多功能端口(P14)的 TPAD 和 ADC,以实现 TPAD 连接到 PA1

使用特权

评论回复
8
自动化陈稳|  楼主 | 2021-3-31 23:41 | 只看该作者
3 实验程序讲解:
1)几个重要的函数:

使用特权

评论回复
9
自动化陈稳|  楼主 | 2021-3-31 23:41 | 只看该作者
① Tpad_Init函数:系统开始运行时执行这个函数,得到Tpad还没有按下时充电的时间。
(1) 初始化定时器5的通道2作为捕获通道。捕获后没有用中断,用的查询,比如设置为上升沿捕获,当捕获到上升沿后,相关的寄存器标志会被置1,当查询到这些寄存器置1,就说明捕获到上升沿了。

使用特权

评论回复
10
自动化陈稳|  楼主 | 2021-3-31 23:42 | 只看该作者
(2) 调用10次TPAD_Get_Val()函数,这个函数先调用TPAD_Reset函数,这个函数首先把引脚PA1输出低电平,等待电容放电完成,放电完成后把计数器的初始值设为0,然后把引脚设为浮空输入,设为浮空后电容开始充电,然后就不停的等待捕获上升沿,当捕获到上升沿后把捕获寄存器的值记下来,比如A。

使用特权

评论回复
11
自动化陈稳|  楼主 | 2021-3-31 23:43 | 只看该作者
调用10次,去掉一个最大值,去掉一个最小值,把中间的值取平均值。

使用特权

评论回复
12
自动化陈稳|  楼主 | 2021-3-31 23:44 | 只看该作者
② TPAD_Get_Val函数:
(1) 调用TPAD_Reset函数,这个函数就是把引脚PA1先设置成推挽输出,输出0,把电容放电,把计数器的值设置为0,然后又把PA1设置为浮空输入,电容充电。
(2) 等待上升沿捕获。
(3) 等待捕获到上升沿,返回捕获寄存器的值。

使用特权

评论回复
13
自动化陈稳|  楼主 | 2021-3-31 23:44 | 只看该作者

使用特权

评论回复
14
自动化陈稳|  楼主 | 2021-3-31 23:47 | 只看该作者
③ TPAD_Reset函数:这个函数就是把引脚PA1先设置成推挽输出,输出0,把电容放电,把计数器的值设置为0,然后又把PA1设置为浮空输入,电容充电。

使用特权

评论回复
15
自动化陈稳|  楼主 | 2021-3-31 23:47 | 只看该作者

使用特权

评论回复
16
自动化陈稳|  楼主 | 2021-6-30 16:28 | 只看该作者
④//读取n次,取最大值
//n:连续获取的次数
//返回值:n次读数里面读到的最大读数值
u16 TPAD_Get_MaxVal(u8 n)
{
u16 temp=0;
u16 res=0;
while(n--)
{
temp=TPAD_Get_Val();//得到一次值
if(temp>res)res=temp;   //获取最大值
};
return res;
}  

使用特权

评论回复
17
自动化陈稳|  楼主 | 2021-6-30 16:32 | 只看该作者
⑤ TPAD_Scan函数:
(1) 先调用TPAD_Get_MaxVal,这个函数N次调用TPAD_Get_Val,然后获取到最大值。

使用特权

评论回复
18
自动化陈稳|  楼主 | 2021-6-30 16:33 | 只看该作者
(2) 这个值与tpad_default_val+TPAD_GATE_VAL比较,如果大于,说明是按下。
      tpad_default_val为预先设置的一个值。这个预值是一个常数,是根据实际在测试中得出的一个常数。
比如没有按下的时候充电时间是10,检测多次后,比如检测10次,发现都是30左右,那么就认为30左右是按下,但又不知道30多少,有可能是28,也有可能是35,那我们就把没有按下时的10加上一个25,也就是说充电时间大于25,就认为是按下。

使用特权

评论回复
19
自动化陈稳|  楼主 | 2021-6-30 16:34 | 只看该作者

使用特权

评论回复
20
自动化陈稳|  楼主 | 2021-6-30 16:41 | 只看该作者
⑥ 主函数:

使用特权

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

本版积分规则

82

主题

1200

帖子

1

粉丝