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

STM32 触摸按键

[复制链接]
STMCU-管管 发布时间:2020-9-10 12:45
01 触摸按键原理
触摸使用RC充放电原理:, b) F8 Q) w- l/ @
1.png

' S+ v2 I0 Z7 `1 F6 u( p3 x
RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用的电路。
( [5 l, m& b# P
充电过程:
电源通过电阻给电容充电,由于一开始电容两端的电压为0,所以电压的电压都在电阻上,这时电流大,充电速度快。随着电容两端电压的上升,电阻两端的电压下降,电流也随之减小,充电速度小。充电的速度与电阻和电容的大小有关。电阻R越大,充电越慢,电容C越大,充电越慢。衡量充电速度的常数t(tao)=RC。

7 a6 {( N/ }" P: W: @+ O$ M4 Q- D
放电过程:
电容C通过电阻R放电,由于电容刚开始放电时电压为E,放电电流I=E/R,该电流很大,所以放电速度很快。随着电容不断的放电,电容的电压也随着下降。电流也很快减小。电容的放电速度与RC有关,R的阻值越大,放电速度越慢。电容越大,放电速度越慢。
% ?0 a0 h6 i3 o4 z' a0 i" _
$ P/ P6 T/ G. h' n' q) E- j
RC电路充放电公式:
3 K9 r) N! h. n. u" o: i, ]

; r8 q8 |% ^; ?) m2 H( r7 \7 @' |
Vt = V0+(V1-V0)*[1-exp(-t/RC)]
V0 为电容上的初始电压值;

' }" D! m  |0 X0 ^
V1 为电容最终可充到或放到的电压值;

: R1 j5 J9 U, J) n
Vt 为t时刻电容上的电压值。
; {. k/ ~/ X- e9 ~% H8 @: A
如果V0为0,也就是从0V开始充电。那么公式简化为:
Vt=  V1* [1-exp(-t/RC)]
) E) k9 K/ v; d) U8 u0 L
结论:同样的条件下,电容值C跟时间值t成正比关系,电容越大,充电到达某个临界值的时间越长。
4 x2 S7 A6 w/ k7 Z
02 电路设计% Y! {$ ], B+ i0 v
电路设计时其实就是个上拉电阻- S5 e% ~( ]* f: b. P: M
2.png
9 s8 x; G1 |7 G7 S
PCB设计,直接一个圆形,和底层接地覆铜形成杂散电容。
3.png
电容触摸按键原理
4.png

7 b! j: n1 y4 Y
R:外接电容充放电电阻。
Cs:TPAD和PCB间的杂散电容。
Cx:手指按下时,手指和TPAD之间的电容。
开关:电容放电开关,由STM32IO口代替。
03 代码设计
% F0 Y; f, T" E# f% |
检测电容触摸按键过程# F# o! K/ ^! K' o2 }# ?9 d
' B! K5 Q& y$ u; a+ s. Q9 ~# ?
①TPAD引脚设置为推挽输出,输出0,实现电容放电到0。

& V3 D$ T$ o$ v
②TPAD引脚设置为浮空输入(IO复位后的状态),电容开始充电。
+ _; F0 q0 Y# b5 _, q% }( @; T+ A
③同时开启TPAD引脚的输入捕获开始捕获。
6 d) b2 _& e0 i" Q+ m
④等待充电完成(充电到底Vx,检测到上升沿)。

0 i. d  o( G$ e/ \
⑤计算充电时间。

, q& b' Y2 M6 `! Q7 l
触摸按键初始化
* b& ]' [- D; }) Y. u
  1. " D9 x$ k* w" L. o1 a
  2. uint8_t Touchpad_Init(void)7 u# t. u) l7 b* Y, R6 m) u" t; E
  3. {
    : c& S  y* c# p& M5 A2 _1 y6 o
  4.   uint16_t buf[10];
    ' ?3 |! u( I7 w
  5. uint16_t temp;
      ^0 ^8 }( x# _# v. Q( e: I
  6.   uint8_t j,i;  $ A9 m. J& ]# a) @
  7.   
    4 Z, g  D9 [. K6 i
  8. TIM_ICInitTypeDef  TIM_ICInitStructure;
    3 b' X) B- G% P: Q/ z+ {. _; {
  9.   & @% q7 G$ P* R! o6 _
  10.   /* TIM12Configuration */; t2 l8 F2 F$ y" d
  11.   TIM_Config();
    9 g2 m- ^3 L8 R+ f
  12. 3 N, X0 [* d9 C5 {- B7 ]
  13. TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    8 d6 _5 p; C  n/ h
  14. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;7 g0 t" C* G- s. A: R% s
  15. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    % L( b& {6 a& j' \" d9 ]
  16. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    , x# N# y9 b9 B. k) I/ i
  17. TIM_ICInitStructure.TIM_ICFilter = 0x0;2 n) Q' f) K& Z; i2 M" s+ n7 T
  18. 9 a/ M. Q! W. S  ^9 c5 y* c& H! J3 E
  19. TIM_ICInit(TIM12, &TIM_ICInitStructure);
    / @: r: K. h+ m
  20.   
    ( G) S$ E; Q" r8 i  a" l  h  f; o' m
  21.   /* Enablethe CC1 Interrupt Request */
    8 X" U; n3 ^' ?* ?7 t
  22.   TIM_ITConfig(TIM12,TIM_IT_CC1|TIM_IT_Update, ENABLE);
      B# g. [  |. p) g0 C
  23.     ?. P2 A0 C. q; j+ {  w
  24.   /* TIM enablecounter */
    ! z, U  s3 F( n" D7 @# E
  25.   TIM_Cmd(TIM12, ENABLE);
    # a; q% e3 `: l
  26.   / r9 f7 ~5 J( }8 ~
  27. for(i=0;i<10;i++)//连续读取10次
    ) \5 G0 j) e4 l- f0 C9 J! z# V0 F# C
  28. {5 O, x* H1 Y9 x  ~9 U0 B
  29.     buf[i]=Touchpad_Get_Val();: A+ x' O, g5 H4 g6 ]- e
  30.    SysCtlDelay(10*(SystemCoreClock/3000));   
      N" _' {6 b2 Z0 u% M
  31.   }' w, J8 s4 a, n4 y
  32.   
    + u/ _* r; Z9 `7 ^, s# O
  33. for(i=0;i<9;i++)//排序
    ; ]# G2 }( E# }8 ~2 C
  34. {
      x: ~% }( u! N
  35.     for(j=i+1;j<10;j++): _* a: ~+ w" ?: {
  36.     {/ \4 u" \3 {5 t: g, j7 v2 Z3 E
  37.      if(buf[i]>buf[j])//升序排列5 o; c+ n1 N: S( @
  38.      {
    5 C( w7 X+ @* G8 f3 e# S# e
  39.   temp=buf[i];$ f+ u' X9 N3 K+ Y4 Q5 U8 y
  40.   buf[i]=buf[j];: J' u  h. n, B" x. b9 l- x
  41.   buf[j]=temp;4 ?* D+ S6 O  p
  42.      }+ D2 `) M  g4 Y
  43.    }, T3 N! P. w1 {1 b
  44. }% O' |0 {# P5 f% D
  45. + }1 M; b/ r  A0 x  d) o' h
  46.   temp=0;, m; }3 m+ r# d- r% R
  47.   for(i=2;i<8;i++){
    4 j5 h. w/ B2 u6 N3 L$ q
  48.     temp+=buf[i];//取中间的8个数据进行平均
    4 s3 {8 Y. t$ z
  49.   }
    - w  A6 L5 |, O4 C, V
  50.   Touchpad_default_val=temp/6;  
    ( k( e: x' ]( Z. _; @$ l7 S
  51.   if(Touchpad_default_val>0XFFFF/2)
    ; p% b& g( k1 H+ R) S7 I
  52.      return1;//初始化遇到超过Touchpad_ARR_MAX_VAL/2的数值,不正常!/ j' b7 S2 d, D; r
  53.   return 0;  
      I+ }$ f* _# [! S
  54. }
复制代码
6 r% S: C5 n$ y( N6 i

6 M  R6 h9 z2 P
按键复位代码

( Z/ R9 S' H' h4 r. X% f! P& C
  1. " [9 I. t- _+ z
  2. void Touchpad_Reset()8 M6 ?4 P5 C! V
  3. {
    3 V" {4 v$ T1 ~' a
  4.   GPIO_InitTypeDefGPIO_InitStructure;+ m! ]% y# x: U7 r8 @) `
  5.   , n, i: @& l  R9 l+ X
  6.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    + C+ R$ D0 m; @0 P' B8 T. x0 l
  7.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    9 c+ _7 j- Q+ k% c/ }+ `
  8. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    ) k) j* q$ a% B, b
  9. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;% l+ h3 M" \  N+ D+ e
  10. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    ' ]: g1 L  @) H6 z- M2 {. T
  11. GPIO_Init(GPIOB, &GPIO_InitStructure);
    ' F  ^/ @$ S8 i* c6 X5 K( h/ N
  12.   / }" A  Y: G1 u* `' d, ]9 y' }- ^
  13. GPIO_ResetBits(GPIOB,GPIO_Pin_14);" i  D% \/ c% k. t7 _/ B& V0 n/ ?
  14.   ; @* e3 E8 H3 m# {
  15. SysCtlDelay(5*(SystemCoreClock/3000));: F1 O: j: F9 t
  16.   
    0 y0 E( f- C4 q
  17. TIM_ClearITPendingBit(TIM12, TIM_IT_Update|TIM_IT_CC1);" }/ U, C9 L* K7 o) z
  18. TIM_SetCounter(TIM12,0);3 ^5 V8 j6 _  l, l( d
  19.   ; w( j! Z" D) ^2 D! J7 A# `
  20.   
    * F) x2 r2 F' d3 ]
  21.   /* Connect TIM pinsto AF9 */! e' \1 f0 }; F: z
  22.   GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_TIM12);
    ! C/ W+ C9 k. k2 m' ]  h, U
  23.   
    ) a) b0 v# X5 T, ]7 R, f
  24.   /* TIM12 channel 1 pin (PB14)configuration */# h# M; U% h& ^* T3 j# U$ S' o5 c
  25.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;( c4 q, w) O1 k) a: e: b: C( N8 {
  26.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;8 |, C, A- p% q9 Y# i
  27.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;0 Z0 U7 m! B2 B, t  e! R' v
  28.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ; D* x) W; l3 [1 v; _5 i8 N
  29.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;2 }! K% G* n) a- ?7 q
  30.   GPIO_Init(GPIOB, &GPIO_InitStructure);) ?/ u: e# I, ]/ B: e( G8 ]
  31. }
复制代码
9 i5 k" ]2 r; \' C& M  V
) \1 t, e$ t% h3 S3 \' W
下载代码测试验证:
% Q8 F/ v% w4 U
5.gif

/ C2 e# X9 k8 V/ k) J  u
+ h2 W: ]: T- r+ q
赞 1 收藏 2 评论1 发布时间:2020-9-10 12:45

举报

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