本篇测评给大家测试一下蜂鸣器的使用,在进行蜂鸣器的测试时我也是犯了一些很基本的错误致使卡了很久之后才发现问题进行解决
首先蜂鸣器分为两种,分别是有源蜂鸣器和无源蜂鸣器如下图;
有源蜂鸣器
蜂鸣器模块一般由一个上拉电阻一个负责放大的三极管和蜂鸣器组成,这里使用的蜂鸣器模块供电为5V,要确保通过蜂鸣器的电流足够大否则也不能驱动蜂鸣器。
有源蜂鸣器和无源蜂鸣器的主要区别是在蜂鸣器中是否有振荡电路,蜂鸣器的发声是依靠频率不断变化从而使发声的震动片不断震动从而产生声响。有源蜂鸣器内部带震荡源,所以只要一通电就会叫;而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K-5K的方波去驱动它。所以在编写代码时使用无源蜂鸣器会更加复杂需要自己编写一个频率代码。
首先我们使用有源蜂鸣器进行演示,
首先是cube的配置这里我们使用的是 PA9口
选择GPIO output level: High
GPIO mode: Output Push Pull
GPIO Pull-up/Pull-down: Pull-up
Maximum output speed: High
配置好以后就可以生成工程文件了
#include "beep.h"
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
/*Configure GPIO pin : PD2 */
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//BEEP(0); /* 关闭蜂鸣器 */
}
在主程序中编写一个测试代码:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
BEEP_TOGGLE();
delay_ms(1000);
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
}
每秒对输出取反,蜂鸣器输出也是响一秒钟停止一秒钟
在这里的时候我因为把有源无源蜂鸣器搞混了,一开始安装了一个无源蜂鸣器,从而发出的声音是哒哒哒的,因为板卡是没有外部晶振,且与其他型号比L系列的时钟树多了一个MSI时钟配置,所以我一度认为是时钟树配置问题,折腾了好长时间才发现弄错了蜂鸣器;
但是这里也体现出了一个问题我们正常给无源蜂鸣器发声的波段应该是如下图:
在实验中写的频率交换太慢没有达到蜂鸣器的发声条件我们只要加快频率就可以使无源蜂鸣器发声。