【正点原子FPGA连载】第九章 按键控制蜂鸣器实验

2020-01-27 13:43发布

本帖最后由 正点原子 于 2019-5-21 22:39 编辑

1)实验平台:正点原子开拓者FPGA开发板2)平台购买地址:https://item.taobao.com/item.htm?id=5797492098202)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-281143-1-1.html3)本实例源码下载:   3_top_key_beep.rar (3.06 MB, 下载次数: 5) 2019-5-21 22:33 上传 点击文件名下载附件 4)对正点原子FPGA感兴趣的同学可以加群讨论:712557122  点击加入:5)关注正点原子公众号,获取最新资料更新:
727655ce40c4838800.png
第九章 按键控制蜂鸣器实验


蜂鸣器(Buzzer)是现代常用的一种电子发声器,主要用于产生声音信号。蜂鸣器在生活中已经得到广泛使用,其典型应用包括医疗,消防等领域的各种报警装置以及日常生活中的各种警报器等。本章我们主要学习如何使用按键来控制蜂鸣器发声。本章包括以下几个部分:1         1.1         蜂鸣器简介1.2         实验任务1.3         硬件设计1.4         程序设计1.5         下载验证
1.1      蜂鸣器简介蜂鸣器按照驱动方式主要分为有源蜂鸣器和无源蜂鸣器,其主要区别为蜂鸣器内部是否含有震荡源。一般的有源蜂鸣器内部自带了震荡源,只要通电就会发声。而无源蜂鸣器由于不含内部震荡源,需要外接震荡信号才能发声。 image225.png
图 9.1.1  左边为有源蜂鸣器右边为无源蜂鸣器
image226.png 图 9.1.2  本次实验使用的有源蜂鸣器如图 9.1.1所示,从外观上看,两种蜂鸣器很相似,如将两种蜂鸣器的引脚都朝上放置,可以看出有绿 {MOD}电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。相较于有源蜂鸣器,无源蜂鸣器成本更低,且发声频率可控。而有源蜂鸣器控制相对简单,由于内部自带震荡源,只要加上合适的直流电压即可发声。本次实验使用的蜂鸣器为图 9.1.2中的有源蜂鸣器。1.2      实验任务本节实验任务是使用按键控制蜂鸣器发声。初始状态为蜂鸣器鸣叫,按下开关后蜂鸣器停止鸣叫,再次按下开关,蜂鸣器重新鸣叫。1.3      硬件设计
image227.png 图 9.3.1 蜂鸣器控制电路原理图图9.3.1为蜂鸣器控制电路的原理图。本实验的管脚分配如下表所示:表 9.3.1 按键控制蜂鸣器实验管脚分配 管脚.JPG 需要说明的是,由于蜂鸣器需要的驱动电流较大,使用默认8mA的驱动电流有可能出现蜂鸣器发声较小的情况,解决方法是将蜂鸣器输出的驱动电流修改成12mA或者是16mA,如下图所示:
image228.png 图 9.3.2 按键控制蜂鸣器管脚分配图
1.4      程序设计由实验任务可知,我们只需要在按键按下时改变蜂鸣器的鸣叫状态,但实际上在按键按下的过程中存在按键抖动的干扰,体现在数字电路中就是不断变化的高低电平,为避免在抖动过程中采集到错误的按键状态,我们需要对按键数据进行消除抖动处理。因此本系统应至少包含按键消抖模块和蜂鸣器控制模块,按键控制蜂鸣器系统框图如图 9.4.1所示。 无标题.png
图 9.4.1 按键控制蜂鸣器系统框图这里我们补充下如何查看软件生成的模块端口及信号连接图。首先在对工程进行编译,然后点击菜单栏的【Tools】→【NetList Viewers】→【RTL Viewer】,如图 9.4.2所示:
image230.png 图 9.4.2 打开端口及信号连接图稍后就可以看到软件生成的模块端口及信号连接图了,如图 9.4.3所示: image231.png
图 9.4.3 端口及信号连接图需要注意的是,必须已经执行过综合或编译之后,才能打开模块端口及信号连接图。打开之后,按下键盘的【Ctrl】键,滚动鼠标的滚轮可以对生连接图进行放大和缩小。模块端口及信号连接图可以比较清晰的查看各个模块端口信号的连接,同时双击模块,也可以进一步查看模块的原理图。由图 9.4.3的连接图可知,顶层模块例化了以下两个模块,按键消抖模块(key_debounce)和蜂鸣器控制模块(beep_control)。顶层模块(top_key_beep)完成了对另外两个模块的例化。按键消抖模块,主要起到延时采样,防止按键抖动的干扰。蜂鸣器控制模块,通过对按键信号的识别,起到控制蜂鸣器鸣叫的作用。按键消抖模块(key_debounce):对按键信号延时采样,将消抖后的按键信号和按键数据有效信号输出至beep_control模块。蜂鸣器控制模块(beep_control):根据输入的按键信号和按键数据有效信号,来控制蜂鸣器的鸣叫。在这里我们介绍一下按键消抖的原理。通常我们所使用的开关为机械弹性开关,当我们按下或松开按键时,由于弹片的物理特性,不能立即闭合或断开,往往会在断开或闭合的短时间内产生机械抖动,消除这种抖动的过程即称为按键消抖。按键消抖可分为硬件消抖和软件消抖。硬件消抖主要使用RS触发器或电容等方法实现消抖,一般在按键较少时使用。软件消抖的原理主要为按键按下或松开后延时5ms—20ms采样,也可以在检测到按键状态稳定后采样,即避开抖动区域后再采样,如图 9.4.4所示。
image232.png 图 9.4.4 按键消抖原理图顶层模块代码如下: 1 module top.rar (6.76 KB, 下载次数: 1) 2019-5-21 22:35 上传 点击文件名下载附件 仿真波形图如下: image233.png
图 9.4.5 仿真波形图测试代码中,为了方便仿真波形的查看,将按键消抖模块中的延时采样的延时时间改为四个时钟周期(将按键消抖模块中的第26行代码 delay_cnt <= 32'd1000000; 改为delay_cnt <= 32'd4;)。tb_key_beep模块中第22行到第45行为信号的激励。从图 9.4.5可以看到,第50ns时,将key拉低,并在50至130ns时模拟按键抖动,可见在按键抖动停止后的第4个时钟周期时,key_flag出现一个时钟周期的高电平,同时beep被拉低(蜂鸣器停止鸣叫);在第300ns时松开按键,随后模拟按键抖动,同理可知在抖动结束后的第四个时钟周期,key_flag信号被拉高。读者可以仔细观察仿真波形结合代码深入理解,仔细体会key_flag信号和key信号之间的关系。1.5  下载验证首先我们打开按键控制蜂鸣器工程,在工程所在的路径下打开top_key_beep/par文件夹,在里面找到“top_key_beep.qpf”并双击打开。注意工程所在的路径名只能由字母、数字以及下划线组成,不能出现中文、空格以及特殊字符等。top_key_beep工程打开后如图 9.5.1所示。 image234.png
图 9.5.1 打开工程工程打开后通过点击工具栏中的“Programmer”图标(图中红框位置)打开下载界面。下载界面如图 9.5.2所示(图中已下载完毕),查看图中是否已经加载下载文件(sof文件)。如果没有,则需要通过点击“Add File”按钮添加流水灯工程中key_led/par/output_files目录下的“key_led.sof”文件。 image235.png
图 9.5.2 下载界面如下图 9.5.3所示。将下载器一端连接电脑,另一端与开发板上的JTAG下载口相连接,如下图所示。然后连接电源线并打开电源开关。
蜂鸣器.JPG 图 9.5.3 开拓者开发板实物图开发板电源打开后,在程序下载界面点击“Hardware Setup”, 在弹出的对话框中选择当前的硬件连接为“USB-Blaster”。然后点击“Start”将工程编译完成后得到的sof文件下载到开发板中。下载完成后,就可以利用按键来控制蜂鸣器了。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。