STM32F1与STM32CubeIDE编程实例-倾斜开关(Tilt Switch)驱动

倾斜开关(Tilt Switch)驱动

倾斜传感器允许检测方向或倾斜度。倾斜传感器通常由某种空腔(圆柱形很流行,但并非总是如此)和内部的导电自由物质制成,例如一团水银或滚球。 空腔的一端有两个导电元件(极)。 当传感器的方向使该端向下时,质量会滚动到磁极上并使它们短路,充当开关投掷。倾斜开关有如下类型:

  • 水银开关:在试管中使用一滴水银。 传感器根据重力定位,以便在开关打开时水银从触点上移开。 传感器方向的变化导致珠子在管中滚动,接触两个触点并关闭开关。水银倾斜开关的优点是成本低且易于使用。缺点包括材料的毒性以及它们只能执行开/关功能。
  • 球笼开关:使用一个装在带有两个或多个触点的外壳单元中的小金属球。 当外壳倾斜时,球会使两个电触点短路,从而关闭开关。 可以向该设备添加多个触点,以便确定倾斜方向。
  • 力平衡传感器:力平衡传感器是倾斜计中经常使用的重力参考传感器。 该传感器由一个平衡系统组成,其中一个悬垂质量悬挂在两个位置检测器之间。 当质量块由于重力而试图沿倾斜方向移动时,质量块的位置由位置传感器检测并引起电流变化。
  • 固态传感器:固态传感器是微机电系统 (MEM)。 它们是带有可移动质量块板的微型设备,通过机械悬挂系统连接到参考框架上。
  • 电解倾斜传感器:电解倾斜传感器能够在各种应用中产生极其精确的俯仰和侧倾测量。 它们通过使用填充有导电流体的玻璃或陶瓷腔来发挥作用。 当传感器旋转时,电极之间会产生不平衡。 其中一个电极的不平衡与旋转角度成正比。
  • 电容式倾斜传感器:电容式倾斜传感器设计用于对倾斜和倾角进行非接触式测量。 电容器既可以用作传感器,也可以用作开关。 电容式感应独立于基材,并且在电容器的几何形状发生变化时依赖于电容的变化。
  • 加速度计:加速度计是用于测量、显示和分析加速度和振动的仪器。 它们可以用作倾斜传感器,但在倾斜方向上的分辨率有限,并且它们具有高功耗。

在这里插入图片描述

本次实例使用高灵敏角度开关SW-520D。模块输出的开关量取决于角度开关的导通与断开,当角度开关断开时,DO输出高电平,角度开关导通时,DO输出低电平。

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

#ifndef \_\_TILT\_SWITCH\_H\_\_
#define \_\_TILT\_SWITCH\_H\_\_

#include <stdio.h>
#include <stm32f1xx\_hal.h>
#include "main.h"

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

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


#endif /\* TILT\_SWITCH\_TILT\_SWITCH\_H\_ \*/


2)倾斜开关状态检测

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

uint8\_t tilt\_switch\_check(tilt\_switch\_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
57
58
/\* Private includes ----------------------------------------------------------\*/
/\* USER CODE BEGIN Includes \*/
#include <stdio.h>
#include "tilt\_switch/tilt\_switch.h"
/\* USER CODE END Includes \*/


/\* USER CODE BEGIN PV \*/
tilt\_switch\_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 = TILT_SWITCH_Pin;
sensor.GPIOx = TILT_SWITCH_GPIO_Port;
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 \*/
if(tilt\_switch\_check(&sensor)){
printf("Tilt Switch 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
31
/\*
\* tilt\_switch.h
\*
\* Created on: Apr 22, 2022
\* Author: jenson
\*/

#ifndef \_\_TILT\_SWITCH\_H\_\_
#define \_\_TILT\_SWITCH\_H\_\_

#include <stdio.h>
#include <stm32f1xx\_hal.h>
#include "main.h"

/\*\*\*
\* @brief 倾斜传感器中断回调
\* @param sensor\_id 传感器编号
\*/
typedef void (\*on_tilt_switch_callback)(uint16\_t sensor_id);

typedef struct {
uint16\_t id;
GPIO_TypeDef \*GPIOx; // 总线端口
uint16\_t GPIO_Pin; // 总线引脚
on_tilt_switch_callback callback; // 回调
} tilt\_switch\_t;


#endif /\* TILT\_SWITCH\_TILT\_SWITCH\_H\_ \*/


2)中断服务实现

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

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

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

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

/\* Private user code ---------------------------------------------------------\*/
/\* USER CODE BEGIN 0 \*/
void on\_tilt\_switch\_callback(uint16\_t sensor_id){
printf("Tilt Switch %d toggled\r\n");
}
/\* 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_tilt_switch_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/125361285