[FPGA 学习记录] 触摸按键控制LED灯

本文详细介绍了使用电容式触摸按键控制LED灯的理论知识和实战过程,包括理论部分的四种触摸按键类型、实战中的实验目标、硬件资源、程序设计(涉及模块框图、波形绘制、代码编写及逻辑仿真)以及上板验证步骤,重点强调了上升沿和下降沿采集技术的应用。
触摸按键控制LED灯


在上一章节当中,我们实现了按键的消抖;在本章节当中,我们将使用触摸按键控制我们的 LED 灯。

本章节的主要内容分为两个部分:仍然是理论部分和实践部分。在理论部分我们将会对触摸按键的相关知识做一个讲解;在实战部分我们将通过实验工程,使用触摸按键控制我们的 LED 灯。

首先是理论部分的学习

1 理论学习

触摸按键

触摸按键我们经常见到。它可以分为四大类:电阻式、电容式、红外感应式和表面声波式。

电阻式触摸按键的工作原理就是:使用人体迫压电阻,致使电阻大小改变,电阻的改变会致使整个电路信号出现变化,从而达到控制的效果。但是它的缺点是耐用性比较差,现在已经很少使用。

我们的红外感应式触摸按键,它主要是采用红外扫描的方式,一般使用在比较恶劣的环境当中。

我们的表面声波式触摸按键,是利用声波扫描来识别我们的按键是否按下,它一般主要用于公共场合。

电容式触摸按键主要是为了弥补电阻式触摸按键耐用性较差而产生的。电容式触摸按键主要由按键 IC 部分和电容部分构成,按键 IC 用于将电容的变化转换为电信号,按键 IC 就是个芯片;电容部分指的是由电容极板、地、隔离区等组成的触摸按键的电容环境

image-20231101183847229

当我们的电容式触摸按键没有被按下时,就是左边这种状态。电容式触摸按键它的感应原理是利用人体感应电容来检测按键是否按下,当按键没有被按下时,就是左边这种情况:按键与地之间存在一定的静态电容;当按键被按下时,就是右边这种情况,那么我们人体的寄生电容将耦合到这个静态电容上,使按键的最终电容变大,我们的按键 IC 会将电容的变化转化为电信号,那么电信号的变化超过了这个阈值就判定为按键按下。

我们的征途系列开发板使用的就是电容式触摸按键,在这个位置

image-20231101184056876

那么以上部分就是理论部分的学习。

下面开始我们的实战演练。

2 实战演练

2.1 实验目标

在实战演练部分我们将通过实验工程,使用触摸按键控制我们的 LED 灯。我们的 LED 灯,初始状态为熄灭状态,当按下触摸按键时它点亮,再次按下触摸按键时它熄灭。

2.2 硬件资源

image-20231102105520469

2.3 程序设计

那么了解了实验目标之后,我们开始程序的设计。

首先建立文件体系

20231101184613_99Y9ZV3Jnu

文件体系建立完成之后打开 doc 文件夹,新建一个 Visio 文件,用来绘制我们的波形图和模块框图

20231101184910_MilB4vtwkb

2.3.1 模块框图

那么首先先来绘制模块框图

20231101185118_uPjWtpVyd8

那么下面绘制输入信号和输出信号。那么输入信号有时钟信号和复位信号;输入信号当中除了时钟信号和复位信号之外,还有触摸按键传入的信号

20231101185339_89yQbix6SQ

因为我们要使用触摸按键控制 LED 灯,所以说应该有一路输出信号,输出到我们的 LED 灯

20231101185538_CC1fJ6uMFm

2.3.2 波形绘制

这样模块框图绘制完成,下面开始波形图的绘制

20231101185708_CmgEBx9UWR

时钟信号和复位信号的波形绘制完成,下面开始绘制触摸按键信号。那么按键未被按下时是保持高电平,按键按下时是低电平;它的低电平保持时间与你按下的时间是相同的,你按下多长时间它的低电平就保持多长时间;当松开触摸按键之后它又回到它的高电平,当你再次按下时它又回到低电平

20231101190025_0Yjk3ZP80F

那么这样,触摸按键信号的波形绘制完成。

如果我们用这个信号去控制 LED 灯,不管是保持点亮状态还是熄灭状态,我们都需要持续作用在这个按键上,才能保证我们的 LED 灯点亮或者熄灭。这显然与我们的实验目标是不符合的,那么如何实现触摸一次触摸按键,我们的 LED 灯的状态切换一次呢?

我们在想我们是否可以使用这个下降沿,来控制我们的输出信号进行取反。当触摸按键没有被按下时,我们的输出信号保持原来的值,当检测到这个下降沿,进行取反,然后保持它的电平不变;到下一个下降沿再取反,然后继续保持它的电平不变。那么这样就可以实现:触摸一下点亮、触摸一下熄灭这种情况。

那么如何采集这个信号的下降沿呢?我们可以使用我们前面学到的寄存器。

我们先声明一个变量 touch_key_sync 在时钟信号的上升沿将输入的触摸按键信号直接赋值给它,这样做的目的是将触摸按键信号与我们的时钟同步

在嵌入式系统中实现触摸按键控制LED亮灭的功能,通常涉及对触摸信号的检测、状态判断以及对LED状态的切换。以下是一个基于FPGA的Verilog代码示例,展示了如何通过触摸按键控制LED的亮灭状态。该示例结合了信号边沿检测和状态切换逻辑,适用于触摸按键在按下时产生一个上升沿的场景。 ### 代码示例 ```verilog module touch_led( input clk, // 主时钟输入 input rst_n, // 异步复位信号 input touch, // 触摸按键输入 output reg led // LED输出 ); // 定义内部信号 reg touch_d0; reg touch_d1; wire up; // 边沿检测逻辑 assign up = (~touch_d0) & touch_d1; // 触摸信号同步化 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin touch_d0 <= 1'b0; touch_d1 <= 1'b0; end else begin touch_d0 <= touch; touch_d1 <= touch_d0; end end // 触摸事件使能信号 reg touch_en; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin touch_en <= 1'b0; end else begin if (up) begin touch_en <= 1'b1; end else begin touch_en <= 1'b0; end end end // 控制LED状态切换 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin led <= 1'b1; // 上电时LED点亮 end else begin if (touch_en) begin led <= ~led; // 触摸后切换LED状态 end else begin led <= led; // 保持当前状态 end end end endmodule ``` ### 代码解析 1. **信号同步化**:通过两级寄存器(`touch_d0` 和 `touch_d1`)对触摸信号进行同步,避免因异步信号导致的亚稳态问题。 2. **边沿检测**:通过 `assign up = (~touch_d0) & touch_d1;` 检测触摸信号的上升沿,确保只在按键按下时触发一次操作。 3. **LED状态切换**:在检测到触摸事件后,`led` 的状态被取反,实现亮灭切换功能。 ### 总结 该代码适用于FPGA平台,能够通过触摸按键控制LED的状态变化。通过边沿检测机制,确保了触摸信号的稳定性,并避免了误触发问题。此逻辑可扩展至其他嵌入式平台,如基于MCU的系统,只需将Verilog代码转换为C/C++逻辑即可实现类似功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值