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

【经验分享】STM32 触摸按键

[复制链接]
STMCU小助手 发布时间:2022-6-23 21:00
01触摸按键原理
0 `5 [% Y8 l4 }, S
触摸使用RC充放电原理:
) g$ a' t( k: ^, l

9 y, z. ?; U' X8 y& y) f$ F6 I$ v, J1 s
1.png
. Z+ X: D0 l2 e. Y* k
RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用的电路。
充电过程:
电源通过电阻给电容充电,由于一开始电容两端的电压为0,所以电压的电压都在电阻上,这时电流大,充电速度快。随着电容两端电压的上升,电阻两端的电压下降,电流也随之减小,充电速度小。充电的速度与电阻和电容的大小有关。电阻R越大,充电越慢,电容C越大,充电越慢。衡量充电速度的常数t(tao)=RC。
: D! N' M, Z0 k9 W7 E% M5 V, \
放电过程:
电容C通过电阻R放电,由于电容刚开始放电时电压为E,放电电流I=E/R,该电流很大,所以放电速度很快。随着电容不断的放电,电容的电压也随着下降。电流也很快减小。电容的放电速度与RC有关,R的阻值越大,放电速度越慢。电容越大,放电速度越慢。
! C6 \( C0 q, \9 p& ]) v7 M2 Q
RC电路充放电公式:
# r! @3 U$ M6 r( k8 n1 ^
Vt = V0+(V1-V0)*[1-exp(-t/RC)]
V0 为电容上的初始电压值;
V1 为电容最终可充到或放到的电压值;
Vt 为t时刻电容上的电压值。
如果V0为0,也就是从0V开始充电。那么公式简化为:
Vt=  V1* [1-exp(-t/RC)]
% l0 O) t; H+ f# L5 V
结论:同样的条件下,电容值C跟时间值t成正比关系,电容越大,充电到达某个临界值的时间越长。2 _0 r# a7 s2 z, I# Y
! t  T3 R) N  g2 F! S
$ ~/ K% P9 x/ h9 v+ v4 z  l
02电路设计0 U5 Y9 o& [5 t
电路设计时其实就是个上拉电阻
, a1 X" s1 ]1 Z
, R( q& b* S/ C; u2 L3 g
2.png
5 X0 L" T: J0 Q& N( o' o
PCB设计,直接一个圆形,和底层接地覆铜形成杂散电容。

0 c; t* i! S2 H* W
3.png
+ F: X0 C6 P+ _
电容触摸按键原理

" y3 N( `4 w& i4 o. J& k4 r% v
4.png

  I. x% h7 Z! M
R:外接电容充放电电阻。
Cs:TPAD和PCB间的杂散电容。
Cx:手指按下时,手指和TPAD之间的电容。
开关:电容放电开关,由STM32IO口代替。
& N4 d/ S# p; p( }* j
03代码设计
( Y" V1 \7 @# N5 ~
检测电容触摸按键过程
; Q" ^9 Q& x4 W: T4 d
①TPAD引脚设置为推挽输出,输出0,实现电容放电到0。
②TPAD引脚设置为浮空输入(IO复位后的状态),电容开始充电。
③同时开启TPAD引脚的输入捕获开始捕获。
④等待充电完成(充电到底Vx,检测到上升沿)。
⑤计算充电时间。
触摸按键初始化
  1. uint8_t Touchpad_Init(void)* W* ?( o' m* ?
  2. {
    : l$ e7 Z7 u1 Y/ O2 d4 \) G& b
  3.   uint16_t buf[10];8 E& i) F# T1 c7 O& G; o  S" S
  4. uint16_t temp;
    % y3 @* @# ?" u2 M  ^% c! {
  5.   uint8_t j,i;  ; v, _8 w7 j, t; i4 T1 B, x2 q- H
  6.   
    ! G/ \1 U6 Y' j  V
  7. TIM_ICInitTypeDef  TIM_ICInitStructure;
    " \9 J* O" h4 l
  8.   6 z# X% }9 F: T; t% E6 r4 O
  9.   /* TIM12Configuration */# `, r- s6 X2 ^
  10.   TIM_Config();4 J- s4 N/ x9 C! _5 t& Y

  11. 2 V3 `( K0 F; ~  D
  12. TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    ; V/ Y) l* v9 E9 \
  13. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;7 E* n) @8 z5 q  K" e
  14. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;& t  r: Y. x( O' `2 H
  15. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;+ S# E* l  M/ p" z4 [1 f; U
  16. TIM_ICInitStructure.TIM_ICFilter = 0x0;# s& ]+ C) g* l7 R- l$ k: b/ N

  17. 8 V9 f6 G+ o$ K
  18. TIM_ICInit(TIM12, &TIM_ICInitStructure);  q* E# C) e1 E. e
  19.   
    # G2 s' \6 h( u. r. r
  20.   /* Enablethe CC1 Interrupt Request */" \6 a$ X# M: ~  J
  21.   TIM_ITConfig(TIM12,TIM_IT_CC1|TIM_IT_Update, ENABLE);
    % J, n/ `1 u" k% C. ]& P
  22.   9 n0 ]; T9 ^- a; z5 A' Y
  23.   /* TIM enablecounter */
    9 H  Y* B4 W9 f5 L  x
  24.   TIM_Cmd(TIM12, ENABLE);' t% a+ d: C$ o/ {
  25.   
    : D' [! |+ G( \8 J( Y
  26. for(i=0;i<10;i++)//连续读取10次
    4 H5 C0 o" ^7 l& n3 l* G
  27. {( t$ a" K  Q- I0 ^2 b9 f
  28.     buf[i]=Touchpad_Get_Val();) @7 U7 E# O: Q  n
  29.    SysCtlDelay(10*(SystemCoreClock/3000));   
    6 `! |- O! n! M" @/ a
  30.   }
    ' g% ^1 O- q: d
  31.   
    & X/ k' k; f1 r0 }1 D
  32. for(i=0;i<9;i++)//排序
    1 w& X* O1 P+ E. w6 @' w% Q+ [
  33. {+ e& g& C$ k1 C( x. s$ E
  34.     for(j=i+1;j<10;j++)
    . J9 m: D  b2 g% H% e
  35.     {
    7 v* A! P8 N: X+ U, @/ v& H
  36.      if(buf[i]>buf[j])//升序排列6 P+ k7 Z0 _, w& {3 g
  37.      {0 R9 x' n' O% L8 }3 L- }8 X
  38.   temp=buf[i];2 G: y3 C" O, X2 y9 G' c8 L" p  R
  39.   buf[i]=buf[j];
    . u7 A* l2 {8 {' H0 l" [1 C% i$ G
  40.   buf[j]=temp;6 A) X4 N& ]* a0 \* @
  41.      }
    # f5 F7 X5 \* U' _' a
  42.    }
    " T( y) q* p3 I7 r5 S
  43. }
    0 P' J! A( F& l, |0 X# h

  44. # e; e6 U& ^2 o" a/ j3 E4 j" z6 e
  45.   temp=0;
    5 y+ ^2 Y$ `. [
  46.   for(i=2;i<8;i++){
    1 Q7 q& T# c9 x
  47.     temp+=buf[i];//取中间的8个数据进行平均+ O9 b" S. E- t- j9 L+ n' I
  48.   }; h! b- l9 D/ F+ w
  49.   Touchpad_default_val=temp/6;  / D" N; j( g7 z* x0 {
  50.   if(Touchpad_default_val>0XFFFF/2)% r  H" {6 ~' `+ s( s
  51.      return1;//初始化遇到超过Touchpad_ARR_MAX_VAL/2的数值,不正常!
    7 O( V2 r9 L7 \4 \
  52.   return 0;  0 K7 \9 m7 a4 U% B
  53. }
复制代码

7 Y; B9 Z$ q+ H% c* T! }
按键复位代码
  1. void Touchpad_Reset(). x6 u( }/ I7 ~* y5 ?& Z
  2. {
    # S8 Z8 Y6 ?3 w' Y
  3.   GPIO_InitTypeDefGPIO_InitStructure;
    8 H0 U9 K, C5 X, S! g
  4.   9 ?3 P, U: a' T* M' ]5 y
  5.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;: a7 b$ \  e2 |0 F# F- p- R* q! r
  6.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    ' z4 ]: y) t) x8 f! R' v2 p$ H  ]
  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;4 X3 @4 Y8 A8 z4 m- |
  8. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;6 G  e) n' p; P4 A% k
  9. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      w/ X% o, O. @8 H5 C( `8 E; e6 P
  10. GPIO_Init(GPIOB, &GPIO_InitStructure);
    2 s, n9 z- e6 ?
  11.   
    8 I* V4 U  Y9 J4 p  k
  12. GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    " }+ ^" |! L+ C+ k
  13.   
    : t- J0 R' D9 @7 |: B  L  c
  14. SysCtlDelay(5*(SystemCoreClock/3000));( E0 X  o* [2 f4 S3 v, }/ |
  15.   
    - I  J* z  X3 K" v" C
  16. TIM_ClearITPendingBit(TIM12, TIM_IT_Update|TIM_IT_CC1);
    ) E% U6 u$ D! f7 B9 R  p
  17. TIM_SetCounter(TIM12,0);$ `+ `6 k6 ~7 a' d4 A
  18.   & V& f  ]; t6 b9 w, F0 \6 s
  19.   ! P# [$ H, a/ e- t, ^
  20.   /* Connect TIM pinsto AF9 */
    6 Y" t: v4 k( ]( L) n$ d
  21.   GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_TIM12);
    . _+ T) U: k6 }; `  P
  22.   
    6 [: |; c. E) ^% q9 p: P
  23.   /* TIM12 channel 1 pin (PB14)configuration */6 t* O) H, S  r: U& g$ x/ K2 y
  24.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;+ Q0 l! N/ ?  z- l& ~
  25.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;4 w+ E1 u- P) a7 N8 W: Z6 A4 l
  26.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;8 s$ m& ~& h4 W( w4 S3 [# m2 l6 f& L0 `
  27.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    * W: q( E& l) _
  28.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  S. o+ O+ K3 K6 V( E) u! H
  29.   GPIO_Init(GPIOB, &GPIO_InitStructure);
    / ~' |1 z: V4 ~$ f# S
  30. }
复制代码

" D& A6 e* f+ Q- d6 J3 H) o" C
下载代码测试验证:5 [) l  b! d+ T' P9 W! f
微信图片_20220622213108.gif
  ~; h; B4 ?/ M( q; f
赞 收藏 评论0 发布时间:2022-6-23 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版