当前位置:   article > 正文

基于STM32F103的消防系统之MQ-4气体传感器_基于ch579m的mq-4气体传感器数据读取工程代码

基于ch579m的mq-4气体传感器数据读取工程代码

硬件材料

开发板 野火STM32-F103指南者

气体传感器 MQ-4气体传感器 

MQ-4 气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。
当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。
MQ-4 气体传感器对甲烷灵敏度高,对酒精及其他一些干扰性气体有较强的抗干扰能力。

引脚连接

 

 注意!!必须使用5v电压,否则会造成电压过低测不准。

代码简介

MQ-4气体传感器采用的是模拟输入的模式,即使用模拟信号进行信息传递。使用模拟信号输入可以探测到周围气体的浓度值。

软件代码

.C文件

  1. #include "mq4.h"
  2. __IO uint16_t ADC_ConvertedValue;
  3. /**
  4. * @brief ADC GPIO 初始化
  5. * @param 无
  6. * @retval 无
  7. */
  8. static void ADCx_GPIO_Config(void)
  9. {
  10. GPIO_InitTypeDef GPIO_InitStructure;
  11. // 打开 ADC IO端口时钟
  12. ADC_GPIO_APBxClock_FUN ( ADC_GPIO_CLK, ENABLE );
  13. // 配置 ADC IO 引脚模式
  14. // 必须为模拟输入
  15. GPIO_InitStructure.GPIO_Pin = ADC_PIN;
  16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  17. // 初始化 ADC IO
  18. GPIO_Init(ADC_PORT, &GPIO_InitStructure);
  19. }
  20. /**
  21. * @brief 配置ADC工作模式
  22. * @param 无
  23. * @retval 无
  24. */
  25. static void ADCx_Mode_Config(void)
  26. {
  27. ADC_InitTypeDef ADC_InitStructure;
  28. // 打开ADC时钟
  29. ADC_APBxClock_FUN ( ADC_CLK, ENABLE );
  30. // ADC 模式配置
  31. // 只使用一个ADC,属于独立模式
  32. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  33. // 禁止扫描模式,多通道才要,单通道不需要
  34. ADC_InitStructure.ADC_ScanConvMode = DISABLE ;
  35. // 连续转换模式
  36. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  37. // 不用外部触发转换,软件开启即可
  38. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  39. // 转换结果右对齐
  40. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  41. // 转换通道1个
  42. ADC_InitStructure.ADC_NbrOfChannel = 1;
  43. // 初始化ADC
  44. ADC_Init(ADCx, &ADC_InitStructure);
  45. // 配置ADC时钟为PCLK2的8分频,即9MHz
  46. RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  47. // 配置 ADC 通道转换顺序和采样时间
  48. ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1,
  49. ADC_SampleTime_55Cycles5);
  50. // ADC 转换结束产生中断,在中断服务程序中读取转换值
  51. ADC_ITConfig(ADCx, ADC_IT_EOC, ENABLE);
  52. // 开启ADC ,并开始转换
  53. ADC_Cmd(ADCx, ENABLE);
  54. // 初始化ADC 校准寄存器
  55. ADC_ResetCalibration(ADCx);
  56. // 等待校准寄存器初始化完成
  57. while(ADC_GetResetCalibrationStatus(ADCx));
  58. // ADC开始校准
  59. ADC_StartCalibration(ADCx);
  60. // 等待校准完成
  61. while(ADC_GetCalibrationStatus(ADCx));
  62. // 由于没有采用外部触发,所以使用软件触发ADC转换
  63. ADC_SoftwareStartConvCmd(ADCx, ENABLE);
  64. }
  65. static void ADC_NVIC_Config(void)
  66. {
  67. NVIC_InitTypeDef NVIC_InitStructure;
  68. // 优先级分组
  69. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  70. // 配置中断优先级
  71. NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;
  72. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  73. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  74. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  75. NVIC_Init(&NVIC_InitStructure);
  76. }
  77. /**
  78. * @brief ADC初始化
  79. * @param 无
  80. * @retval 无
  81. */
  82. void ADCx_Init(void)
  83. {
  84. ADCx_GPIO_Config();
  85. ADCx_Mode_Config();
  86. ADC_NVIC_Config();
  87. }
  88. /*********************************************END OF FILE**********************/

.H文件

  1. #ifndef __MQ_H
  2. #define __MQ_H
  3. #include "stm32f10x.h"
  4. // ADC 编号选择
  5. // 可以是 ADC1/2,如果使用ADC3,中断相关的要改成ADC3的
  6. #define ADC_APBxClock_FUN RCC_APB2PeriphClockCmd
  7. #define ADCx ADC2
  8. #define ADC_CLK RCC_APB2Periph_ADC2
  9. // ADC GPIO宏定义
  10. // 注意:用作ADC采集的IO必须没有复用,否则采集电压会有影响
  11. #define ADC_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd
  12. #define ADC_GPIO_CLK RCC_APB2Periph_GPIOA //修改时钟
  13. #define ADC_PORT GPIOA //修改寄存器
  14. #define ADC_PIN GPIO_Pin_5 //修改引脚
  15. // ADC 通道宏定义
  16. #define ADC_CHANNEL ADC_Channel_5 //修改
  17. // ADC 中断相关宏定义
  18. #define ADC_IRQ ADC1_2_IRQn
  19. #define ADC_IRQHandler ADC1_2_IRQHandler
  20. //#define ADC_IRQ ADC3_IRQn
  21. //#define ADC_IRQHandler ADC3_IRQHandler
  22. void ADCx_Init(void);
  23. #endif /* __ADC_H */

main.c

  1. void MQ-4(void)
  2. {
  3. ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;//读取电压值
  4. /*此处可加上一行代码,将电压值转换为浓度值*/
  5. delay_ms(200);
  6. printf("read_dht11_finish=%f\r\n", ADC_ConvertedValueLocal);
  7. if(ADC_ConvertedValueLocal > x) //可改为浓度大于某值
  8. {
  9. /*用户自定义操作*/
  10. }
  11. else
  12. {
  13. /*用户自定义操作*/
  14. }
  15. }

阅读至此,可以知道MQ-4气体传感器的模拟输入是直接借用ADC检测的代码,若是空白代码,从头编写,可能需要在stm32f10x_it.c文件添加一定的代码。

MQ-4气体传感器只是一个基础的情况探测模块,具体的应用会在以后的章节进行讲解。比如检测到燃气泄漏之后的操作,响应。

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

闽ICP备14008679号