当前位置:   article > 正文

STM32F1开发实例-振动传感器(机械)_stm32f1086单片机读取sm420振动传感器

stm32f1086单片机读取sm420振动传感器

振动(敲击)传感器

振动无处不在,有声音就有振动,哒哒的脚步是匆匆的过客,沙沙的夜雨是暗夜的忧伤。那你知道理科工程男是如何理解振动的吗?今天我们就来讲一讲本节的主角:最简单的机械式振动传感器。

下图即为振动传感器,外形有几种,原理都相同:1个弹簧电极+1个金属电极,振动时弹簧抖动碰到紧挨的金属电极,两个电极就会瞬间接通。我们通过单片机监测两电极的通断就可以知道当前是否发生振动,振动的频率是多少。原理就这么简单,准备上手!

 

一、硬件准备

  • 振动传感器1个,0.85元。
  • STM32F103核心板一块,某宝7块9。供电线跟你的手机充电线一样。
  • 面包板套件一套,某宝13.8元。不买套件,随手弄几根杜邦线也OK。
  • 仿真器,某宝7.5元。

   

 注:除了传感器以外,剩下的和其他实验共用,无需反复购买。

STM32F103核心板3.3V接面包板3.3V,GND接面包板GND;LED为板载,接口为PC13。

STM32F103核心板与振动传感器接线如下。

传感器引脚核心板引脚
S(信号输出)PA15
GNDGND
VCC3.3

二、软件准备

参见"STM32F1开发实例-开发环境搭建"。

三、实际效果

振动面包板,单片机侦测到传感器发出的信号,板载LED亮起1s后熄灭。

四、代码实现

项目工程源码如下:

https://download.csdn.net/download/wangpeng421/87548936

主程序代码如下:

  1. //------引用头文件
  2. #include "main.h"
  3. #include "delay.h"
  4. #include "timerPwm.h"
  5. #include "led.h"
  6. #include "ioSensor.h"
  7. //---------------------------
  8. //主函数
  9. //---------------------------
  10. int main(void)
  11. {
  12. SysInit(); //系统初始化,如时钟等
  13. UserInit(); //用户初始化,如传感器IO口等
  14. while(1)
  15. {
  16. //-----高速代码执行区
  17. ioSensorScan(); //传感器扫描引脚信号
  18. if(ioSensor1.Status==_ON) //如果传感器被触发
  19. {
  20. __LED1_On(); //点亮led1
  21. led1.Status=_ON; //将led1状态设置为ON
  22. }
  23. //-----中速代码执行区.单位时间100us。
  24. if(SpeedCon_Num >= 10)//1ms进入1次
  25. {
  26. SpeedCon_Num=0;
  27. if(led1.Status==_ON) //如果led1状态为ON
  28. {
  29. led1.onTime++; //led1点亮计时
  30. if(led1.onTime>1000) //1s后熄灭LED
  31. {
  32. led1.onTime=0; //计时清零
  33. __LED1_Off(); //熄灭led1
  34. led1.Status=_Off; //将led1状态设置为OFF
  35. }
  36. }
  37. else //led1没有亮起,则计时始终清零
  38. led1.onTime=0;
  39. }
  40. }
  41. }

传感器驱动头文件:ioSensor.h

注:此类传感器均为简单的高低电平检测,所以编入IO触发类,通用ioSensor驱动。

  1. //===============================================
  2. //驱动名称:IO类传感器驱动
  3. //公司名称:
  4. //代码编写: 苏墨 2020-05-12
  5. //API 说明:1.头文件定义IO -> 初始化"io_SensorInit()" -> 调用"ioScan()"。
  6. // 2.通过查询"ioSensor.Status"即可获取按键状态。按键状态值如下。
  7. // #define _OFF 0x00 //释放
  8. // #define _ON 0x01 //触发
  9. // #define _LongON 0x02 //长时间触发
  10. //其他说明:
  11. //===============================================
  12. #ifndef __ioSensor_H__
  13. #define __ioSensor_H__
  14. #include "sys.h"
  15. //-----IO定义
  16. #define ioSensor1_PIN GPIO_PIN_15 //传感器1
  17. #define ioSensor1_Port GPIOA
  18. #define ioSensor2_PIN GPIO_PIN_10 //传感器2
  19. #define ioSensor2_Port GPIOC
  20. #define ioSensor3_PIN GPIO_PIN_4 //传感器3
  21. #define ioSensor3_Port GPIOC
  22. //------IO宏
  23. #define __Enable_ioSensor_Port() do{__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();}while(0U)
  24. //-----结构体
  25. struct ioSensor{
  26. u8 onTime; //触发计时.ON
  27. u8 offTime; //释放计时.OFF
  28. u8 Status; //状态
  29. u16 longOnTime; //长触发计时.LongON
  30. };
  31. //-----常量
  32. #define _OFF 0x00 //释放
  33. #define _ON 0x01 //触发
  34. #define _LongON 0x02 //长按
  35. //-----变量
  36. extern struct ioSensor ioSensor1;
  37. extern struct ioSensor ioSensor2;
  38. extern struct ioSensor ioSensor3;
  39. //-----函数
  40. void ioSensorInit(); //初始化
  41. void ioSensorScan(); //扫描
  42. #endif

传感器驱动代码:ioSensor.c

  1. #include "ioSensor.h"
  2. //-----常量
  3. //-----变量
  4. struct ioSensor ioSensor1;
  5. struct ioSensor ioSensor2;
  6. struct ioSensor ioSensor3;
  7. //-----函数声明
  8. void ioSensorInit(); //初始化
  9. void ioSensorScan(); //扫描
  10. //---------------------------
  11. //初始化
  12. //输入参数:无
  13. //输出参数:无
  14. //其他说明:
  15. //---------------------------
  16. void ioSensorInit()
  17. {
  18. GPIO_InitTypeDef GPIO_Initure;
  19. __Enable_ioSensor_Port();
  20. GPIO_Initure.Pin=ioSensor1_PIN;
  21. GPIO_Initure.Mode=GPIO_MODE_INPUT; //输入模式
  22. GPIO_Initure.Pull=GPIO_PULLUP; //上拉
  23. GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //快速
  24. HAL_GPIO_Init(ioSensor1_Port,&GPIO_Initure);
  25. }
  26. //---------------------------
  27. //扫描
  28. //输入参数:无
  29. //输出参数:无
  30. //其他说明:结构体将指明按键状态信息。详见.h文件。
  31. //---------------------------
  32. #define _OnTime 0 //触发计时.
  33. #define _LongOnTime 1000 //长按计时.
  34. #define _OffTime 500 //释放计时
  35. void ioSensorScan()
  36. {
  37. //-----ioSensor1
  38. if(HAL_GPIO_ReadPin(ioSensor1_Port,ioSensor1_PIN)==1)
  39. {
  40. ioSensor1.offTime=0;
  41. ioSensor1.onTime++;
  42. if(ioSensor1.onTime>_OnTime)
  43. {
  44. ioSensor1.onTime=_OnTime;
  45. ioSensor1.Status=_ON;
  46. }
  47. }
  48. else
  49. {
  50. //------------
  51. ioSensor1.offTime++;
  52. if(ioSensor1.offTime>_OffTime)
  53. {
  54. ioSensor1.onTime=0;
  55. ioSensor1.longOnTime=0;
  56. ioSensor1.Status=_OFF;
  57. }
  58. }
  59. }

led驱动头文件:led.h

  1. //===============================================
  2. //驱动名称:led驱动
  3. //公司名称:
  4. //代码编写: 苏墨 2020-05-12
  5. //API 说明:1.头文件定义IO -> 初始化"ledInit()"。
  6. // 2.通过"led.Status"查询或设置led状态。状态值如下。
  7. // #define _OFF 0x00 //释放
  8. // #define _ON 0x01 //触发
  9. // 通过“__LEDx_On()、__LEDx_Off()”控制对应LED亮灭。
  10. //其他说明:
  11. //===============================================
  12. #ifndef __led_H__
  13. #define __led_H__
  14. #include "sys.h"
  15. //-----IO定义
  16. #define LED1_Pin GPIO_PIN_13
  17. #define LED1_Port GPIOC
  18. #define LED2_Pin GPIO_PIN_14
  19. #define LED2_Port GPIOC
  20. //-----宏
  21. #define __Enable_LED_Port() do{__HAL_RCC_GPIOC_CLK_ENABLE();}while(0U)
  22. #define __LED1_On() do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_RESET);}while(0U)
  23. #define __LED1_Off() do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_SET);}while(0U)
  24. #define __LED2_On() do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_RESET);}while(0U)
  25. #define __LED2_Off() do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_SET);}while(0U)
  26. //-----结构体
  27. struct led{
  28. u16 onTime; //触发计时.ON
  29. u16 OffTime; //释放计时.OFF
  30. u8 Status; //状态
  31. };
  32. //-----常量
  33. //-----变量
  34. extern struct led led1;
  35. //-----函数
  36. void ledInit();
  37. #endif

led驱动代码:led.c

  1. #ifndef __led_H__
  2. #define __led_H__
  3. #include "sys.h"
  4. //-----IO定义
  5. #define LED1_Pin GPIO_PIN_13
  6. #define LED1_Port GPIOC
  7. #define LED2_Pin GPIO_PIN_14
  8. #define LED2_Port GPIOC
  9. //-----宏
  10. #define __Enable_LED_Port() do{__HAL_RCC_GPIOC_CLK_ENABLE();}while(0U)
  11. #define __LED1_On() do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_RESET);}while(0U)
  12. #define __LED1_Off() do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_SET);}while(0U)
  13. #define __LED2_On() do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_RESET);}while(0U)
  14. #define __LED2_Off() do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_SET);}while(0U)
  15. //-----结构体
  16. struct led{
  17. u16 onTime; //触发计时.ON
  18. u16 OffTime; //释放计时.OFF
  19. u8 Status; //状态
  20. };
  21. //-----常量
  22. //-----变量
  23. extern struct led led1;
  24. //-----函数
  25. void ledInit();
  26. #endif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/802581
推荐阅读
相关标签
  

闽ICP备14008679号