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

STM32MP1嵌入式Linux驱动开发指南V1.7-触摸按键控制LED灯实验

[复制链接]
STMCU小助手 发布时间:2022-9-27 12:54
触摸按键控制LED灯实验
- V# t' X9 l, ?/ Y! K/ e+ D随着电子技术的不断发展,按键的应用场景越来越广泛。触摸按键在稳定性、使用寿命、抗干扰能力等方面都优于传统的机械按键,被广泛应用于遥控器,便携电子设备,楼道电灯开关,各类家电控制面板等方面。本章将介绍触摸按键的控制方法并使用开发板上的触摸按键控制led的亮灭。$ i3 x/ f: ?  h; b& c: I) V
9 V9 @' A/ q9 g$ W5 |
11.1 触摸按键简介
( q0 o7 a+ u& G9 J* K8 s
触摸按键主要可分为四大类:电阻式、电容式、红外感应式以及表面声波式。根据其属性的不同,每种触摸按键都有其合适的使用领域。
4 O& t: g2 ^* x$ s: G7 D+ |电阻式触摸按键由多块导电薄膜按照按键的位置印制而成,但由于耐用性较差且维护复杂,目前使用率较低;红外感应式触摸按键通过红外扫描来识别按键位置,一般在较恶劣的环境下使用;表面声波式触摸按键利用声波扫描来识别是否按下,使用寿命长,较适合公共场所的POS机,无人售货机等处使用。6 W2 h; g3 l8 L) _1 i
电容式触摸按键:这种按键的诞生主要是为了克服电阻式按键耐用性差的不足所提出的。电容式触摸按键采用电容量为评判标准,其感应区域可穿透绝缘外壳(玻璃、塑料等)20mm以上。其灵敏度和可靠性不会因环境条件的改变或长期使用而发生变化,具有防水、强抗干扰能力强、适应温度范围广以及使用寿命长等优点,是现代使用最广泛,发展最迅速的一种触摸按键。0 p" n' @9 [" g9 g8 V% B5 |
接下来,我们具体的了解一下电容触摸按键的构造和工作原理。
' o, l, b& D3 h电容触摸按键主要由按键IC部分和电容部分构成。按键IC部分主要由元器件供应商提供,用于将电容的变化转换为电信号。电容部分指的是由电容极板,地,隔离区等组成触摸按键的电容环境。
4 y- E5 B# \% O' C4 p4 R# n  d9 ~任何两个导电的物体之间都存在着感应电容,在周围环境不变的情况下,该感应电容值是固定不变的。如下图所示,手指接触到触摸按键时,按键和手指之间产生寄生电容,使按键的总容值增加。
2 ?2 p6 @* a- l! k& ?( w/ V$ R* Q' w4 I  z! }# m
图 7.5.13.1 触摸按键寄生电容示意图& m' o' B8 q: E
触摸按键按下前后,电容的变化如下图所示。电容式触摸按键IC在检测到按键的感应电容值改变,并超过一定的阈值后,将输出有效信号表示按键被按下。- q. t2 [8 w" ~- h

/ [3 P' D) V& d, B b537a343c4124369844ecb2b5ea75c01.png $ Z" k$ ]' M, U$ P
( T  Y  t6 c6 h9 K  e
图 7.5.13.2 触摸过程电容变化示意图
1 ~8 ]. t. O. T# K11.2 实验任务8 y( D/ u  _4 X9 f8 h  H  v
本节的实验任务是使用触摸按键控制LED灯的亮灭,开发板上电后LED为点亮状态,手指触摸后LED熄灭;当再次触摸时,LED点亮。; M3 m: l9 _+ T0 R0 S( @2 W) \& h

7 W8 d' s; E3 Q/ g11.3 硬件设计
. t& X3 Y7 h' I& G/ F2 W! z: x
领航者开发板上的触摸按键部分的原理图如图 7.5.13.1所示。其中TPAD是芯片的输出引脚,连接到ZYNQ的IO端口。
) R; }$ e8 E( U9 S* S9 |' B9 _& F% q" H' \
2971b157e5b14ffe9b231328197670d3.png 6 y$ H( N$ c% q. y
: q" m: m$ e, d0 M4 s
图 7.5.13.1 触摸按键电路原理图. J4 p3 Y/ }$ D  i' g8 `8 S" f0 @
开发板上所使用的触摸IC型号为AR101(或者JL223B,和AR101完全兼容),它可以通过OP1和OP2两个引脚选择不同的工作模式:OP1拉低时,OUT引脚输出信号高电平有效;OP1拉高时,OUT输出信号低电平有效。
4 s- {: o8 f5 F* Q当OP2拉低时,触摸IC工作在同步模式(类似于非自锁的轻触按键),即触摸时输出有效电平,松开后输出无有效电平;OP2拉高时触摸IC工作在保持模式(类似于自锁按键),即检测到触摸操作后输出有效电平,松开后,输出电平保持不变。当再次检测到触摸操作时,输出电平变化并继续保持。- Y+ h" ?  W6 k: N/ b9 q
图 7.5.13.1中触摸IC的引脚OP1和OP2均拉低,因此当手指按在触摸按键上时,TOUT管脚输高电平,松开后输出低电平。8 r, X( g4 E! H0 S3 \+ \" W8 J) v' `
本实验中,系统时钟、复位按键、触摸按键和LED灯的管脚分配如下表所示,其中时钟晶振位于核心板上,复位按键、触摸按键和LED位于底板上。
% f+ o& T  u! O; P9 L( s表 11.3.1 触摸按键控制LED管脚分配图
4 x9 T: P8 N7 H" |9 V信号名 方向 管脚 端口说明 电平标准# q9 |; _, i. y5 t: \
sys_clk input U18 系统时钟,50M LVCMOS33
) R4 S0 ]: @* V$ @3 qsys_rst_n input N16 系统复位,低有效 LVCMOS33
5 R: s  R* e/ g$ r: z! etouch_key input F16 触摸按键信号 LVCMOS33" Z' R! f9 O; y9 ]* k7 F
led output H15 LED LVCMOS33# r6 U1 ^) y! n0 P
对应的XDC约束语句如下所示:
' R( \& H& C/ u( O; n  w0 ]% r+ G7 ?, |
  1. #IO约束
    * k( D0 X6 e* z9 U8 ]
  2. set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]3 l8 P) n1 f' b' l% {
  3. set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]9 g  q* t) F9 y( f9 @
  4. set_property -dict {PACKAGE_PIN F16 IOSTANDARD LVCMOS33} [get_ports touch_key]5 Z5 _; M  W& ~6 ~7 @1 n4 D- A" A
  5. set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS33} [get_ports led]
复制代码

( @+ A3 B5 N' l5 O11.4 程序设计
5 ^9 t  c" E. i4 s' X7 \7 a本次设计的模块端口及信号连接如下图所示。通过捕获触摸按键端口的上升沿,得到一个时钟周期的脉冲信号,来控制LED灯的亮灭。
/ P) g: [0 c5 B! Z2 T
6 U3 S9 P0 @0 A/ l8 f: E7 W e30ab99643f74304aa0384b9f0bda18a.png
; g6 d+ r& G' I  Z8 j1 F/ R5 h8 }% Q* g6 i
图 7.5.13.1 模块端口及信号连接图
/ o. A) o" F8 S. F7 g触摸按键控制led代码如下:2 _! a; s5 J1 i+ r) P% O
! t0 W2 T7 f/ |2 C1 ~) u* d
  1. 1  module touch_led(2 X, I8 r) f2 t$ {6 T
  2. 2      //input; L9 Z$ @6 V" S4 ^4 J( n( `% u2 E5 P
  3. 3      input        sys_clk,      //时钟信号50Mhz( _. K6 V  N) B& @+ i! y4 w( V
  4. 4      input        sys_rst_n,    //复位信号
    : f; c" k& S. g0 e% p: M
  5. 5      input        touch_key,    //触摸按键 5 K) _8 u" I& [  ?" t9 q
  6. 6   
    * o6 k+ _! p8 a
  7. 7      //output+ B. N; i6 J' N' K+ P& y' s
  8. 8      output  reg  led           //LED灯+ ^1 Y) F' ^; F8 t: W0 e% j8 _/ X0 K
  9. 9  );  T- m3 c/ t% d" U/ K8 d1 s
  10. 10
    8 E# v7 y1 j$ q
  11. 11 //reg define$ U3 p" f. m$ K8 P, l: h- C
  12. 12 reg    touch_key_d0;5 l( q+ ?9 X$ p% Q) q' c
  13. 13 reg    touch_key_d1;; d1 I6 H/ p# j, j5 M
  14. 14
    1 X. H6 p0 P9 i1 r6 S% w" C: b' E
  15. 15 //wire define
    3 X6 t) t# t- x6 I+ w) J& \
  16. 16 wire   touch_en;
    2 S7 F6 S! d1 n( [3 ~) Q9 W' r9 i
  17. 17 ' f0 y  c) q9 a
  18. 18 //*****************************************************2 G2 H' F# S3 P' ~4 L4 L, ^  w
  19. 19 //**                    main code
    ' d) E" |/ m0 k1 Y3 }
  20. 20 //*****************************************************
    3 l" P, W6 D8 p+ T0 n6 {" u7 F
  21. 21 ! s% S5 Y$ o+ y( U( N
  22. 22 //捕获触摸按键端口的上升沿,得到一个时钟周期的脉冲信号
    0 q: m* J. g4 q3 |: T! d2 A; }
  23. 23 assign  touch_en = (~touch_key_d1) & touch_key_d0;+ p/ ~5 L# K9 `  F. k
  24. 24 ) u- V& @+ p1 F# A1 [
  25. 25 //对触摸按键端口的数据延迟两个时钟周期! |3 @/ R4 w- E# e) `
  26. 26 always @ (posedge sys_clk or negedge sys_rst_n) begin
    # E5 x+ G" v) `) i9 D. m# G
  27. 27     if(!sys_rst_n) begin
    ; q+ J0 D$ G9 I, y1 q  @0 z- u
  28. 28         touch_key_d0 <= 1'b0;
    0 ~, x( d) v: G& o( L
  29. 29         touch_key_d1 <= 1'b0;
    # d3 y( ^7 k0 T3 X4 c/ a
  30. 30     end9 P% r- _+ J5 ~
  31. 31     else begin
    0 D5 m4 o9 X7 e4 |& F/ j
  32. 32         touch_key_d0 <= touch_key;' a9 Y+ }# Q* c0 u5 u; t
  33. 33         touch_key_d1 <= touch_key_d0;
    " g0 p( B  N% u( E
  34. 34     end
    7 R; H$ t! P( a0 s# Q
  35. 35 end
    6 o, |! A( w+ W  O! h
  36. 36
    8 n4 T: p) `6 w% E
  37. 37 //根据触摸按键上升沿的脉冲信号切换led状态5 q. i7 D1 ]: z* O7 ]% L
  38. 38 always @ (posedge sys_clk or negedge sys_rst_n) begin; F% m( @3 d  n  O; U9 t
  39. 39     if (!sys_rst_n)
    ' L- S% K  Z: e1 v8 Q* I7 c2 d* l
  40. 40         led <= 1'b1;       //默认状态下,点亮LED0 Z& [: M" h* G3 M
  41. 41     else begin
    9 @4 w% Q0 v) B' L# ]) x" L5 a2 G
  42. 42         if (touch_en)' \2 i7 m2 N2 n+ j
  43. 43             led <= ~led;
    " P, n7 Q$ L. D" z6 P  D' k
  44. 44     end
    3 k& L% w( n, X+ D0 I8 r! o" f
  45. 45 end
    . t4 z% K  `# j  u" S1 w
  46. 46 ' v+ `# E6 y7 S$ I: K$ B2 G
  47. 47 endmodule
复制代码
0 n# {5 n& H1 B0 C" s% n
程序中第22至35行是一个经典的边沿检测电路,通过检测touch_key的上升沿来捕获按键按下的信号,一旦检测到按键按下,输出一个时钟周期的脉冲touch_en。每当检测到touch_en的脉冲信号,led取反一次。
0 X% d1 ^: \) m& Y% X! Z( F5 B4 c为了验证我们的程序,我们在Vivado内对代码进行仿真。" N" @$ O" Q/ b9 E' o
Testbench模块代码如下:4 w6 ~) ~' Q- [& h$ U
, w  a+ D- t3 O) |4 s: e
  1. 1  `timescale 1ns / 1ps4 L) t4 G1 Z# D6 e
  2. 2  
    ( g$ n4 Q- y' T( H; z6 L. s& P3 f
  3. 3  module tb_touch_led();
    / O4 ^( M+ c. Y: t; S; S% l
  4. 4  
    : v7 V) V% x# m! J( E
  5. 5  //reg define* E- w/ d5 X1 b9 C0 ], f, |$ t8 u
  6. 6  reg     sys_clk;
    1 J" o; s: q8 @+ ?  R& h
  7. 7  reg     sys_rst_n;     
    ! @! r' ]% E# ^; q8 T- r1 @
  8. 8  reg     touch_key;
    ; V5 {2 g& N4 H* J% V
  9. 9  
    / |. J& E) Z( N$ }- c) a
  10. 10 //wire define. q' d# O8 t- A" b
  11. 11 wire          led ;) z5 _. S6 w: H) k- C
  12. 12         
    9 A5 L" d" v* A; \
  13. 13 always #10 sys_clk = ~sys_clk;
    5 B2 j9 p* m% M& z
  14. 14 % W! Q( ^- o; M( O, k. f3 N4 Z$ J
  15. 15 initial begin6 Y( B- U" W1 _; m# |2 C. \  D
  16. 16     sys_clk = 1'b0;
    & ]( B+ E- ~4 f! ~
  17. 17     sys_rst_n = 1'b0;9 }7 W/ Y: \4 K
  18. 18     touch_key = 0;
    % D3 ?, a8 j1 U2 _# f
  19. 19     #200
    ) X8 f0 d; s  w1 m* y% p: d
  20. 20     sys_rst_n = 1'b1;7 q5 p. ]0 B' f- k
  21. 21     //touch_key信号变化5 A* ]4 n+ L! z2 e1 ^
  22. 22     #40  touch_key = 1'b1 ;  //40ns后触摸按键按下( U9 t3 L6 ?) ?. C; v& |5 j
  23. 23     #200 touch_key = 1'b0 ;  //200ns触摸按键抬起
    4 D4 _9 Q( H) {! p' f. ^& z
  24. 24     #40  touch_key = 1'b1 ;  //40ns后触摸按键按下. n- r; F) {- H$ B# E' l& s/ b
  25. 25     #200 touch_key = 1'b0 ;  //200ns触摸按键抬起
    % ^- F& X1 m5 ^5 S* N$ D8 ^' g
  26. 26     #40  touch_key = 1'b1 ;  //40ns后触摸按键按下
    " m1 V* t5 H1 M) o, I' S6 l+ |% ?
  27. 27     #200 touch_key = 1'b0 ;  //200ns触摸按键抬起( s% z% g# q8 B5 `
  28. 28     #40  touch_key = 1'b1 ;  //40ns后触摸按键按下6 F0 V6 b3 s1 w  a  \
  29. 29     #200 touch_key = 1'b0 ;  //200ns触摸按键抬起            
      _  s4 o$ a4 _( h# m- P( t0 \
  30. 30 end
    8 R  b) y/ a6 W+ O( H# `7 I
  31. 31 4 p% ?) Q9 t4 s# T; D: d; n/ u! S4 D
  32. 32 touch_led  u_touch_led(
    " o" M8 L; `9 k0 V& W( T
  33. 33     .sys_clk   (sys_clk),
    7 j7 x. d8 _1 h
  34. 34     .sys_rst_n (sys_rst_n),
    0 a& G# R* O9 u5 E3 T! X: v# J
  35. 35     .touch_key (touch_key),' R' h. y* Z: u
  36. 36     .led       (led)- C$ [1 r# v. k! m/ K' \. n2 M2 u
  37. 37 );
    5 _& d( a5 x, [! s: r
  38. 38 0 W9 Q4 n8 S5 v$ Y. n& `$ O
  39. 39 endmodule
复制代码
% F+ K- }9 c8 i% h
仿真得到的波形图如图 7.5.13.2所示。从图中可以看出,当touch_key信号由电平变为高电平时,touch_key_d0和touch_key_d1信号分别延迟touch_key一个时钟周期和两个时钟周期,将touch_key_d0信号的和取反后的touch_key_d1信号相与,就得到一个时钟周期的脉冲信号(touch_en)。当检测到touch_en信号为高电平时,对led信号进行取反,从而实现触摸按键控制led灯的功能。
, _$ q1 U' a' ~9 \8 D- w
9 j3 C& I/ \8 Q4 q4 P' e9 S a109578c334147a2b24c15747ac3f9f2.png ' n# m: e! g" D7 q9 n! v% x
3 i- [+ Q: b5 E1 y
图 7.5.13.2 仿真波形
. ^( f  ?& R8 V/ U5 u' R8 b; D11.5 下载验证# N) t4 t* E% _- i  v# |
编译工程并生成比特流.bit文件。将下载器一端连接电脑,另一端与开发板上的JTAG下载口连接,连接电源线,并打开开发板的电源开关。
' J: ?; y+ d' G$ p点击Vivado左侧“Flow Navigator”窗口最下面的“Open Hardware Manager”,此时Vivado软件识别到下载器,点击“Hardware”窗口中“Progam Device”下载程序,在弹出的界面中选择“Program”下载程序。! P1 _& _: ?' K: \" W
程序下载完成后,可以看到底板上的PL_LED0处于点亮状态,触碰一次触摸按键,就可以看到LED灯熄灭,再次触摸点亮LED灯。如下图所示:
, f& o! O& K4 ]* k: `# E! B8 x- u  n7 p% M* ?1 Q
a8faa16700d04a968fb70ded12a80b20.png
9 C! J( t* y9 y" ]+ [" o( \& Y6 D# Q
图 7.5.13.1 按键控制LED灯实验现象
) w. R4 z, e* b' x, `/ d+ ]" |( b————————————————3 s" @- i  H& i" L
版权声明:正点原子& r6 A2 u/ v4 k

- \% r. ~% |6 X
9 n- `' Q& T5 Z
赞 收藏 评论0 发布时间:2022-9-27 12:54

举报

0个回答

所属标签

相似技术帖

官网相关资源

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