无源蜂鸣器的驱动实验

        本实验基于Altera EP4CE10 征途Pro开发板进行设计与实现。通过设计实现按键控制蜂鸣器的发声与否,初始状态蜂鸣器不发声,按键按下发声,再次按下不发声。如此反复,通过按键控制蜂鸣器发声状态的变化。

一.开发板无源蜂鸣器发声原理的介绍

        相对于有源蜂鸣器,无源蜂鸣器的成本更低,声音频率可控。而有源蜂鸣器因其内部自带振荡源,只要加上适当的直流电源即可发声,程序控制较为方便。无源蜂鸣器与有源蜂鸣器不同,因其内部不带震荡源,所以其无法向有缘蜂鸣器那样直接用直流信号驱动,这里需要使用PWM方波才能驱动其发声。

       如何发出不同的声音呢?上面说到需要使用PWM方波才能驱动其发声,所以这里我们只要控制输入的PWM方波,输入不同的PWM方波发出的声音就不一样了。而不同频率和占空比的方波发出的声音是不同的,其中频率对音调有影响,占空比对音量大小有影响。所以我们只需产生不同频率和占空比的PWM方波去驱动无源蜂鸣器就能让 无源蜂鸣器发出不同的音调了。

不同音调的声音所对应的频率如下图:

而该开发板的系统时钟为50MHZ,对应的频率计数值如下:

二.蜂鸣器硬件电路原理图

功率放大器驱动:在beep端输入相应频率的PWM脉冲波即可驱动Buzzer发声。

由下图知:beep对应的FPGA管脚为J11。

三. Verilog程序设计

        本设计主要包括按键消抖模块以及蜂鸣器驱动模块组成。

1.按键消抖模块:

  运用软件消抖的方法:即检测出按键闭合后执行一个延时程序,根据抖动的时间5ms~10ms,我们产生一个20ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。

     

代码实现如下:

module  key_filter
(
    input   wire    sys_clk     ,   
    input   wire    sys_rst_n   ,   
    input   wire    key_in      ,   

    output  reg     key_flag        
                                    
);
parameter CNT_MAX = 20'd999_999 	;

reg     [19:0]  cnt_20ms    		;   

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt_20ms <= 20'b0;
    else    if(key_in == 1'b1)
        cnt_20ms <= 20'b0;
    else    if(cnt_20ms == CNT_MAX && key_in == 1'b0)
        cnt_20ms <= cnt_20ms;
    else
        cnt_20ms <= cnt_20ms + 1'b1;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        key_flag <= 1'b0;
    else    if(cnt_20ms == CNT_MAX - 1'b1)
        key_flag <= ~key_flag;
    else
        key_flag <= key_flag ;

endmodule

通过按键按下改变key_flag信号的高低电平,按下一次进行翻转,进而用key_flag信号控制beep端的信号产生。

2. 蜂鸣器驱动模块:

在其中调用按键消抖模块,实现按键控制beep端的波形输出。

代码如下:

module beep
(
		input 	wire 	sys_clk		,
		input	wire	sys_rst_n	,
		input 	wire	key_in		,
		
		output 	reg 	beep	
);

parameter DO = 18'd190840 	;

reg 	[17:0]  freq_cnt	;
wire	[17:0]  duty_data	;
wire 			key_flag	;

assign duty_data = DO >> 1'b1 ;

always@( posedge sys_clk or negedge sys_rst_n )
	if( sys_rst_n == 1'b0 )
		freq_cnt <= 18'd0 ;
	else if( freq_cnt == DO )
		freq_cnt <= 18'd0 ;
	else
		freq_cnt <= freq_cnt + 1'b1 ;

key_filter key_filter_inst
(
    .sys_clk		(sys_clk	),   
    .sys_rst_n   	(sys_rst_n	),   
    .key_in      	(key_in		),   
   
    .key_flag		(key_flag	)        
                     
);

always@( posedge sys_clk or negedge sys_rst_n )
	if( sys_rst_n == 1'b0 )
		beep <= 1'b0 ;
	else if ( freq_cnt >= duty_data && key_flag == 1'b1 )
		beep <= 1'b1 ;
	else
		beep <= 1'b0 ;

endmodule

通过按键控制蜂鸣器发出do音。 

四.FPGA引脚配置

系统时钟,按键输入,复位信号管脚如下图:(buzzer管脚见上文)

Pin设置如下:

五. 程序上板调试

开发板接入电源线以及FPGA下载器:

可通过按键控制蜂鸣器的发声,功能成功实现。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
无源蜂鸣器和有源蜂鸣器是两种不同类型的蜂鸣器。有源蜂鸣器内含振荡源,只要通电就能发声,但发声频率固定,音色单一。而无源蜂鸣器内部没有振荡源,需要外加振荡源(方波信号)才能发声,通过给它输出一定频率的信号来控制发声。人耳能听到的频率范围在20Hz-20kHz之间,通过控制STM32的GPIO引脚快速切换高低电平输出,可以实现无源蜂鸣器的发声,切换的频率不同,发出的音调就不一样。\[1\] 在程序中,通过循环产生方波(即振荡源)来控制蜂鸣器的发声。循环里的延时函数可以控制输出方波的频率,程序中使用了两种不同的延时函数,一个是标准HAL库提供的延时函数,另一个是自定义的延时函数。宏定义还可以控制声音的时间长度。\[2\] 关于无源蜂鸣器驱动,可以使用Cubemx来配置STM32的GPIO引脚,将引脚设置为输出模式,并通过控制引脚的高低电平来控制蜂鸣器的发声。具体的配置和代码实现可以参考相关的文档和教程。\[3\] #### 引用[.reference_title] - *1* [STM32 使用STM32F103控制无源蜂鸣器发声播放音乐](https://blog.csdn.net/qq_28056277/article/details/85165731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [05_STM32Cubeide开发_无源蜂鸣器和继电器驱动](https://blog.csdn.net/DDGGG1/article/details/123473031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是既白呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值