一、背景介绍
- 简介:触摸按键在稳定性、使用寿命、抗干扰能力等方面都优于传统的机械按键,被广泛应用于遥控器,便携式电子设备,楼道开关和各种智能控制等方面。
- 分类
- 电阻式触摸按键:是由多块导电薄膜按照按键的位置印制而成,但由于耐用性较差且维护复杂,目前使用率较低;
- 电容式触摸按键:它的诞生主要是为了克服电阻式按键耐用性差的不足所提出的。电容式触摸按键采用电容量来评判标准,其感应区域可穿透绝缘外壳(玻璃、塑料等)20mm以上。其灵敏度和可靠性不会因环境条件的改变或者长期使用而发生变化,具有防水、强抗干扰能力、适应温度范围广以及使用寿命长等优点,是现代使用最广泛,发展最迅速的一种触摸按键。
- 红外感应式触摸按键:通过红外扫描来识别按键位置,一般在较恶劣的环境下使用;
- 表面声波式触摸按键:利用声波扫描来识别是否按下,使用寿命长,较适合公共场合的pos机,无人售货机等处使用。
- 电容触摸按键的构造和工作原理
- 电容触摸按键主要由按键IC部分和电容部分构成。按键IC部分主要由元器件供应商提供,用于电容的变化转换为电信号。电容部分指的是由电容极板、地、隔离区等组成触摸按键的电容环境。
- 任何两个导电的物体之间都存在着感应电容,在周围环境不变的情况下,该感应电容值是固定不变的。当手指触摸到触摸按键时,按键和手指之间产生寄生电容,使电容的总容值增加。按键按下后电容的变化如下图所示:
-
电容式触摸按键IC在减测到按键的感应容值改变,并超过一定的阈值时,将输出有效信号表示按键被按下。
二、实验工程
- 任务:使用触摸按键控制LED灯亮灭,开发板上电后LED为点亮状态,手指触摸后LED熄灭,再次触摸,LED点亮。
- 硬件电路图
开发板上所使用的触摸IC型号为AR101,它可以通过OP1和OP2两个引脚选择不同的工作模式:
OP1拉低时,OUT引脚输出信号高电平有效
;OP1拉高时,OUT输出信号低电平有效。
当OP2拉低时,触摸IC工作在同步模式(类似于非自锁的轻触按键)
,即触摸时输出有效电平,松开后无有效电平输出;
OP2拉高时触摸IC工作在保持模式(类似于自锁按键
),即检测到触摸操作后输出有效电平,松开后,输出电平保持不变。当再次检测到触摸操作时,输出电平变化并继续保持。
如图 10.3.1所示,触摸IC的引脚OP1和OP2均拉低,因此当手指按在触摸按键上时,TOUT 管脚输高电平,松开后输出低电平。
在做触摸按键的实验时,需要使用跳帽或者杜邦线将P4上的TPAD和TOUT短接在一起。
- 实验管教分配图
- 程序设计
采用系统50NHZ时钟,实验中按键按住时会从低电平转换成高电平,所以只需要检测上升沿就可以判断是否按键按下,同时控制LED信号!
module touch_key(
input sys_clk,
input sys_rst_n,
input key,
output reg led
);
reg key_reg;
wire key_flag;
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
key_reg<=1'b0;
else
key_reg<=key;
end
assign key_flag=(key_reg)&~key;
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
led<=1'b0;
else if(key_flag)
led<=~led;
else
led<=led;
end
endmodule
其中主要是检测上升沿 通过保存 按键上一时钟周期的状态和当前按键状态的取反相与得到一个脉冲信号,通过判断该信号来知道按键是否被按下过
开发板提供写法如下:
module touch_key(
input sys_clk, //时钟信号50Mhz
input sys_rst_n, //复位信号
input key, //按键信号
//output
output reg led //LED灯
);
//reg define
reg touch_key_d0;
reg touch_key_d1;
//wire define
wire touch_en;
//*****************************************************
//** main code
//*****************************************************
//根据按键信号的上升沿判断按下了按键
assign touch_en = (~touch_key_d1) & touch_key_d0;
//对触摸按键端口接收的数据延迟两个周期
always @ ( posedge sys_clk or negedge sys_rst_n) begin
if(sys_rst_n == 1'b0) begin
touch_key_d0 <= 1'b0;
touch_key_d1 <= 1'b0;
end
else begin
touch_key_d0 <= key;
touch_key_d1 <= touch_key_d0;
end
end
//根据上升沿使能信号切换led状态
always @ ( posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0)
led <= 1'b1;
else if (touch_en)
led <= ~led;
end
endmodule
通过两个代码的比对发现一个现象,我写的这段 代码,当按键按下,手指拿走后灯的状态才会改变,而开发板历程是当手指按上时灯的状态就会改变。
其中的原因又是什么喃?
采用signalTap II仿真结果如上图所示。
开发板代码仿真效果
通过对比发现 上面的仿真是在按键松开时产生的脉冲 下面的仿真是在按键刚按延时一个周期后产生的脉冲
总的来说,都能实现需要的按键控制功能!!!
本实验到此结束!!!