这篇文章主要为大家展示了“STM32触摸按键的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“STM32触摸按键的示例分析”这篇文章吧。
01,触摸按键原理
触摸使用RC充放电原理:
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,电路设计
电路设计时其实就是个上拉电阻
PCB设计,直接一个圆形,和底层接地覆铜形成杂散电容。
电容触摸按键原理
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触摸按键的示例分析