STM32之震动传感器、继电器介绍及实战

本文介绍了如何使用STM32单片机配合震动传感器进行中断控制,当检测到震动时通过中断点亮LED。同时讲解了继电器的工作原理及其与STM32的连接方法,实现小电流控制大电流的功能。在编程中特别注意了中断服务函数的编写和中断优先级设置,以避免系统卡死问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、震动传感器介绍及实战

二、编程代码实现

1、gpio.c---------初始化GPIO口引脚函数

2、编写中断服务函数

3、用外部中断共用入口函数,来调用外部中断处理回调函数

4、编写外部中断处理回调函数(在这里编写项目设计的逻辑)

5、把上述的外部中断处理回调函数,放入main主函数里

6、结果演示

三、继电器介绍及实战 


一、震动传感器介绍及实战

单片机供电VCC GND接单片机

产品不震动,输出高电平、模块上的DO口

产品震动,输出低电平,绿色指示灯亮

AO口不用

5V:代表正极

GND:代表负极

DO口:do是一种模拟信号或者数字信号接口

二、编程代码实现


需求:当振动传感器接收到振动信号时,使用中断方式点亮LED1。

1、gpio.c---------初始化GPIO口引脚函数

#include "gpio.h"
void MX_GPIO_Init(void)   //初始化GPIO口引脚函数
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};  //初始化设置GPIO的结构体

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();      //使能GPIOD时钟
  __HAL_RCC_GPIOA_CLK_ENABLE();      //使能GPIOA时钟
  __HAL_RCC_GPIOB_CLK_ENABLE();      //使能GPIOB时钟

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);  //GPIO引脚输出1或者0的函数

  /*Configure GPIO pin : PA4 */
  GPIO_InitStruct.Pin = GPIO_PIN_4;             //配置GPIO口引脚:PA4
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  //下降沿触发检测的外部中断模式
  GPIO_InitStruct.Pull = GPIO_NOPULL;           //内部电阻既不拉高也不拉低
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       //根据上述内容,初始化GPIOA引脚

  /*Configure GPIO pin : PB8 */
  GPIO_InitStruct.Pin = GPIO_PIN_8;             //配置GPIO口引脚:PB8
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;   //推挽输出;推挽输出可以真正能真正的输出高电平
  GPIO_InitStruct.Pull = GPIO_NOPULL;           //内部电阻既不拉高也不拉低
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_
### 关于STM32驱动801S振动传感器 #### 驱动原理概述 801S振动传感器是一种基于MEMS技术的加速度传感器,能够检测到轻微的震动并将其转化为电信号。当该信号接入STM32微控制器时,可以通过GPIO引脚读取其状态变化。一旦检测到震动事件,可以触发中断或其他响应机制来控制外部设备,例如继电器或LED灯。 在实际应用中,通常将801S振动传感器的输出端连接至STM32的一个输入引脚,并配置此引脚为上升沿/下降沿触发模式以捕获震动事件的发生[^1]。 #### 软件实现方法 以下是通过STM32 HAL库编写的一段简单代码示例,用于初始化GPIO引脚以及设置中断服务函数: ```c #include "stm32f1xx_hal.h" // 定义使用的 GPIO 引脚 #define VIB_SENSOR_PIN GPIO_PIN_0 #define VIB_SENSOR_GPIO_PORT GPIOA void MX_GPIO_Init(void){ GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟 // 初始化 GPIOA 的第 0 号针脚作为输入 GPIO_InitStruct.Pin = VIB_SENSOR_PIN; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 设置为上升沿触发中断 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用上下拉电阻 HAL_GPIO_Init(VIB_SENSOR_GPIO_PORT, &GPIO_InitStruct); // 中断优先级分组配置 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); // 配置 NVIC 对应通道的优先级 HAL_NVIC_SetPriority(EXTI0_IRQn, 15, 0); // 开启 EXTI0 中断线使能 HAL_NVIC_EnableIRQ(EXTI0_IRQn); } // 外部中断服务程序 void EXTI0_IRQHandler(void){ HAL_GPIO_EXTI_IRQHandler(VIB_SENSOR_PIN); // 清除中断标志位 /* 用户自定义逻辑 */ // 如点亮 LED 或者操作其他外设... } ``` 上述代码片段展示了如何利用STM32 HAL库完成基本的功能设定,其中包括了对外围硬件资源的基础管理与回调处理流程的设计思路。 #### 实战技巧分享 为了提高系统的稳定性和抗干扰能力,在设计电路时建议加入滤波电容或者软件去抖算法;另外考虑到功耗问题,如果项目允许的话还可以让MCU进入低功耗模式直到下一次有效震动唤醒它为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值