基于STM32F030驱动MQ7一氧化碳传感器

目的

了解一氧化碳传感器 MQ7 的驱动原理,通过配置 STM32F030 的GPIO及外设ADC和DMA,采集一氧化碳浓度数据。

原理

MQ-7气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。采用高低温循环检测方式低温(1.5v加热)检测一氧化碳,高温(5.0v加热)清洗低温时吸附的杂散气体,传感器的电导率随空气中一氧化碳气体浓度增加而增大,使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。

MQ-7气体传感器对一氧化碳的灵敏度高,这种传感器可检测多种含一氧化碳的气体,是一款适合多种应用的低成本传感器。

MQ-7标准工作条件:

 MQ-7灵敏度特性曲线:

 根据曲线表可以列出部分Rs/R0与ppm的对应值,如下:

Rs/R0

1.6

1

0.6

0.46

0.39

0.28

0.21

ppm

50

100

200

300

400

600

1000

根据以上对应值可以求出Rs/R0与ppm的计算公式,如下:

ppm = 98.322f * pow(Rs/R0, -1.458f)

传感器的表面电阻Rs,是通过与其串联的负载电阻RL上的有效电压信号VRL输出而获得的。二者之间的关系为:

Rs/RL = (Vc - VRL) / VRL

ppm:为一氧化碳的浓度。

VRL:电压输出值。

Rs:器件在不同气体,不同浓度下的电阻值。

R0:器件在洁净空气中的电阻值。

RL:负载电阻阻值。

 步骤

  • 新建一个库函数工程。
  • 在工程中新建两个文件分别命名为sensor_co.c和sensor_co.h,并将sensor_co.c文件保存在该工程文件夹中,并添加sensor_co.h文件路径。
  • 在工程中添加ADC、DMA、滴答定时器以及串口的初始化文件(具体初始化函数请参考源码)。
  • 在sensor_co.c文件中添加相应头文件。
#include "sensor_co.h" 
#include "bsp_adc.h"
#include "bsp_adc_dma.h"
#include "math.h"
#include "bsp_systick.h"
  • 在sensor_co.c文件中定义几个常量,同时定义MQ7_Init ()传感器初始化函数,函数中分别调用ADC和DMA初始化函数
#define CAL_PPM  10  // 校准环境中PPM值
#define RL	      10  // RL阻值
static float R0; // 元件在洁净空气中的阻值
// 传感器初始化
void MQ7_Init(void)
{
	ADC1_Init();
	ADC_DMA_Init();
	SYSTICK_DelayUs(3000000);
	MQ7_PPM_Calibration();
}
  • 在sensor_co.c文件中定义传感器校准函数。
// 传感器校准函数,根据当前环境PPM值与测得的RS电压值,反推出R0值
void MQ7_PPM_Calibration(float RS)
{
	float Vrl = 3.3f * ADC_Value / 4095.f;
	float RS = (3.3f - Vrl) / Vrl * RL;
	R0 = RS / pow(CAL_PPM / 98.322, 1 / -1.458f);
}
  • 在sensor_co.c文件中添加MQ7数据处理函数MQ7_GetPPM (),函数内容如下:
// 获取传感器的值
float MQ7_GetPPM(void)
{
	float Vrl = 3.3f * ADC_Value / 4095.f;
	float RS = (3.3f - Vrl) / Vrl * RL;
	float ppm = 98.322f * pow(RS/R0, -1.458f);
	return  ppm;
}
  • 在sensor_co.h文件中进行函数声明。
#ifndef _SENSOR_CO_H_
#define _SENSOR_CO_H_

#include "stm32f0xx.h"
	
void  MQ7_Init(void);
void  MQ7_PPM_Calibration(void);
float MQ7_GetPPM(void);

#endif
  • 在main.c文件中的main ()函数中调用函数。

第一步:引用头文件。

第二步:在main ()函数中初始化传感器、串口以及滴答定时器。

第三步:在while循环中通过MQ7_GetPPM ()函数计算一氧化碳的浓度,最后调用printf ()函数通过串口发送出去。

#include "sensor_co.h"
#include "bsp_systick.h"
#include "bsp_adc.h" 
#include "bsp_usart.h" 
#include <stdio.h>

int main()
{
	SYSTICK_Init(1); // 滴答定时器初始化
	USART1_Init();// 串口初始化
	MQ7_Init();	// 传感器初始化	
	while(1)
	{
	    printf("CO:%.2f ppm\n", MQ7_GetPPM()); // 计算一氧化碳浓度并通过串口打印
	    SYSTICK_DelayMs(500);
	}
}

现象

将程序下载到开发板中,等待传感器初始化后,看到串口调试助手打印出一氧化碳的浓度。

 更多交流欢迎关注作者抖音号:81849645041​​​​​​

  • 11
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奚海蛟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值