赞
踩
振动(敲击)传感器
振动无处不在,有声音就有振动,哒哒的脚步是匆匆的过客,沙沙的夜雨是暗夜的忧伤。那你知道理科工程男是如何理解振动的吗?今天我们就来讲一讲本节的主角:最简单的机械式振动传感器。
下图即为振动传感器,外形有几种,原理都相同:1个弹簧电极+1个金属电极,振动时弹簧抖动碰到紧挨的金属电极,两个电极就会瞬间接通。我们通过单片机监测两电极的通断就可以知道当前是否发生振动,振动的频率是多少。原理就这么简单,准备上手!
一、硬件准备
注:除了传感器以外,剩下的和其他实验共用,无需反复购买。
STM32F103核心板3.3V接面包板3.3V,GND接面包板GND;LED为板载,接口为PC13。
STM32F103核心板与振动传感器接线如下。
传感器引脚 | 核心板引脚 |
S(信号输出) | PA15 |
GND | GND |
VCC | 3.3 |
二、软件准备
参见"STM32F1开发实例-开发环境搭建"。
三、实际效果
振动面包板,单片机侦测到传感器发出的信号,板载LED亮起1s后熄灭。
四、代码实现
项目工程源码如下:
https://download.csdn.net/download/wangpeng421/87548936
主程序代码如下:
- //------引用头文件
- #include "main.h"
- #include "delay.h"
- #include "timerPwm.h"
- #include "led.h"
- #include "ioSensor.h"
-
- //---------------------------
- //主函数
- //---------------------------
- int main(void)
- {
- SysInit(); //系统初始化,如时钟等
- UserInit(); //用户初始化,如传感器IO口等
-
- while(1)
- {
- //-----高速代码执行区
- ioSensorScan(); //传感器扫描引脚信号
- if(ioSensor1.Status==_ON) //如果传感器被触发
- {
- __LED1_On(); //点亮led1
- led1.Status=_ON; //将led1状态设置为ON
- }
- //-----中速代码执行区.单位时间100us。
- if(SpeedCon_Num >= 10)//1ms进入1次
- {
- SpeedCon_Num=0;
- if(led1.Status==_ON) //如果led1状态为ON
- {
- led1.onTime++; //led1点亮计时
- if(led1.onTime>1000) //1s后熄灭LED
- {
- led1.onTime=0; //计时清零
- __LED1_Off(); //熄灭led1
- led1.Status=_Off; //将led1状态设置为OFF
- }
- }
- else //led1没有亮起,则计时始终清零
- led1.onTime=0;
- }
- }
- }
传感器驱动头文件:ioSensor.h
注:此类传感器均为简单的高低电平检测,所以编入IO触发类,通用ioSensor驱动。
- //===============================================
- //驱动名称:IO类传感器驱动
- //公司名称:
- //代码编写: 苏墨 2020-05-12
- //API 说明:1.头文件定义IO -> 初始化"io_SensorInit()" -> 调用"ioScan()"。
- // 2.通过查询"ioSensor.Status"即可获取按键状态。按键状态值如下。
- // #define _OFF 0x00 //释放
- // #define _ON 0x01 //触发
- // #define _LongON 0x02 //长时间触发
- //其他说明:
- //===============================================
- #ifndef __ioSensor_H__
- #define __ioSensor_H__
- #include "sys.h"
-
- //-----IO定义
- #define ioSensor1_PIN GPIO_PIN_15 //传感器1
- #define ioSensor1_Port GPIOA
- #define ioSensor2_PIN GPIO_PIN_10 //传感器2
- #define ioSensor2_Port GPIOC
- #define ioSensor3_PIN GPIO_PIN_4 //传感器3
- #define ioSensor3_Port GPIOC
- //------IO宏
- #define __Enable_ioSensor_Port() do{__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();}while(0U)
-
- //-----结构体
- struct ioSensor{
- u8 onTime; //触发计时.ON
- u8 offTime; //释放计时.OFF
- u8 Status; //状态
- u16 longOnTime; //长触发计时.LongON
- };
-
- //-----常量
- #define _OFF 0x00 //释放
- #define _ON 0x01 //触发
- #define _LongON 0x02 //长按
-
-
- //-----变量
- extern struct ioSensor ioSensor1;
- extern struct ioSensor ioSensor2;
- extern struct ioSensor ioSensor3;
-
- //-----函数
- void ioSensorInit(); //初始化
- void ioSensorScan(); //扫描
- #endif
-
-
-
-
传感器驱动代码:ioSensor.c
- #include "ioSensor.h"
-
- //-----常量
-
-
- //-----变量
- struct ioSensor ioSensor1;
- struct ioSensor ioSensor2;
- struct ioSensor ioSensor3;
-
- //-----函数声明
- void ioSensorInit(); //初始化
- void ioSensorScan(); //扫描
-
-
- //---------------------------
- //初始化
- //输入参数:无
- //输出参数:无
- //其他说明:
- //---------------------------
- void ioSensorInit()
- {
- GPIO_InitTypeDef GPIO_Initure;
-
- __Enable_ioSensor_Port();
- GPIO_Initure.Pin=ioSensor1_PIN;
- GPIO_Initure.Mode=GPIO_MODE_INPUT; //输入模式
- GPIO_Initure.Pull=GPIO_PULLUP; //上拉
- GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //快速
- HAL_GPIO_Init(ioSensor1_Port,&GPIO_Initure);
- }
-
- //---------------------------
- //扫描
- //输入参数:无
- //输出参数:无
- //其他说明:结构体将指明按键状态信息。详见.h文件。
- //---------------------------
- #define _OnTime 0 //触发计时.
- #define _LongOnTime 1000 //长按计时.
- #define _OffTime 500 //释放计时
- void ioSensorScan()
- {
- //-----ioSensor1
- if(HAL_GPIO_ReadPin(ioSensor1_Port,ioSensor1_PIN)==1)
- {
- ioSensor1.offTime=0;
- ioSensor1.onTime++;
- if(ioSensor1.onTime>_OnTime)
- {
- ioSensor1.onTime=_OnTime;
- ioSensor1.Status=_ON;
- }
- }
- else
- {
- //------------
- ioSensor1.offTime++;
- if(ioSensor1.offTime>_OffTime)
- {
- ioSensor1.onTime=0;
- ioSensor1.longOnTime=0;
- ioSensor1.Status=_OFF;
- }
- }
- }
-
led驱动头文件:led.h
- //===============================================
- //驱动名称:led驱动
- //公司名称:
- //代码编写: 苏墨 2020-05-12
- //API 说明:1.头文件定义IO -> 初始化"ledInit()"。
- // 2.通过"led.Status"查询或设置led状态。状态值如下。
- // #define _OFF 0x00 //释放
- // #define _ON 0x01 //触发
- // 通过“__LEDx_On()、__LEDx_Off()”控制对应LED亮灭。
- //其他说明:
- //===============================================
- #ifndef __led_H__
- #define __led_H__
- #include "sys.h"
-
-
- //-----IO定义
- #define LED1_Pin GPIO_PIN_13
- #define LED1_Port GPIOC
- #define LED2_Pin GPIO_PIN_14
- #define LED2_Port GPIOC
- //-----宏
- #define __Enable_LED_Port() do{__HAL_RCC_GPIOC_CLK_ENABLE();}while(0U)
- #define __LED1_On() do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_RESET);}while(0U)
- #define __LED1_Off() do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_SET);}while(0U)
- #define __LED2_On() do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_RESET);}while(0U)
- #define __LED2_Off() do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_SET);}while(0U)
-
- //-----结构体
- struct led{
- u16 onTime; //触发计时.ON
- u16 OffTime; //释放计时.OFF
- u8 Status; //状态
- };
-
- //-----常量
-
-
-
- //-----变量
- extern struct led led1;
-
-
- //-----函数
- void ledInit();
-
- #endif
-
led驱动代码:led.c
- #ifndef __led_H__
- #define __led_H__
- #include "sys.h"
-
-
- //-----IO定义
- #define LED1_Pin GPIO_PIN_13
- #define LED1_Port GPIOC
- #define LED2_Pin GPIO_PIN_14
- #define LED2_Port GPIOC
- //-----宏
- #define __Enable_LED_Port() do{__HAL_RCC_GPIOC_CLK_ENABLE();}while(0U)
- #define __LED1_On() do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_RESET);}while(0U)
- #define __LED1_Off() do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_SET);}while(0U)
- #define __LED2_On() do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_RESET);}while(0U)
- #define __LED2_Off() do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_SET);}while(0U)
-
- //-----结构体
- struct led{
- u16 onTime; //触发计时.ON
- u16 OffTime; //释放计时.OFF
- u8 Status; //状态
- };
-
- //-----常量
-
-
-
- //-----变量
- extern struct led led1;
-
-
- //-----函数
- void ledInit();
-
- #endif
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。