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 . 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
5 X0 L" T: J0 Q& N( o' o
PCB设计,直接一个圆形,和底层接地覆铜形成杂散电容。
0 c; t* i! S2 H* W + F: X0 C6 P+ _
电容触摸按键原理
" y3 N( `4 w& i4 o. J& k4 r% v
I. x% h7 Z! MR:外接电容充放电电阻。 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,检测到上升沿)。 ⑤计算充电时间。 触摸按键初始化 - uint8_t Touchpad_Init(void)* W* ?( o' m* ?
- {
: l$ e7 Z7 u1 Y/ O2 d4 \) G& b - uint16_t buf[10];8 E& i) F# T1 c7 O& G; o S" S
- uint16_t temp;
% y3 @* @# ?" u2 M ^% c! { - uint8_t j,i; ; v, _8 w7 j, t; i4 T1 B, x2 q- H
-
! G/ \1 U6 Y' j V - TIM_ICInitTypeDef TIM_ICInitStructure;
" \9 J* O" h4 l - 6 z# X% }9 F: T; t% E6 r4 O
- /* TIM12Configuration */# `, r- s6 X2 ^
- TIM_Config();4 J- s4 N/ x9 C! _5 t& Y
2 V3 `( K0 F; ~ D- TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
; V/ Y) l* v9 E9 \ - TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;7 E* n) @8 z5 q K" e
- TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;& t r: Y. x( O' `2 H
- TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;+ S# E* l M/ p" z4 [1 f; U
- TIM_ICInitStructure.TIM_ICFilter = 0x0;# s& ]+ C) g* l7 R- l$ k: b/ N
8 V9 f6 G+ o$ K- TIM_ICInit(TIM12, &TIM_ICInitStructure); q* E# C) e1 E. e
-
# G2 s' \6 h( u. r. r - /* Enablethe CC1 Interrupt Request */" \6 a$ X# M: ~ J
- TIM_ITConfig(TIM12,TIM_IT_CC1|TIM_IT_Update, ENABLE);
% J, n/ `1 u" k% C. ]& P - 9 n0 ]; T9 ^- a; z5 A' Y
- /* TIM enablecounter */
9 H Y* B4 W9 f5 L x - TIM_Cmd(TIM12, ENABLE);' t% a+ d: C$ o/ {
-
: D' [! |+ G( \8 J( Y - for(i=0;i<10;i++)//连续读取10次
4 H5 C0 o" ^7 l& n3 l* G - {( t$ a" K Q- I0 ^2 b9 f
- buf[i]=Touchpad_Get_Val();) @7 U7 E# O: Q n
- SysCtlDelay(10*(SystemCoreClock/3000));
6 `! |- O! n! M" @/ a - }
' g% ^1 O- q: d -
& X/ k' k; f1 r0 }1 D - for(i=0;i<9;i++)//排序
1 w& X* O1 P+ E. w6 @' w% Q+ [ - {+ e& g& C$ k1 C( x. s$ E
- for(j=i+1;j<10;j++)
. J9 m: D b2 g% H% e - {
7 v* A! P8 N: X+ U, @/ v& H - if(buf[i]>buf[j])//升序排列6 P+ k7 Z0 _, w& {3 g
- {0 R9 x' n' O% L8 }3 L- }8 X
- temp=buf[i];2 G: y3 C" O, X2 y9 G' c8 L" p R
- buf[i]=buf[j];
. u7 A* l2 {8 {' H0 l" [1 C% i$ G - buf[j]=temp;6 A) X4 N& ]* a0 \* @
- }
# f5 F7 X5 \* U' _' a - }
" T( y) q* p3 I7 r5 S - }
0 P' J! A( F& l, |0 X# h -
# e; e6 U& ^2 o" a/ j3 E4 j" z6 e - temp=0;
5 y+ ^2 Y$ `. [ - for(i=2;i<8;i++){
1 Q7 q& T# c9 x - temp+=buf[i];//取中间的8个数据进行平均+ O9 b" S. E- t- j9 L+ n' I
- }; h! b- l9 D/ F+ w
- Touchpad_default_val=temp/6; / D" N; j( g7 z* x0 {
- if(Touchpad_default_val>0XFFFF/2)% r H" {6 ~' `+ s( s
- return1;//初始化遇到超过Touchpad_ARR_MAX_VAL/2的数值,不正常!
7 O( V2 r9 L7 \4 \ - return 0; 0 K7 \9 m7 a4 U% B
- }
复制代码
7 Y; B9 Z$ q+ H% c* T! }
按键复位代码 - void Touchpad_Reset(). x6 u( }/ I7 ~* y5 ?& Z
- {
# S8 Z8 Y6 ?3 w' Y - GPIO_InitTypeDefGPIO_InitStructure;
8 H0 U9 K, C5 X, S! g - 9 ?3 P, U: a' T* M' ]5 y
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;: a7 b$ \ e2 |0 F# F- p- R* q! r
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
' z4 ]: y) t) x8 f! R' v2 p$ H ] - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;4 X3 @4 Y8 A8 z4 m- |
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;6 G e) n' p; P4 A% k
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
w/ X% o, O. @8 H5 C( `8 E; e6 P - GPIO_Init(GPIOB, &GPIO_InitStructure);
2 s, n9 z- e6 ? -
8 I* V4 U Y9 J4 p k - GPIO_ResetBits(GPIOB,GPIO_Pin_14);
" }+ ^" |! L+ C+ k -
: t- J0 R' D9 @7 |: B L c - SysCtlDelay(5*(SystemCoreClock/3000));( E0 X o* [2 f4 S3 v, }/ |
-
- I J* z X3 K" v" C - TIM_ClearITPendingBit(TIM12, TIM_IT_Update|TIM_IT_CC1);
) E% U6 u$ D! f7 B9 R p - TIM_SetCounter(TIM12,0);$ `+ `6 k6 ~7 a' d4 A
- & V& f ]; t6 b9 w, F0 \6 s
- ! P# [$ H, a/ e- t, ^
- /* Connect TIM pinsto AF9 */
6 Y" t: v4 k( ]( L) n$ d - GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_TIM12);
. _+ T) U: k6 }; ` P -
6 [: |; c. E) ^% q9 p: P - /* TIM12 channel 1 pin (PB14)configuration */6 t* O) H, S r: U& g$ x/ K2 y
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;+ Q0 l! N/ ? z- l& ~
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;4 w+ E1 u- P) a7 N8 W: Z6 A4 l
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;8 s$ m& ~& h4 W( w4 S3 [# m2 l6 f& L0 `
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
* W: q( E& l) _ - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; S. o+ O+ K3 K6 V( E) u! H
- GPIO_Init(GPIOB, &GPIO_InitStructure);
/ ~' |1 z: V4 ~$ f# S - }
复制代码
" D& A6 e* f+ Q- d6 J3 H) o" C
下载代码测试验证:5 [) l b! d+ T' P9 W! f
~; h; B4 ?/ M( q; f
|