打印
[应用相关]

STM32入门教程:声音传感器应用

[复制链接]
134|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
磨砂|  楼主 | 2024-9-9 16:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
声音传感器是一种常见的传感器,可以用于检测周围环境中的声音强度。本教程将介绍如何使用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

使用特权

评论回复
沙发
呐咯密密| | 2024-9-9 17:18 | 只看该作者
简易的分贝测试仪

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

4066

帖子

2

粉丝