本帖最后由 正点原子运营 于 2023-11-7 14:28 编辑
第十一章 触摸按键控制LED灯实验
1)实验平台:正点原子 ATK-DFPGL22G开发板
2) 章节摘自【正点原子】ATK-DFPGL22G之FPGA开发指南_V1.0
6)FPGA技术交流QQ群:435699340
随着电子技术的不断发展,按键的应用场景越来越广泛。触摸按键在稳定性、使用寿命、抗干扰能力等方面都优于传统的机械按键,被广泛应用于遥控器,便携电子设备,楼道电灯开关,各类家电控制面板等方面。本章将介绍触摸按键的控制方法并使用开发板上的触摸按键控制led的亮灭。 本章分为以下几个章节: 1.1 触摸按键简介 1.2 实验任务 1.3 硬件设计 1.4 程序设计 1.5 下载验证
1.1 触摸按键简介触摸按键主要可分为四大类:电阻式、电容式、红外感应式以及表面声波式。根据其属性的不同,每种触摸按键都有其合适的使用领域。
电阻式触摸按键由多块导电薄膜按照按键的位置印制而成,但由于耐用性较差且维护复杂,目前使用率较低;红外感应式触摸按键通过红外扫描来识别按键位置,一般在较恶劣的环境下使用;表面声波式触摸按键利用声波扫描来识别是否按下,使用寿命长,较适合公共场所的POS机,无人售货机等处使用。
电容式触摸按键:这种按键的诞生主要是为了克服电阻式按键耐用性差的不足所提出的。电容式触摸按键采用电容量为评判标准,其感应区域可穿透绝缘外壳(玻璃、塑料等)20mm以上。其灵敏度和可靠性不会因环境条件的改变或长期使用而发生变化,具有防水、强抗干扰能力强、适应温度范围广以及使用寿命长等优点,是现代使用最广泛,发展最迅速的一种触摸按键。
接下来,我们具体的了解一下电容触摸按键的构造和工作原理。
电容触摸按键主要由按键IC部分和电容部分构成。按键IC部分主要由元器件供应商提供,用于将电容的变化转换为电信号。电容部分指的是由电容极板,地,隔离区等组成触摸按键的电容环境。
任何两个导电的物体之间都存在着感应电容,在周围环境不变的情况下,该感应电容值是固定不变的。如下图所示,手指接触到触摸按键时,按键和手指之间产生寄生电容,使按键的总容值增加。 触摸按键按下前后,电容的变化如下图所示。电容式触摸按键IC在检测到按键的感应电容值改变,并超过一定的阈值后,将输出有效信号表示按键被按下。 1.2 实验任务本节的实验任务是使用触摸按键控制LED灯的亮灭,开发板上电后LED为点亮状态,手指触摸后LED熄灭;当再次触摸时,LED点亮。
1.3 硬件设计开发板上的触摸按键部分的原理图如图 11.3.1所示。其中TPAD是芯片的输出引脚,连接到FPGA的IO端口。 开发板上所使用的触摸IC型号为AR101(或者JL223B,和AR101完全兼容),它可以通过OP1和OP2两个引脚选择不同的工作模式:OP1拉低时,OUT引脚输出信号高电平有效;OP1拉高时,OUT输出信号低电平有效。
当OP2拉低时,触摸IC工作在同步模式(类似于非自锁的轻触按键),即触摸时输出有效电平,松开后输出无有效电平;OP2拉高时触摸IC工作在保持模式(类似于自锁按键),即检测到触摸操作后输出有效电平,松开后,输出电平保持不变。当再次检测到触摸操作时,输出电平变化并继续保持。
图 11.3.1中触摸IC的引脚OP1和OP2均拉低,因此当手指按在触摸按键上时,OUT管脚输出3.3V电平,通过R158和R159进行分压得到一个小于3.3V的电压,由于该BANK电压不是3.3V的电平标准,所有我们通过分压来保证进入该BANK的电压不会由于过高的值导致该BANK电压升高,同理松开后输出低电平。
本实验中,系统时钟、复位按键、触摸按键和LED灯的管脚分配如下表所示。
对应的fdc约束语句如下所示: - define_attribute {p:led}{PAP_IO_DIRECTION} {OUTPUT}
- define_attribute {p:led}{PAP_IO_LOC} {G1}
- define_attribute {p:led}{PAP_IO_VCCIO} {1.5}
- define_attribute {p:led}{PAP_IO_STANDARD} {LVCMOS15}
- define_attribute {p:led} {PAP_IO_DRIVE}{4}
- define_attribute {p:led}{PAP_IO_NONE} {TRUE}
- define_attribute {p:led}{PAP_IO_SLEW} {SLOW}
- define_attribute {p:sys_clk}{PAP_IO_DIRECTION} {INPUT}
- define_attribute {p:sys_clk}{PAP_IO_LOC} {B5}
- define_attribute {p:sys_clk}{PAP_IO_VCCIO} {3.3}
- define_attribute {p:sys_clk}{PAP_IO_STANDARD} {LVCMOS33}
- define_attribute {p:sys_clk}{PAP_IO_NONE} {TRUE}
- define_attribute {p:sys_rst_n}{PAP_IO_DIRECTION} {INPUT}
- define_attribute {p:sys_rst_n}{PAP_IO_LOC} {G5}
- define_attribute {p:sys_rst_n}{PAP_IO_VCCIO} {1.5}
- define_attribute {p:sys_rst_n}{PAP_IO_STANDARD} {LVCMOS15}
- define_attribute {p:sys_rst_n}{PAP_IO_NONE} {TRUE}
- define_attribute {p:touch_key}{PAP_IO_DIRECTION} {INPUT}
- define_attribute {p:touch_key}{PAP_IO_LOC} {F1}
- define_attribute {p:touch_key}{PAP_IO_VCCIO} {1.5}
- define_attribute {p:touch_key}{PAP_IO_STANDARD} {LVCMOS15}
- define_attribute {p:touch_key}{PAP_IO_NONE} {TRUE}
复制代码
1.4 程序设计本次设计的模块端口及信号连接如下图所示。通过捕获触摸按键端口的上升沿,得到一个时钟周期的脉冲信号,来控制LED灯的亮灭。 触摸按键控制led代码如下: - 1 module touch_led(
- 2 //input
- 3 input sys_clk, //时钟信号50Mhz
- 4 input sys_rst_n, //复位信号
- 5 input touch_key, //触摸按键
- 6
- 7 //output
- 8 output reg led //LED灯
- 9 );
- 10
- 11 //regdefine
- 12 reg touch_key_d0;
- 13 reg touch_key_d1;
- 14
- 15 //wiredefine
- 16 wire touch_en;
- 17
- 18 //*****************************************************
- 19 //** main code
- 20 //*****************************************************
- 21
- 22 //捕获触摸按键端口的上升沿,得到一个时钟周期的脉冲信号
- 23 assign touch_en = (~touch_key_d1) & touch_key_d0;
- 24
- 25 //对触摸按键端口的数据延迟两个时钟周期
- 26 always @ (posedge sys_clk or negedge sys_rst_n) begin
- 27 if(!sys_rst_n) begin
- 28 touch_key_d0 <= 1'b0;
- 29 touch_key_d1 <= 1'b0;
- 30 end
- 31 else begin
- 32 touch_key_d0 <= touch_key;
- 33 touch_key_d1 <= touch_key_d0;
- 34 end
- 35 end
- 36
- 37 //根据触摸按键上升沿的脉冲信号切换led状态
- 38 always @ (posedge sys_clk or negedge sys_rst_n) begin
- 39 if (!sys_rst_n)
- 40 led <= 1'b1; //默认状态下,点亮LED
- 41 else begin
- 42 if (touch_en)
- 43 led <= ~led;
- 44 end
- 45 end
- 46
- 47 endmodule
复制代码程序中第22至35行是一个经典的边沿检测电路,通过检测touch_key的上升沿来捕获按键按下的信号,一旦检测到按键按下,输出一个时钟周期的脉冲touch_en。每当检测到touch_en的脉冲信号,led取反一次。为了验证我们的程序,我们在ModelSim内对代码进行仿真。
Testbench模块代码如下: - 1 `timescale 1ns / 1ps
- 2
- 3 module tb_touch_led();
- 4
- 5 //reg define
- 6 reg sys_clk;
- 7 reg sys_rst_n;
- 8 reg touch_key;
- 9
- 10 //wire define
- 11 wire led ;
- 12
- 13 always #10 sys_clk = ~sys_clk;
- 14
- 15 initial begin
- 16 sys_clk = 1'b0;
- 17 sys_rst_n = 1'b0;
- 18 touch_key = 0;
- 19 #200
- 20 sys_rst_n = 1'b1;
- 21 //touch_key信号变化
- 22 #40 touch_key = 1'b1 ; //40ns后触摸按键按下
- 23 #200 touch_key = 1'b0 ; //200ns触摸按键抬起
- 24 #40 touch_key = 1'b1 ; //40ns后触摸按键按下
- 25 #200 touch_key = 1'b0 ; //200ns触摸按键抬起
- 26 #40 touch_key = 1'b1 ; //40ns后触摸按键按下
- 27 #200 touch_key = 1'b0 ; //200ns触摸按键抬起
- 28 #40 touch_key = 1'b1 ; //40ns后触摸按键按下
- 29 #200 touch_key = 1'b0 ; //200ns触摸按键抬起
- 30 end
- 31
- 32 touch_led u_touch_led(
- 33 .sys_clk (sys_clk),
- 34 .sys_rst_n (sys_rst_n),
- 35 .touch_key (touch_key),
- 36 .led (led)
- 37 );
- 38
- 39 endmodule
复制代码仿真得到的波形图如图 11.4.2所示。从图中可以看出,当touch_key信号由电平变为高电平时,touch_key_d0和touch_key_d1信号分别延迟touch_key一个时钟周期和两个时钟周期,将touch_key_d0信号的和取反后的touch_key_d1信号相与,就得到一个时钟周期的脉冲信号(touch_en)。当检测到touch_en信号为高电平时,对led信号进行取反,从而实现触摸按键控制led灯的功能。 1.5 下载验证编译工程并生成比特流.sbit文件。将下载器一端连接电脑,另一端与开发板上的JTAG下载口连接,连接电源线,并打开开发板的电源开关。
点击Pango Design Suite菜单栏的“TOOLS”下面的“Configuration”,此时软件识别到下载器,点击“Fabric Configuration”窗口中左上角的scan device图标进行下载程序的操作,在弹出的界面中选择生成的sbit文件下载程序。
程序下载完成后,可以看到开发板上的LED3处于点亮状态,触碰一次触摸按键,就可以看到LED灯熄灭,再次触摸点亮LED灯。如下图所示: |