MQ135在STM32中的使用

一、简介

        MQ135气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2 )。当传感器所处环境中存在污染气体时,传感器的电导率随空气中污染气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
        MQ135传感器对氨气、硫化物、苯系蒸汽的灵敏度高,对烟雾和其它有害的监测也很理想。这种传感器可检测多种有害气体,是一款适合多种应用的低成本传感器。
  • 特点:在较宽的浓度范围内对有害气体有良好的灵敏度,对氨、硫化物、苯系等气氛灵敏度较高,长寿命、低成本,且简单的驱动电路即可。
  • 应用: 家庭用空气污染报警器、工业用空气污染控制器、便携式空气污染检测器。

规格参数和图片如下所示:

工作电压: 3.3V**-**5V

工作电流: 150MA

输出方式: DO 接口为数字量输出 AO 接口为模拟量输出

读取方式: ADC

管脚数量: 4 Pin(2.54mm 间距排针)

嘉立创介绍:MQ-135 空气质量传感器 | 立创开发板技术文档中心

MQ135在STM32中的使用_第1张图片

#include "bsp_mq135.h"
#include "board.h"

/******************************************************************
 * 函 数 名 称:ADC_MQ135_Init
 * 函 数 说 明:初始化ADC功能
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void ADC_MQ135_Init(void)
{
        RCC_AHB1PeriphClockCmd (RCC_MQ135_GPIO_AO, ENABLE); // 使能时钟
        RCC_AHB1PeriphClockCmd (RCC_MQ135_GPIO_DO, ENABLE); // 使能时钟
        RCC_APB2PeriphClockCmd (RCC_MQ135_ADC, ENABLE); // 使能ADC时钟

        GPIO_InitTypeDef  GPIO_InitStructure; // GPIO配置结构体

        GPIO_InitStructure.GPIO_Pin = GPIO_MQ135_AO;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;    //模拟输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

        GPIO_Init(PORT_MQ135_AO, &GPIO_InitStructure); // 初始化GPIO

        GPIO_InitStructure.GPIO_Pin = GPIO_MQ135_DO;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;    //输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

        GPIO_Init(PORT_MQ135_DO, &GPIO_InitStructure); // 初始化GPIO

        /* ADC公共配置 */
        ADC_CommonInitTypeDef ADC_CommonInitStruct; // ADC公共配置结构体

        ADC_DeInit();//ADC复位

        ADC_CommonInitStruct.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled;
        ADC_CommonInitStruct.ADC_Mode=ADC_Mode_Independent;
        ADC_CommonInitStruct.ADC_Prescaler=ADC_Prescaler_Div4;
        ADC_CommonInitStruct.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;

        ADC_CommonInit(&ADC_CommonInitStruct);

        /* ADC特定配置 */
        ADC_InitTypeDef ADC_InitStruct; // ADC特定配置结构体

        ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
        ADC_InitStruct.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;
        ADC_InitStruct.ADC_NbrOfConversion=1;
        ADC_InitStruct.ADC_Resolution=ADC_Resolution_12b;
        ADC_InitStruct.ADC_ScanConvMode = DISABLE;

        ADC_Init(PORT_ADC, &ADC_InitStruct);

        //设置采集通道
        ADC_RegularChannelConfig( PORT_ADC, CHANNEL_ADC, 1, ADC_SampleTime_480Cycles );

        //ADC使能
        ADC_Cmd(PORT_ADC, ENABLE);
}


/******************************************************************
 * 函 数 名 称:Get_Adc_MQ135_Value
 * 函 数 说 明:
 * 函 数 形 参:
 * 函 数 返 回:对应扫描的ADC值
 * 作       者:LC
 * 备       注:无
******************************************************************/
unsigned int Get_Adc_MQ135_Value(void)
{
        uint32_t Data = 0;

        //开始软件转换
        ADC_SoftwareStartConv(PORT_ADC);

        while(!ADC_GetFlagStatus(PORT_ADC, ADC_FLAG_EOC )); // 等待转换结束

        for(int i = 0; i < SAMPLES; i++)
        {
                        Data += ADC_GetConversionValue(PORT_ADC);

                        delay_ms(5);
        }

        Data = Data / SAMPLES;

        return Data;
}

/******************************************************************
 * 函 数 名 称:Get_MQ135_Percentage_value
 * 函 数 说 明:读取MQ135值,并且返回百分比
 * 函 数 形 参:无
 * 函 数 返 回:返回百分比
 * 作       者:LC
 * 备       注:无
******************************************************************/
unsigned int Get_MQ135_Percentage_value(void)
{
    int adc_max = 4095;
    int adc_new = 0;
    int Percentage_value = 0;

    adc_new = Get_Adc_MQ135_Value();

    Percentage_value = ((float)adc_new / (float)adc_max) * 100.f;
    return Percentage_value;
}

/******************************************************************
 * 函 数 名 称:Get_MQ135_DO_value
 * 函 数 说 明:获取MQ135DO引脚的电平状态
 * 函 数 形 参:无
 * 函 数 返 回:0=未检测到高于灵敏度的值 1=检测到高于灵敏度的值
 * 作       者:LC
 * 备       注:调整模块上的滑动电阻即可调整灵敏度
******************************************************************/
char Get_MQ135_DO_value(void)
{
    if( GPIO_ReadInputDataBit(PORT_MQ135_DO, GPIO_MQ135_DO) == RESET )
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
#ifndef _BSP_MQ135_H_
#define _BSP_MQ135_H_

#include "stm32f4xx.h"


#define RCC_MQ135_GPIO_AO    RCC_AHB1Periph_GPIOC
#define RCC_MQ135_GPIO_DO    RCC_AHB1Periph_GPIOA

#define RCC_MQ135_ADC        RCC_APB2Periph_ADC1


#define PORT_ADC             ADC1
#define CHANNEL_ADC          ADC_Channel_11

#define PORT_MQ135_AO        GPIOC
#define GPIO_MQ135_AO        GPIO_Pin_1

#define PORT_MQ135_DO        GPIOA
#define GPIO_MQ135_DO        GPIO_Pin_1

 //采样次数
#define SAMPLES         30


void ADC_MQ135_Init(void);
unsigned int Get_Adc_MQ135_Value(void);
unsigned int Get_MQ135_Percentage_value(void);
char Get_MQ135_DO_value(void);

#endif
#include "board.h"
#include "bsp_uart.h"
#include 
#include "bsp_mq135.h"

int main(void)
{

    board_init();

    uart1_init(115200U);

    ADC_MQ135_Init();
    printf("ADC Demo Start\r\n");
    while(1)
    {
        printf("空气质量 = %d%%\r\n\n", Get_MQ135_Percentage_value() );
        delay_ms(1000);
    }
}

你可能感兴趣的:(STM32中的模块使用,stm32,嵌入式硬件,单片机)