您当前的位置: 首页 >  fpga开发

正点原子

暂无认证

  • 0浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子FPGA连载】第十章 按键控制蜂鸣器实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

正点原子 发布时间:2021-12-30 18:04:33 ,浏览量:0

1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-301505-1-1.html 4)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 5)关注正点原子公众号,获取最新资料更新 在这里插入图片描述

第十章 按键控制蜂鸣器实验

蜂鸣器(Buzzer)是现代常用的一种电子发声器,主要用于产生声音信号。蜂鸣器在生活中已经得到广泛使用,其典型应用包括医疗,消防等领域的各种报警装置以及日常生活中的各种警报器等。本章我们主要学习如何使用按键来控制蜂鸣器发声。 本章包括以下几个部分: 1.1 蜂鸣器简介 1.2 实验任务 1.3 硬件设计 1.4 程序设计 1.5 下载验证   1.1 蜂鸣器简介 蜂鸣器按照驱动方式主要分为有源蜂鸣器和无源蜂鸣器,其主要区别为蜂鸣器内部是否含有震荡源。一般的有源蜂鸣器内部自带了震荡源,只要通电就会发声。而无源蜂鸣器由于不含内部震荡源,需要外接震荡信号才能发声。 在这里插入图片描述

图 7.5.13.1 有源蜂鸣器(左)和无源蜂鸣器(右) 如上图所示,从外观上看,两种蜂鸣器很相似,如将两种蜂鸣器的引脚都朝上放置,能看到绿色电路板的是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。 相较于有源蜂鸣器,无源蜂鸣器成本更低,且发声频率可控。而有源蜂鸣器控制相对简单,由于内部自带震荡源,只要加上合适的直流电压即可发声。本次实验使用的蜂鸣器为有源蜂鸣器。 1.2 实验任务 本节实验任务是使用领航者上的PL KEY0按键来控制蜂鸣器发声。初始状态为蜂鸣器鸣叫,按下按键后蜂鸣器停止鸣叫,再次按下开关,蜂鸣器重新鸣叫。 1.3 硬件设计 在这里插入图片描述

图 7.5.13.1 蜂鸣器控制电路原理图 上图为蜂鸣器控制电路的原理图。由于ZYNQ的IO其电流驱动能力有限,所以我们在蜂鸣器的驱动电路中加入三级管Q1,以将ZYNQ的IO驱动电流放大,然后再驱动蜂鸣器。 本实验的管脚分配如下表所示,其中时钟源位于核心板上,复位按键、用户按键、蜂鸣器都位于底板上: 表 10.3.1 按键控制蜂鸣器实验管脚分配 信号名 方向 管脚 端口说明 电平标准 sys_clk input U18 系统时钟,50M LVCMOS33 sys_rst_n input N16 PL复位按键,低有效 LVCMOS33 key input L14 PL KEY0按键 LVCMOS33 beep output M14 蜂鸣器 LVCMOS33 对应的XDC约束语句如下所示:

set_property -dict {PACKAGE_PIN M14 IOSTANDARD LVCMOS33} [get_ports {beep}]
set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports {key}]
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]

1.4 程序设计 由实验任务可知,我们只需要在按键按下时改变蜂鸣器的鸣叫状态即可。但实际上在按键按下的过程中存在按键抖动的干扰,体现在数字电路中就是不断变化的高低电平。为避免在抖动过程中采集到错误的按键状态,我们需要对按键数据进行消除抖动处理。 在这里我们先介绍一下按键消抖的原理。通常我们所使用的开关为机械弹性开关,当我们按下或松开按键时,由于弹片的物理特性,不能立即闭合或断开,往往会在断开或闭合的短时间内产生机械抖动,。消除这种抖动的过程即称为按键消抖。 按键消抖可分为硬件消抖和软件消抖。硬件消抖主要使用RS触发器或电容等方法在硬件电路上实现消抖,一般在按键较少时使用。软件消抖的原理主要为按键按下或松开后,由处理器延时5ms至20ms,然后再对按键状态进行采样并判断。如下图所示: 在这里插入图片描述

图 7.5.13.1 按键消抖原理图 由上面的分析可知,本次实验中的系统至少包含按键消抖模块和蜂鸣器控制两个模块。系统框图如下图所示: 在这里插入图片描述

图 7.5.13.2 按键控制蜂鸣器系统框图 图 7.5.13.2中,按键消抖模块用于消除按键的抖动,消抖之后的信号用于控制蜂鸣器的鸣叫状态。 程序中各模块端口及信号连接如下图所示: 在这里插入图片描述

图 7.5.13.3 端口及信号连接图 由上图系统框图可知,代码部分包括三个模块。顶层模块(top_key_beep),作用为完成对另外两个模块的例化。按键消抖模块(key_debounce),主要用于对按键进行抖动滤除。按键控制蜂鸣器模块(beep_control),识别按键按下的那一刻,并对蜂鸣器的鸣叫状态进行翻转。 顶层模块代码如下:

1   module top_key_beep(
2       input    sys_clk ,
3       input    sys_rst_n ,
4   
5       input    key ,
6       output   beep
7   );
8   
9   //wire define
10  wire key_value ;
11  wire key_flag ;
12  
13  //*****************************************************
14  //**                    main code
15  //*****************************************************
16  
17  //例化按键消抖模块
18  key_debounce  u_key_debounce(
19      .sys_clk    (sys_clk),
20      .sys_rst_n  (sys_rst_n),
21  
22      .key        (key),
23      .key_value  (key_value),
24      .key_flag   (key_flag)
25      );
26  
27  //例化蜂鸣器控制模块
28  beep_control  u_beep_control(
29      .sys_clk    (sys_clk),
30      .sys_rst_n  (sys_rst_n),
31  
32      .key_value  (key_value),
33      .key_flag   (key_flag),
34      .beep       (beep)
35      );
36  
37  endmodule

在顶层模块中例化了按键消抖模块和按键控制蜂鸣器模块。 按键消抖模块代码如下:

1   module key_debounce(
2       input        sys_clk ,
3       input        sys_rst_n ,
4   
5       input        key ,         //外部输入的按键值
6       output  reg  key_value ,   //消抖后的按键值
7       output  reg  key_flag      //消抖后的按键值的效标志
8   );
9   
10  //reg define
11  reg [19:0] cnt ;
12  reg        key_reg ;
13  
14  //*****************************************************
15  //**                    main code
16  //*****************************************************
17  
18  //按键值消抖
19  always @ (posedge sys_clk or negedge sys_rst_n) begin
20      if(!sys_rst_n) begin
21          cnt             
关注
打赏
1665308814
查看更多评论
0.0433s