STM32F1与STM32CubeIDE编程实例-振动传感器驱动

振动传感器驱动

振动传感器,也称为压电传感器,有多种类型,用于测量设备或系统的加速度、压力、振动变化。振动传感器有如下类型:

  • **涡流( Eddy Current)**:涡流或电容式位移传感器是一种非接触式振动传感器类型,它产生磁场以测量导电部件中的位置变化。这种振动传感器要求传感对象足够大,然后才能进行一般传感。
  • 速度类感器:速度传感器是一种振动传感器类型,通过使用在线圈内移动的磁铁产生的电流进行高温测量。由于与加速度计和陀螺仪传感器相比,它对放大器过载的敏感性较低,因此很受欢迎,因此速度传感器不能乱用!
  • **应变计传感器( Strain Guage Sensor)**:应变计传感器是一种振动传感器类型,它通过将力、压力、张力或重量转换为电阻变化来测量机械上的应变。它主要用于机械应用和具有曲面的物体。
  • 压电加速度计传感器:也许最优选的振动传感器类型是压电加速度传感器。 多功能、宽动态范围,支持许多潜在应用,如振动传感器报警、安全系统、工业用途等。

振动传感器可用于广泛的应用,尽管它仅取决于使用的振动传感器的类型。 每种类型振动传感器的特点将决定可以使用哪些合适的应用程序。

在这里插入图片描述

本实例使用SW-420振动模块,它可以工作在3.3V到5V之间。 传感器使用 LM393 比较器检测超过阈值点的振动并提供数字数据,逻辑低或逻辑高,0 或 1。在正常工作期间,传感器提供逻辑低,当检测到振动时,传感器提供逻辑高。 模块中提供三个外围设备,两个 LED,一个用于电源状态,另一个用于传感器输出。 此外,还提供一个电位器,可进一步用于控制振动的阈值点。 在本项目中,我们将使用 5V 为模块供电。

1、振动传感器配置

振动传感器配置:

在这里插入图片描述

保存配置并生成代码。

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
/\*
\* vibration\_sensor.h
\*
\* Created on: Apr 22, 2022
\* Author: jenson
\*/

#ifndef \_\_VIBRATION\_SENSOR\_H\_\_
#define \_\_VIBRATION\_SENSOR\_H\_\_
#include <stdio.h>
#include <stm32f1xx\_hal.h>
#include "main.h"

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

/\*\*
\*@brief 检查振动开关状态
\*@param sensor 开关对象
\*@return 当开关闭合时,返回1;否则,返回0
\*/
uint8\_t vibration\_sensor\_check(vibration\_sensor\_t\* sensor);


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


2)振动传感器状态检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/\*
\* vibration\_sensor.c
\*
\* Created on: Apr 22, 2022
\* Author: jenson
\*/
#include "vibration\_sensor.h"

uint8\_t vibration\_sensor\_check(vibration\_sensor\_t \*sensor) {
// 读取传感器输出电平
if (HAL\_GPIO\_ReadPin(sensor->GPIOx, sensor->GPIO_Pin) == GPIO_PIN_SET) {
return 1;
}
return 0;
}

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
/\* Private includes ----------------------------------------------------------\*/
/\* USER CODE BEGIN Includes \*/
#include <stdio.h>
#include "vibration\_sensor/vibration\_sensor.h"
/\* USER CODE END Includes \*/

/\* USER CODE BEGIN PV \*/
vibration\_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.GPIO_Pin = VIBRATION_SENSOR_Pin;
sensor.GPIOx = VIBRATION_SENSOR_GPIO_Port;
printf("\*\*\*\*STM32CubeIDE:Vibration Sensor\*\*\*\*\r\n");
/\* USER CODE END 2 \*/

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

/\* USER CODE BEGIN 3 \*/
if (vibration\_sensor\_check(&sensor)) {
printf("Vibration Sensor toggled\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
/\*
\* vibration\_sensor.h
\*
\* Created on: Apr 22, 2022
\* Author: jenson
\*/

#ifndef \_\_VIBRATION\_SENSOR\_H\_\_
#define \_\_VIBRATION\_SENSOR\_H\_\_
#include <stdio.h>
#include <stm32f1xx\_hal.h>
#include "main.h"

/\*\*\*
\* @brief 振动传感器中断回调函数
\* @param sensor\_id 传感编码
\*/
typedef void (\*vibration_sensor_callback)(uint16\_t sensor_id);

typedef struct {
uint16\_t id;
GPIO_TypeDef \*GPIOx; // 总线端口
uint16\_t GPIO_Pin; // 总线引脚
vibration_sensor_callback callback; // 回调
} vibration\_sensor\_t;


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


2)中断服务实现

stm32f1xx_it.c文件中添加如下代码:

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

/\* Private variables ---------------------------------------------------------\*/
/\* USER CODE BEGIN PV \*/
extern vibration\_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
64
65
66
/\* Private includes ----------------------------------------------------------\*/
/\* USER CODE BEGIN Includes \*/
#include <stdio.h>
#include "vibration\_sensor/vibration\_sensor.h"
/\* USER CODE END Includes \*/

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

/\* USER CODE BEGIN PFP \*/
void on\_vibration\_sensor\_callback(uint16\_t sensor_id);
/\* USER CODE END PFP \*/

/\* Private user code ---------------------------------------------------------\*/
/\* USER CODE BEGIN 0 \*/
void on\_vibration\_sensor\_callback(uint16\_t sensor_id){
printf("Vibration Sensor %d toggled\r\n",sensor_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.GPIO_Pin = TILT_SWITCH_Pin;
sensor.GPIOx = TILT_SWITCH_GPIO_Port;
sensor.callback = on_vibration_sensor_callback;
printf("\*\*\*\*STM32CubeIDE:Tilt Switch\*\*\*\*\r\n");
/\* 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/125380681