|
01 触摸按键原理 触摸使用RC充放电原理:, b) F8 Q) w- l/ @
' S+ v2 I0 Z7 `1 F6 u( p3 xRC电路是指由电阻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
9 s8 x; G1 |7 G7 S
PCB设计,直接一个圆形,和底层接地覆铜形成杂散电容。 电容触摸按键原理
7 b! j: n1 y4 YR:外接电容充放电电阻。 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
- " D9 x$ k* w" L. o1 a
- uint8_t Touchpad_Init(void)7 u# t. u) l7 b* Y, R6 m) u" t; E
- {
: c& S y* c# p& M5 A2 _1 y6 o - uint16_t buf[10];
' ?3 |! u( I7 w - uint16_t temp;
^0 ^8 }( x# _# v. Q( e: I - uint8_t j,i; $ A9 m. J& ]# a) @
-
4 Z, g D9 [. K6 i - TIM_ICInitTypeDef TIM_ICInitStructure;
3 b' X) B- G% P: Q/ z+ {. _; { - & @% q7 G$ P* R! o6 _
- /* TIM12Configuration */; t2 l8 F2 F$ y" d
- TIM_Config();
9 g2 m- ^3 L8 R+ f - 3 N, X0 [* d9 C5 {- B7 ]
- TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
8 d6 _5 p; C n/ h - TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;7 g0 t" C* G- s. A: R% s
- TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
% L( b& {6 a& j' \" d9 ] - TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
, x# N# y9 b9 B. k) I/ i - TIM_ICInitStructure.TIM_ICFilter = 0x0;2 n) Q' f) K& Z; i2 M" s+ n7 T
- 9 a/ M. Q! W. S ^9 c5 y* c& H! J3 E
- TIM_ICInit(TIM12, &TIM_ICInitStructure);
/ @: r: K. h+ m -
( G) S$ E; Q" r8 i a" l h f; o' m - /* Enablethe CC1 Interrupt Request */
8 X" U; n3 ^' ?* ?7 t - TIM_ITConfig(TIM12,TIM_IT_CC1|TIM_IT_Update, ENABLE);
B# g. [ |. p) g0 C - ?. P2 A0 C. q; j+ { w
- /* TIM enablecounter */
! z, U s3 F( n" D7 @# E - TIM_Cmd(TIM12, ENABLE);
# a; q% e3 `: l - / r9 f7 ~5 J( }8 ~
- for(i=0;i<10;i++)//连续读取10次
) \5 G0 j) e4 l- f0 C9 J! z# V0 F# C - {5 O, x* H1 Y9 x ~9 U0 B
- buf[i]=Touchpad_Get_Val();: A+ x' O, g5 H4 g6 ]- e
- SysCtlDelay(10*(SystemCoreClock/3000));
N" _' {6 b2 Z0 u% M - }' w, J8 s4 a, n4 y
-
+ u/ _* r; Z9 `7 ^, s# O - for(i=0;i<9;i++)//排序
; ]# G2 }( E# }8 ~2 C - {
x: ~% }( u! N - for(j=i+1;j<10;j++): _* a: ~+ w" ?: {
- {/ \4 u" \3 {5 t: g, j7 v2 Z3 E
- if(buf[i]>buf[j])//升序排列5 o; c+ n1 N: S( @
- {
5 C( w7 X+ @* G8 f3 e# S# e - temp=buf[i];$ f+ u' X9 N3 K+ Y4 Q5 U8 y
- buf[i]=buf[j];: J' u h. n, B" x. b9 l- x
- buf[j]=temp;4 ?* D+ S6 O p
- }+ D2 `) M g4 Y
- }, T3 N! P. w1 {1 b
- }% O' |0 {# P5 f% D
- + }1 M; b/ r A0 x d) o' h
- temp=0;, m; }3 m+ r# d- r% R
- for(i=2;i<8;i++){
4 j5 h. w/ B2 u6 N3 L$ q - temp+=buf[i];//取中间的8个数据进行平均
4 s3 {8 Y. t$ z - }
- w A6 L5 |, O4 C, V - Touchpad_default_val=temp/6;
( k( e: x' ]( Z. _; @$ l7 S - if(Touchpad_default_val>0XFFFF/2)
; p% b& g( k1 H+ R) S7 I - return1;//初始化遇到超过Touchpad_ARR_MAX_VAL/2的数值,不正常!/ j' b7 S2 d, D; r
- return 0;
I+ }$ f* _# [! S - }
复制代码 6 r% S: C5 n$ y( N6 i
6 M R6 h9 z2 P
按键复位代码
( Z/ R9 S' H' h4 r. X% f! P& C
- " [9 I. t- _+ z
- void Touchpad_Reset()8 M6 ?4 P5 C! V
- {
3 V" {4 v$ T1 ~' a - GPIO_InitTypeDefGPIO_InitStructure;+ m! ]% y# x: U7 r8 @) `
- , n, i: @& l R9 l+ X
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
+ C+ R$ D0 m; @0 P' B8 T. x0 l - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
9 c+ _7 j- Q+ k% c/ }+ ` - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
) k) j* q$ a% B, b - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;% l+ h3 M" \ N+ D+ e
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
' ]: g1 L @) H6 z- M2 {. T - GPIO_Init(GPIOB, &GPIO_InitStructure);
' F ^/ @$ S8 i* c6 X5 K( h/ N - / }" A Y: G1 u* `' d, ]9 y' }- ^
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);" i D% \/ c% k. t7 _/ B& V0 n/ ?
- ; @* e3 E8 H3 m# {
- SysCtlDelay(5*(SystemCoreClock/3000));: F1 O: j: F9 t
-
0 y0 E( f- C4 q - TIM_ClearITPendingBit(TIM12, TIM_IT_Update|TIM_IT_CC1);" }/ U, C9 L* K7 o) z
- TIM_SetCounter(TIM12,0);3 ^5 V8 j6 _ l, l( d
- ; w( j! Z" D) ^2 D! J7 A# `
-
* F) x2 r2 F' d3 ] - /* Connect TIM pinsto AF9 */! e' \1 f0 }; F: z
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_TIM12);
! C/ W+ C9 k. k2 m' ] h, U -
) a) b0 v# X5 T, ]7 R, f - /* TIM12 channel 1 pin (PB14)configuration */# h# M; U% h& ^* T3 j# U$ S' o5 c
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;( c4 q, w) O1 k) a: e: b: C( N8 {
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;8 |, C, A- p% q9 Y# i
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;0 Z0 U7 m! B2 B, t e! R' v
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
; D* x) W; l3 [1 v; _5 i8 N - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;2 }! K% G* n) a- ?7 q
- GPIO_Init(GPIOB, &GPIO_InitStructure);) ?/ u: e# I, ]/ B: e( G8 ]
- }
复制代码 9 i5 k" ]2 r; \' C& M V
) \1 t, e$ t% h3 S3 \' W
下载代码测试验证: % Q8 F/ v% w4 U
/ C2 e# X9 k8 V/ k) J u
+ h2 W: ]: T- r+ q |