你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 触摸按键

[复制链接]
STMCU 发布时间:2020-9-10 12:45
01 触摸按键原理
触摸使用RC充放电原理:
1.png

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

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

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


RC电路充放电公式:


Vt = V0+(V1-V0)*[1-exp(-t/RC)]
V0 为电容上的初始电压值;

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

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

如果V0为0,也就是从0V开始充电。那么公式简化为:
Vt=  V1* [1-exp(-t/RC)]

结论:同样的条件下,电容值C跟时间值t成正比关系,电容越大,充电到达某个临界值的时间越长。
02 电路设计
电路设计时其实就是个上拉电阻
2.png

PCB设计,直接一个圆形,和底层接地覆铜形成杂散电容。
3.png
电容触摸按键原理
4.png

R:外接电容充放电电阻。
Cs:TPAD和PCB间的杂散电容。
Cx:手指按下时,手指和TPAD之间的电容。
开关:电容放电开关,由STM32IO口代替。
03 代码设计
检测电容触摸按键过程

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

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

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

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

⑤计算充电时间。

触摸按键初始化


  1. uint8_t Touchpad_Init(void)
  2. {
  3.   uint16_t buf[10];
  4. uint16_t temp;
  5.   uint8_t j,i;  
  6.   
  7. TIM_ICInitTypeDef  TIM_ICInitStructure;
  8.   
  9.   /* TIM12Configuration */
  10.   TIM_Config();

  11. TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
  12. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  13. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  14. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  15. TIM_ICInitStructure.TIM_ICFilter = 0x0;

  16. TIM_ICInit(TIM12, &TIM_ICInitStructure);
  17.   
  18.   /* Enablethe CC1 Interrupt Request */
  19.   TIM_ITConfig(TIM12,TIM_IT_CC1|TIM_IT_Update, ENABLE);
  20.   
  21.   /* TIM enablecounter */
  22.   TIM_Cmd(TIM12, ENABLE);
  23.   
  24. for(i=0;i<10;i++)//连续读取10次
  25. {
  26.     buf[i]=Touchpad_Get_Val();
  27.    SysCtlDelay(10*(SystemCoreClock/3000));   
  28.   }
  29.   
  30. for(i=0;i<9;i++)//排序
  31. {
  32.     for(j=i+1;j<10;j++)
  33.     {
  34.      if(buf[i]>buf[j])//升序排列
  35.      {
  36.   temp=buf[i];
  37.   buf[i]=buf[j];
  38.   buf[j]=temp;
  39.      }
  40.    }
  41. }

  42.   temp=0;
  43.   for(i=2;i<8;i++){
  44.     temp+=buf[i];//取中间的8个数据进行平均
  45.   }
  46.   Touchpad_default_val=temp/6;  
  47.   if(Touchpad_default_val>0XFFFF/2)
  48.      return1;//初始化遇到超过Touchpad_ARR_MAX_VAL/2的数值,不正常!
  49.   return 0;  
  50. }
复制代码


按键复位代码


  1. void Touchpad_Reset()
  2. {
  3.   GPIO_InitTypeDefGPIO_InitStructure;
  4.   
  5.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  6.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  8. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  9. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  10. GPIO_Init(GPIOB, &GPIO_InitStructure);
  11.   
  12. GPIO_ResetBits(GPIOB,GPIO_Pin_14);
  13.   
  14. SysCtlDelay(5*(SystemCoreClock/3000));
  15.   
  16. TIM_ClearITPendingBit(TIM12, TIM_IT_Update|TIM_IT_CC1);
  17. TIM_SetCounter(TIM12,0);
  18.   
  19.   
  20.   /* Connect TIM pinsto AF9 */
  21.   GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_TIM12);
  22.   
  23.   /* TIM12 channel 1 pin (PB14)configuration */
  24.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;
  25.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  26.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  27.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  28.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  29.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  30. }
复制代码


下载代码测试验证:

5.gif


1 收藏 2 评论1 发布时间:2020-9-10 12:45

举报

1个回答
乐天乐 回答时间:2020-9-10 15:08:30
准确度和灵敏度如何?

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版