STM32F1与STM32CubeIDE编程实例-金属触摸传感器驱动 金属触摸传感器驱动 KY-036金属触摸传感器模块采用KRS13达林顿NPN晶体管,其信号由电路部分控制,电路部分集成LM393,内部有两个比较器。 当触摸弯曲在晶体管上的裸线(由晶体管的基极表示)时,环境的 50 Hz 信号被注入到高增益放大器中。放大器的输出连接到比较器,然后将正弦交流信号转换为方波。
本文将演示如何在STM32CubeIDE中使用金属触摸传感器。本次使用的传感器模块,当有触摸时,输出高电平。
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 /\* \* metal\_touch\_sensor.h \* \* Created on: Apr 24, 2022 \* Author: jenson \*/ #ifndef \_\_METAL\_TOUCH\_SENSOR\_H\_\_ #define \_\_METAL\_TOUCH\_SENSOR\_H\_\_ #include <stdio.h> #include <stm32f1xx\_hal.h> #include "main.h" typedef struct{ uint16\_t id; GPIO_TypeDef \*GPIOx; // 总线端口 uint16\_t GPIO_Pin; // 总线引脚 }metal\_touch\_sensor\_t; /\*\* \*@brief 查询金属触摸传感器状态 \*@param sensor 开关对象 \*@return 当开关闭合时,返回1;否则,返回0 \*/ uint8\_t metal\_touch\_sensor\_check(metal\_touch\_sensor\_t\* sensor); #endif /\* \_\_METAL\_TOUCH\_SENSOR\_H\_\_ \*/
2)传感器状态检查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /\* \* metal\_touch\_sensor.c \* \* Created on: Apr 24, 2022 \* Author: jenson \*/ #include "metal\_touch\_sensor.h" uint8\_t metal\_touch\_sensor\_check(metal\_touch\_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 57 /\* Private includes ----------------------------------------------------------\*/ /\* USER CODE BEGIN Includes \*/ #include <stdio.h> #include "metal\_touch\_sensor/metal\_touch\_sensor.h" /\* USER CODE END Includes \*/ /\* Private variables ---------------------------------------------------------\*/ /\* USER CODE BEGIN PV \*/ metal\_touch\_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 = METAL_TOUCH_SENSOR_Pin; sensor.GPIOx = METAL_TOUCH_SENSOR_GPIO_Port; printf("\*\*\*\*STM32CubeIDE:Metal Touch Sensor\*\*\*\*\r\n"); /\* USER CODE END 2 \*/ /\* Infinite loop \*/ /\* USER CODE BEGIN WHILE \*/ while (1) { /\* USER CODE END WHILE \*/ /\* USER CODE BEGIN 3 \*/ if (metal\_touch\_sensor\_check(&sensor)) { printf("sensor touched\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 /\* \* metal\_touch\_sensor.h \* \* Created on: Apr 24, 2022 \* Author: jenson \*/ #ifndef \_\_METAL\_TOUCH\_SENSOR\_H\_\_ #define \_\_METAL\_TOUCH\_SENSOR\_H\_\_ #include <stdio.h> #include <stm32f1xx\_hal.h> #include "main.h" /\*\*\* \* @brief 金属触摸感器中断回调函数 \* @param sensor\_id 传感器编码 \*/ typedef void (\*metal_touch_sensor_callback)(uint16\_t sensor_id); typedef struct{ uint16\_t id; GPIO_TypeDef \*GPIOx; // 总线端口 uint16\_t GPIO_Pin; // 总线引脚 metal_touch_sensor_callback callback; // 中断回调函数 }metal\_touch\_sensor\_t; #endif /\* \_\_METAL\_TOUCH\_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 "metal\_touch\_sensor/metal\_touch\_sensor.h" /\* USER CODE END Includes \*/ /\* External variables --------------------------------------------------------\*/ /\* USER CODE BEGIN EV \*/ extern metal\_touch\_sensor\_t sensor; /\* USER CODE END EV \*/ /\* 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 67 /\* Private includes ----------------------------------------------------------\*/ /\* USER CODE BEGIN Includes \*/ #include <stdio.h> #include "metal\_touch\_sensor/metal\_touch\_sensor.h" /\* USER CODE END Includes \*/ /\* Private variables ---------------------------------------------------------\*/ /\* USER CODE BEGIN PV \*/ metal\_touch\_sensor\_t sensor; /\* USER CODE END PV \*/ /\* USER CODE BEGIN PFP \*/ void on\_metal\_touch\_sensor\_callback(uint16\_t sensor_id); /\* USER CODE END PFP \*/ /\* Private user code ---------------------------------------------------------\*/ /\* USER CODE BEGIN 0 \*/ void on\_metal\_touch\_sensor\_callback(uint16\_t sensor_id) { printf("sensor %d touched\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 = METAL_TOUCH_SENSOR_Pin; sensor.GPIOx = METAL_TOUCH_SENSOR_GPIO_Port; sensor.callback = on_metal_touch_sensor_callback; printf("\*\*\*\*STM32CubeIDE:Metal Touch Sensor\*\*\*\*\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/125486266
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!