STM32F1与STM32CubeIDE编程实例-麦克风声音传感器驱动

麦克风声音传感器驱动

麦克风声音传感器,顾名思义,它可以检测声音和测量声音的响度。当声音的响应达到一定的阈值时,传感器输出高电平或低电平信号(取决于硬件设计)。麦克风声音传感器广泛应用于声控开关、噪音测量等。

在这里插入图片描述

本文将演示如何驱动麦克风声音传感器。

1、麦克风声音传感器配置

本次使用的麦克风声音传感器有两种输出(A0),一种是模拟量输出(D0),另外一种是数字输出。在这里,使用数字输出(D0)。当声音达到阈值时,输出低电平。

在STM32CubeIDE中,传感器引脚的配置如下:

在这里插入图片描述

保存配置,并生成代码。

2、麦克风声音传感器驱动实现

1)基本定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/\*
\* voice\_sensor.h
\*
\* Created on: Apr 21, 2022
\* Author: jenson
\*/

#ifndef \_\_VOICE\_SENSOR\_H\_\_
#define \_\_VOICE\_SENSOR\_H\_\_

#include "stm32f1xx\_hal.h"
#include "main.h"
#include "gpio.h"
#include <stdlib.h>
#include <unistd.h>

typedef struct{
uint16\_t id; // 编号
GPIO_TypeDef\* GPIOx; // 总线端口
uint16\_t GPIO_Pin; // 总线引脚
}voice\_sensor\_t;

/\*\*
\* @brief 检测是否有报警
\* @param sensor 传感对象
\* @return 当检测到传感器阈值输出低电平时,返回1,否则返回0
\*/
uint8\_t voice\_sensor\_check\_alert(voice\_sensor\_t\* sensor);

#endif /\* \_\_VOICE\_SENSOR\_H\_\_ \*/


2)驱动代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/\*
\* voice\_sensor.c
\*
\* Created on: Apr 21, 2022
\* Author: jenson
\*/

#include "voice\_sensor.h"

uint8\_t voice\_sensor\_check\_alert(voice\_sensor\_t\* sensor){
if(HAL\_GPIO\_ReadPin(sensor->GPIOx, sensor->GPIO_Pin) == GPIO_PIN_RESET){
return 1;
}
return 0;
}

代码非常简单,只需要检测传感器的输出信号为低电平即可。

3)主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/\* Private includes ----------------------------------------------------------\*/
/\* USER CODE BEGIN Includes \*/
#include <stdio.h>
#include "voice\_sensor/voice\_sensor.h"
/\* USER CODE END Includes \*/

/\* USER CODE BEGIN PV \*/
voice\_sensor\_t sensor;
/\* USER CODE END PV \*/

int main(void)
{
/\* USER CODE BEGIN 1 \*/

/\* USER CODE END 1 \*/

/\* MCU Configuration--------------------------------------------------------\*/

/\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/
HAL\_Init();

/\* USER CODE BEGIN Init \*/

/\* USER CODE END Init \*/

/\* Configure the system clock \*/
SystemClock\_Config();

/\* USER CODE BEGIN SysInit \*/

/\* USER CODE END SysInit \*/

/\* Initialize all configured peripherals \*/
MX\_GPIO\_Init();
MX\_USART1\_UART\_Init();
/\* USER CODE BEGIN 2 \*/
sensor.id = 1;
sensor.GPIOx = VOICE_SENSOR_GPIO_Port;
sensor.GPIO_Pin = VOICE_SENSOR_Pin;

/\* USER CODE END 2 \*/

/\* Infinite loop \*/
/\* USER CODE BEGIN WHILE \*/
while (1)
{
/\* USER CODE END WHILE \*/

/\* USER CODE BEGIN 3 \*/
if(voice\_sensor\_check\_alert(&sensor)){
printf("voice alert\r\n");
}
HAL\_Delay(10);
}
/\* USER CODE END 3 \*/
}

程序运行结果:

在这里插入图片描述

3、麦克风声音传感器配置(基于中断方式)

前面的驱动代码是基于循环轮询实现,比较耗CPU。可以通过外部中断方式来对传感器输出信号进行检测。关于外部中断使用,请参考:

传感器的中断方式驱动配置如下:

在这里插入图片描述

基本配置不变,保存并生成代码。

4、麦克风声音传感器驱动实现(基于中断方式)

1)基本定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/\*
\* voice\_sensor.h
\*
\* Created on: Apr 21, 2022
\* Author: jenson
\*/

#ifndef \_\_VOICE\_SENSOR\_H\_\_
#define \_\_VOICE\_SENSOR\_H\_\_

#include "stm32f1xx\_hal.h"
#include "main.h"
#include "gpio.h"
#include <stdlib.h>
#include <unistd.h>

/\*\*\*
\* @brief 传感器回调函数
\* @
\*/
typedef void (\*voice_alert_callback)(uint16\_t id);

typedef struct{
uint16\_t id; // 编号
GPIO_TypeDef\* GPIOx; // 总线端口
uint16\_t GPIO_Pin; // 总线引脚
voice_alert_callback callback; // 回调函数
}voice\_sensor\_t;

#endif /\* \_\_VOICE\_SENSOR\_H\_\_ \*/


2)中断调用实现

stm32f1xx_it.c文件,实现如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/\* USER CODE BEGIN Includes \*/
#include "voice\_sensor/voice\_sensor.h"
/\* USER CODE END Includes \*/

/\* USER CODE BEGIN PV \*/
extern voice\_sensor\_t sensor;
/\* USER CODE END PV \*/

/\* USER CODE BEGIN 1 \*/
void HAL\_GPIO\_EXTI\_Callback(uint16\_t GPIO_Pin) {
if(GPIO_Pin == sensor.GPIO_Pin){
if(sensor.callback){
sensor.callback(sensor.id);
}
}
}
/\* USER CODE END 1 \*/

3)主程序

main.c文件中输入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/\* USER CODE BEGIN Includes \*/
#include <stdio.h>
#include "voice\_sensor/voice\_sensor.h"
/\* USER CODE END Includes \*/

/\* USER CODE BEGIN PV \*/
voice\_sensor\_t sensor;
/\* USER CODE END PV \*/

/\* USER CODE BEGIN PFP \*/
void on\_voice\_alert(uint16\_t id);
/\* USER CODE END PFP \*/

/\* USER CODE BEGIN 0 \*/
void on\_voice\_alert(uint16\_t id){
printf("sensor:%d alerted\r\n",id);
}
/\* USER CODE END 0 \*/

int main(void)
{
/\* USER CODE BEGIN 1 \*/

/\* USER CODE END 1 \*/

/\* MCU Configuration--------------------------------------------------------\*/

/\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/
HAL\_Init();

/\* USER CODE BEGIN Init \*/

/\* USER CODE END Init \*/

/\* Configure the system clock \*/
SystemClock\_Config();

/\* USER CODE BEGIN SysInit \*/

/\* USER CODE END SysInit \*/

/\* Initialize all configured peripherals \*/
MX\_GPIO\_Init();
MX\_USART1\_UART\_Init();
/\* USER CODE BEGIN 2 \*/
sensor.id = 1;
sensor.GPIOx = VOICE_SENSOR_GPIO_Port;
sensor.GPIO_Pin = VOICE_SENSOR_Pin;
sensor.callback = on_voice_alert;
/\* USER CODE END 2 \*/

/\* Infinite loop \*/
/\* USER CODE BEGIN WHILE \*/
while (1)
{
/\* USER CODE END WHILE \*/

/\* USER CODE BEGIN 3 \*/
}
/\* USER CODE END 3 \*/
}


程序运行结果如下:

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/125305160