STM32触摸按键的示例分析

  介绍

这篇文章主要为大家展示了“STM32触摸按键的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“STM32触摸按键的示例分析”这篇文章吧。

01,触摸按键原理

触摸使用RC充放电原理:

 STM32触摸按键的示例分析

RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用的电路。

充电过程:

电源通过电阻给电容充电,由于一开始电容两端的电压为0,所以电压的电压都在电阻上,这时电流大,充电速度快。随着电容两端电压的上升,电阻两端的电压下降,电流也随之减小,充电速度小。充电的速度与电阻和电容的大小有关。电阻R越大,充电越慢,电容C越大,充电越慢。衡量充电速度的常数t (t)=RC。

放电过程:

电容C通过电阻R放电,由于电容刚开始放电时电压为E,放电电流I=E/R,该电流很大,所以放电速度很快。随着电容不断的放电,电容的电压也随着下降。电流也很快减小。电容的放电速度与RC有关,R的阻值越大,放电速度越慢。电容越大,放电速度越慢。

RC电路充放电公式:

Vt=V0 + (V1-V0) * (1-exp (- t/RC)]

V0为电容上的初始电压值;

V1为电容最终可充到或放到的电压值;

Vt为t时刻电容上的电压值。

如果V0为0,也就是从0 v开始充电。那么公式简化为:

Vt=,V1 * [1-exp (- t/RC)]

结论:同样的条件下,电容值C跟时间t值成正比关系,电容越大,充电到达某个临界值的时间越长。

02,电路设计

电路设计时其实就是个上拉电阻

 STM32触摸按键的示例分析

PCB设计,直接一个圆形,和底层接地覆铜形成杂散电容。

 STM32触摸按键的示例分析

电容触摸按键原理

 STM32触摸按键的示例分析

R:外接电容充放电电阻。

Cs: TPAD和电路板间的杂散电容。

残雪:手指按下时,手指和TPAD之间的电容。

开关:电容放电开关,由STM32IO口代替。

03,代码设计

检测电容触摸按键过程

①TPAD引脚设置为推挽输出,输出0,实现电容放电到0。

②TPAD引脚设置为浮空输入(IO复位后的状态),电容开始充电。

③同时开启TPAD引脚的输入捕获开始捕获。

④等待充电完成(充电到底Vx,检测到上升沿)。

⑤计算充电时间。

触摸按键初始化

 uint8_t  Touchpad_Init(空白)
  {
  uint16_t 才能buf [10];
  ,uint16_t 温度;
  uint8_t 才能;j,我,,,
  ,,
  ,TIM_ICInitTypeDef  TIM_ICInitStructure;
  ,,/*,才能TIM12Configuration  */TIM_Config才能();
  ,=,,TIM_ICInitStructure.TIM_Channel  TIM_Channel_1;=,,TIM_ICInitStructure.TIM_ICPolarity  TIM_ICPolarity_Rising;=,,TIM_ICInitStructure.TIM_ICSelection  TIM_ICSelection_DirectTI;=,,TIM_ICInitStructure.TIM_ICPrescaler  TIM_ICPSC_DIV1;=,TIM_ICInitStructure.TIM_ICFilter  0 x0;
  ,
  ,TIM_ICInit (TIM12,和TIM_ICInitStructure);
  ,,/*,才能Enablethe  CC1  Interrupt  Request  */TIM_ITConfig才能(TIM12 TIM_IT_CC1 | TIM_IT_Update,,使);
  ,,/*,才能TIM  enablecounter  */TIM_Cmd才能(TIM12,,使);
  ,,
  ,(i=0; i<10;我+ +)//连续读取10次
  ,{
  ,,,但[我]=Touchpad_Get_Val ();
  ,,SysCtlDelay (10 * (SystemCoreClock/3000)),,,,,
  ,,}
  ,,
  ,(我=0;i<9;我+ +)//排序
  ,{
  ,,,(j=i + 1; j<10; j + +)
  ,,,{
  ,,,,如果(buf[我]祝辞buf [j])//升序排列
  ,,,,{
  临时才能=buf[我];
  buf才能[我]=buf [j];
  buf才能[j]=temp;
  ,,,,}
  ,,}
  ,}
  ,
  临时才能=0;
  ,,(我=2;i<8;我+ +){
  ,,,临时+=buf[我];//取中间的8个数据进行平均
  ,,}
  Touchpad_default_val才能=temp/6;,,
  如果才能(Touchpad_default_val> 0 xffff/2)
  ,,,,return1;//初始化遇到超过Touchpad_ARR_MAX_VAL/2的数值,不正常!
  return 才能;0;,,
  }

按键复位代码

 void  Touchpad_Reset ()
  {
  GPIO_InitTypeDefGPIO_InitStructure才能;
  ,,
  时间=GPIO_InitStructure.GPIO_Pin 才能;GPIO_Pin_14;
  时间=GPIO_InitStructure.GPIO_Mode 才能;GPIO_Mode_OUT;=,,GPIO_InitStructure.GPIO_Speed  GPIO_Speed_100MHz;=,,GPIO_InitStructure.GPIO_OType  GPIO_OType_PP;=,,GPIO_InitStructure.GPIO_PuPd  GPIO_PuPd_NOPULL;
  ,GPIO_Init (GPIOB,和GPIO_InitStructure);
  ,,
  ,GPIO_ResetBits (GPIOB GPIO_Pin_14);
  ,,
  ,SysCtlDelay (5 * (SystemCoreClock/3000));
  ,,
  ,TIM_ClearITPendingBit (TIM12, TIM_IT_Update | TIM_IT_CC1);
  ,TIM_SetCounter (TIM12 0);
  ,,
  ,,/*,才能Connect  TIM  pinsto  AF9  */GPIO_PinAFConfig才能(GPIOB, GPIO_PinSource14, GPIO_AF_TIM12);
  ,,/*,才能TIM12  channel  1, pin  (PB14) configuration  */GPIO_InitStructure.GPIO_Pin 才能=,,GPIO_Pin_14;
  时间=GPIO_InitStructure.GPIO_Mode 才能;GPIO_Mode_AF;
  时间=GPIO_InitStructure.GPIO_Speed 才能;GPIO_Speed_100MHz;
  时间=GPIO_InitStructure.GPIO_OType 才能;GPIO_OType_PP;
  时间=GPIO_InitStructure.GPIO_PuPd 才能;GPIO_PuPd_NOPULL;
  GPIO_Init才能(GPIOB,和GPIO_InitStructure);
  }

STM32触摸按键的示例分析