声音传感器是一种常见的传感器,可以用于检测周围环境中的声音强度。本教程将介绍如何使用STM32微控制器和声音传感器进行声音检测,并通过LED灯和蜂鸣器来显示和响应声音强度。
在开始之前,您需要准备以下硬件和软件资源:
硬件资源:
STM32开发板(例如STM32F103C8T6)
声音传感器模块
LED灯
蜂鸣器
杜邦线
软件资源:
STM32CubeIDE(用于编写和调试STM32代码)
STM32CubeMX(用于配置STM32的引脚和外设)
步骤1:硬件连接 首先,将STM32开发板与声音传感器模块连接。将声音传感器的VCC引脚连接到STM32开发板的5V引脚,GND引脚连接到GND引脚,而OUT引脚连接到STM32开发板的一个GPIO引脚(例如PB0引脚)。
接下来,将LED灯的正极连接到STM32开发板的另一个GPIO引脚(例如PC13引脚),而负极连接到GND引脚。然后,将蜂鸣器连接到STM32开发板的另一个GPIO引脚(例如PB1引脚)。
步骤2:配置STM32引脚和外设 打开STM32CubeMX软件,创建一个新的STM32项目。选择您使用的STM32型号,然后点击“Pinout & Configuration”选项卡。
在引脚布局图中,找到PB0引脚,并将其配置为GPIO输出引脚。同样,找到PC13引脚和PB1引脚,将它们配置为GPIO输出引脚。
然后,点击“Configuration”选项卡,在左侧的“Peripherals”列表中选择“ADC1”,并在右侧的“Mode”下拉菜单中选择“Analog Mode”。这将使PB0引脚配置为模拟输入引脚。
最后,点击右上角的“Project”按钮,将配置保存为一个新的STM32CubeIDE项目。选择正确的文件路径和项目名称,然后点击“OK”按钮。
步骤3:编写STM32代码 打开STM32CubeIDE软件,选择刚创建的STM32项目。在“Src”文件夹中找到和打开“main.c”文件。
首先,我们需要为ADC和GPIO引脚配置添加一些宏定义和函数原型。在“main.c”文件的开头添加以下代码:
// 宏定义
#define SOUND_SENSOR_ADC_CHANNEL ADC_CHANNEL_8
#define SOUND_SENSOR_GPIO_PIN GPIO_PIN_0
#define SOUND_SENSOR_GPIO_PORT GPIOB
#define LED_GPIO_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
#define BUZZER_GPIO_PIN GPIO_PIN_1
#define BUZZER_GPIO_PORT GPIOB
// 函数原型
static void MX_ADC1_Init(void);
static void MX_GPIO_Init(void);
static void Error_Handler(void);
然后,在“main.c”文件的“main()”函数之前添加以下代码:
ADC_HandleTypeDef hadc1;
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hadc->Instance==ADC1)
{
/* ADC1 clock enable */
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**ADC1 GPIO Configuration
PB0 ------> ADC1_IN8
*/
GPIO_InitStruct.Pin = SOUND_SENSOR_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(SOUND_SENSOR_GPIO_PORT, &GPIO_InitStruct);
}
}
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance==ADC1)
{
/* Peripheral clock disable */
__HAL_RCC_ADC1_CLK_DISABLE();
/**ADC1 GPIO Configuration
PB0 ------> ADC1_IN8
*/
HAL_GPIO_DeInit(SOUND_SENSOR_GPIO_PORT, SOUND_SENSOR_GPIO_PIN);
}
}
接下来,在“main.c”文件的“main()”函数中,在以下注释下方添加以下代码:
/* Initialize peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
while (1)
{
/* Start ADC conversion */
if (HAL_ADC_Start(&hadc1) != HAL_OK)
{
Error_Handler();
}
/* Wait for ADC conversion to complete */
if (HAL_ADC_PollForConversion(&hadc1, 100) != HAL_OK)
{
Error_Handler();
}
/* Read ADC value */
uint32_t adcValue = HAL_ADC_GetValue(&hadc1);
/* Turn on LED and buzzer if sound is detected */
if (adcValue > 1000) //根据实际情况调整阈值
{
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN, GPIO_PIN_RESET);
}
/* Delay for a while */
HAL_Delay(100);
}
最后,添加以下两个函数的代码:
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN, GPIO_PIN_RESET);
/*Configure GPIO pins : PB1 PB12 */
GPIO_InitStruct.Pin = BUZZER_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(BUZZER_GPIO_PORT, &GPIO_InitStruct);
/*Configure GPIO pin : PC13 */
GPIO_InitStruct.Pin = LED_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
}
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
/* Enable ADC peripheral clock */
__HAL_RCC_ADC1_CLK_ENABLE();
/* Configure ADC peripheral */
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/* Configure ADC channel */
sConfig.Channel = SOUND_SENSOR_ADC_CHANNEL;
sConfig.Rank = 1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
void Error_Handler(void)
{
while (1)
{
}
}
代码解释:
首先,在“main.c”文件的开头,我们定义了一些宏,用于指定声音传感器引脚、LED引脚和蜂鸣器引脚。然后,我们声明了一些函数原型,这些函数将在后面的步骤中实现。
然后,我们在“main.c”文件的“main()”函数之前,添加了一个名为“HAL_ADC_MspInit()”和“HAL_ADC_MspDeInit()”的函数。这些函数用于初始化和去初始化ADC外设的GPIO引脚。
接下来,在“main()”函数中,我们使用HAL库函数初始化ADC和GPIO引脚,并在一个无限循环中进行以下操作:
启动ADC转换。
等待ADC转换完成。
读取ADC值。
如果检测到声音强度超过阈值(这里我们设为1000),则点亮LED和蜂鸣器;否
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_67153941/article/details/141869145
|