【GD32】MQ-5液化气检测传感器

news2024/11/24 17:28:09

2.33 MQ-5液化气检测传感器

MQ-5气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sno2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为该气体浓度相对应的输出信号。MQ-5气体传感器对丁烷、丙烷、甲烷的灵敏度高,对甲烷和丙烷可较好的兼顾。这种传感器可检测多种可燃性气体,特别是天然气,是一款适合多种应用的低成本传感器。

2.33.1 模块来源

采购链接:
Risym MQ-5液化气 天然气 城市煤气传感器模块
资料下载链接:
https://pan.baidu.com/s/1B8WhPIzTmWwQsFFVayRpAA?pwd=9966
资料提取码:9966

2.33.2 规格参数

工作电压:3.3V-5V
工作电流:150MA
输出方式: DO接口为数字量输出 AO接口为模拟量输出
读取方式:ADC
管脚数量:4 Pin(2.54mm间距排针)

2.33.3 移植过程

我们的目标是在梁山派GD32F470上能够判断当前环境状况的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。

2.33.3.1 查看资料

MQ-5气体传感器对丁烷、丙烷、甲烷灵敏度高,对甲烷和丙烷可较好的兼顾,这种传感器可检测多种可燃性气体,特别是液化气(丙烷),是一款适合多种应用的低成本传感器。
在这里插入图片描述
其对应的原理图见图2.33.3.1-2,AO输出为MQ-5传感器直接输出的电压,所以为模拟量;DO为经过LM393进行电压比较后,输出高低电平,所以为数字量。具体原理见光敏电阻光照传感器章节的2.3.3.1 查看资料。
在这里插入图片描述
因此DO引脚可以配置为GPIO的输入模式,AO引脚需要配置为ADC模拟输入模式。
在这里插入图片描述

2.33.3.2 引脚选择

想要使用ADC,需要确定使用的引脚是否有ADC外设功能。可以通过数据手册

在数据手册的第28页结尾,是关于GD32F450Zx系列芯片引脚的功能定义示意图。在这里插入图片描述
当前只有AO引脚需要使用到ADC接口,所以DO引脚可以使用开发板上其他的GPIO。这里选择使用PC1的附加ADC功能。使用ADC0的第11道输入通道。在这里插入图片描述

在这里插入图片描述

2.33.3.3 移植至工程

移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_mq5.c与bsp_mq5.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件bsp_mq5.c中,编写如下代码。

/********************************************************************************
  * 文 件 名: bsp_mq5.c
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2023年5月6日
  * 功能介绍:          
  ******************************************************************************
  * 注意事项:
*********************************************************************************/


#include "bsp_mq5.h"
#include "systick.h"


 //DMA缓冲区
uint16_t gt_adc_val[ SAMPLES ][ CHANNEL_NUM ]; 


/******************************************************************
 * 函 数 名 称:ADC_DMA_Init
 * 函 数 说 明:初始化ADC+DMA功能
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void ADC_DMA_Init(void)
{
    /* DMA初始化功能结构体定义 */
    dma_single_data_parameter_struct dma_single_data_parameter;
        
        /* 使能引脚时钟 */
    rcu_periph_clock_enable(RCU_MQ5_GPIO_AO);                    
        rcu_periph_clock_enable(RCU_MQ5_GPIO_DO); 
        /* 使能ADC时钟 */
    rcu_periph_clock_enable(RCU_MQ5_ADC);                
  
        /* 使能DMA时钟 */
        rcu_periph_clock_enable(RCU_MQ5_DMA);
 
        /*        配置ADC时钟        */ 
    adc_clock_config(ADC_ADCCK_PCLK2_DIV4);        
   /*        配置DO为输入模式        */
    gpio_mode_set(PORT_MQ5_DO, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_MQ5_DO); 
        /*        配置AO为浮空模拟输入模式        */
    gpio_mode_set(PORT_MQ5_AO, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_MQ5_AO); // PC1 : ADC012_IN11 
 
        /*        配置ADC为独立模式        */
    adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);
        
    /*        使能连续转换模式        */
    adc_special_function_config(PORT_ADC, ADC_CONTINUOUS_MODE, ENABLE);
         
    /*        使能扫描模式        */
    adc_special_function_config(PORT_ADC, ADC_SCAN_MODE, ENABLE);
   
        /*        数据右对齐        */        
    adc_data_alignment_config(PORT_ADC, ADC_DATAALIGN_RIGHT);
    
    /*        ADC0设置为规则组  一共使用 CHANNEL_NUM 个通道                */  
    adc_channel_length_config(PORT_ADC, ADC_REGULAR_CHANNEL, CHANNEL_NUM);
                
    /*        ADC规则通道配置:ADC0的通道11的扫描顺序为0;采样时间:15个周期                */  
        /*        DMA开启之后 gt_adc_val[x][0] = PC1的数据   */
    adc_regular_channel_config(PORT_ADC, 0, CHANNEL_ADC, ADC_SAMPLETIME_15);//PC1
 
        /*        ADC0设置为12位分辨率                */  
        adc_resolution_config(PORT_ADC, ADC_RESOLUTION_12B); 
        
        /*        ADC外部触发禁用, 即只能使用软件触发                */  
    adc_external_trigger_config(PORT_ADC, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_DISABLE);
    
    /*        使能规则组通道每转换完成一个就发送一次DMA请求                */  
    adc_dma_request_after_last_enable(PORT_ADC);  
    
        /*        使能DMA请求                */  
        adc_dma_mode_enable(PORT_ADC);
    
        /*        使能DMA                */          
        adc_enable(PORT_ADC);
    
        /*        等待ADC稳定                */  
        delay_1ms(1);
    
        /*        开启ADC自校准                */
    adc_calibration_enable(PORT_ADC); 
 
    /*        清除 DMA通道0 之前配置         */
    dma_deinit(PORT_DMA, CHANNEL_DMA);
   
        /*        DMA初始化配置         */
        dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(PORT_ADC));         //设置DMA传输的外设地址为ADC0基地址
        dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;                         //关闭外设地址自增
        dma_single_data_parameter.memory0_addr = (uint32_t)(gt_adc_val);                         //设置DMA传输的内存地址为 gt_adc_val数组
        dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;                         //开启内存地址自增(因为不止一个通道)
        dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;             //传输的数据位 为 16位
        dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;                                         //DMA传输方向为 外设往内存
        dma_single_data_parameter.number = SAMPLES * CHANNEL_NUM;                                     //传输的数据长度为:每个通道采集30次 * 1个通道
        dma_single_data_parameter.priority = DMA_PRIORITY_HIGH;                                                 //设置高优先级
        dma_single_data_mode_init(PORT_DMA, CHANNEL_DMA, &dma_single_data_parameter);//将配置保存至DMA1的通道0
        
        /*        DMA通道外设选择                */
        /*        数据手册的195页根据PERIEN[2:0]值确定第三个参数,例是100 则为DMA_SUBPERI4          例是010 则为DMA_SUBPERI2         */
        /*        我们是ADC0功能,PERIEN[2:0]值为000,故为DMA_SUBPERI0                */
        dma_channel_subperipheral_select(PORT_DMA, CHANNEL_DMA, DMA_SUBPERI0);
 
        /*        使能DMA1通道0循环模式                */
        dma_circulation_enable(PORT_DMA, CHANNEL_DMA);
 
        /*        启动DMA1的通道0功能                */
        dma_channel_enable(PORT_DMA, CHANNEL_DMA); 
        
        /*        开启软件触发ADC转换                */
        adc_software_trigger_enable(PORT_ADC, ADC_REGULAR_CHANNEL); 
}
 

/******************************************************************
 * 函 数 名 称:Get_Adc_Dma_Value
 * 函 数 说 明:对DMA保存的数据进行平均值计算后输出
 * 函 数 形 参:CHx 第几个扫描的数据
 * 函 数 返 回:对应扫描的ADC值
 * 作       者:LC
 * 备       注:无
******************************************************************/
unsigned int Get_Adc_Dma_Value(char CHx)
{
        unsigned char i = 0;
        unsigned int AdcValue = 0;
    
    /* 因为采集 SAMPLES 次,故循环 SAMPLES 次 */
        for(i=0; i< SAMPLES; i++)
        {
        /*    累加    */
                AdcValue+=gt_adc_val[i][CHx];
        }
    /* 求平均值 */
        AdcValue=AdcValue / SAMPLES;
    
        return AdcValue;
}

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

/******************************************************************
 * 函 数 名 称:Get_MQ5_DO_value
 * 函 数 说 明:获取MQ5DO引脚的电平状态
 * 函 数 形 参:无
 * 函 数 返 回:0=未检测到高于灵敏度的可燃气体值 1=检测到高于灵敏度的可燃气体值
 * 作       者:LC
 * 备       注:调整模块上的滑动电阻即可调整灵敏度
******************************************************************/
char Get_MQ5_DO_value(void)
{
    if( gpio_input_bit_get(PORT_MQ5_DO,GPIO_MQ5_DO) == RESET )
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

在文件bsp_mq5.h中,编写如下代码。

#ifndef _BSP_MQ5_H_
#define _BSP_MQ5_H_
 
#include "gd32f4xx.h"
 
 
#define RCU_MQ5_GPIO_AO    RCU_GPIOC
#define RCU_MQ5_GPIO_DO    RCU_GPIOF

#define RCU_MQ5_ADC     RCU_ADC0
#define RCU_MQ5_DMA     RCU_DMA1

#define PORT_DMA        DMA1
#define CHANNEL_DMA     DMA_CH0

#define PORT_ADC     ADC0
#define CHANNEL_ADC     ADC_CHANNEL_11

#define PORT_MQ5_AO     GPIOC
#define GPIO_MQ5_AO     GPIO_PIN_1

#define PORT_MQ5_DO     GPIOF
#define GPIO_MQ5_DO     GPIO_PIN_11

 //采样次数
#define SAMPLES         30
//采样通道数 
#define CHANNEL_NUM     1


extern uint16_t gt_adc_val[ SAMPLES ][ CHANNEL_NUM ];  //DMA缓冲区
 

void ADC_DMA_Init(void);
unsigned int Get_Adc_Dma_Value(char CHx);
unsigned int Get_MQ5_Percentage_value(void);
char Get_MQ5_DO_value(void);

#endif

2.33.4 移植验证

在自己工程中的main主函数中,编写如下。

/********************************************************************************
  * 文 件 名: main.c
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2022年05月06日
  * 功能介绍:          
  ******************************************************************************
  * 开发板官网:www.lckfb.com        
*********************************************************************************/

#include "gd32f4xx.h"
#include "systick.h"
#include "bsp_usart.h"
#include "bsp_mq5.h"
#include "stdio.h"

int main(void)
{
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);  // 优先级分组
        systick_config();                //滴答定时器初始化 1ms
    ADC_DMA_Init();
    usart_gpio_config(115200U);
    printf("ADC+DMA demo start\r\n");
    while(1)
    {        
        printf("%d%%\r\n", Get_MQ5_Percentage_value() );
        delay_1ms(1000);
    }
}

移植现象:输出换算后的可燃气体浓度百分比。

在这里插入图片描述
移植成功示例,见文件2.33.4-1 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1591615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ExpressLRS硬件实测性能分析

ExpressLRS硬件实测性能分析 1. 源由2. 远航测试3. 实验室测试3.1 芯片RSSI与实测功率差异3.2 SNR信噪比稳定3.3 140db衰减器衰减&#xff0c;40个频点信号稳定 4. 外场测试4.1 无屏蔽样品4.2 有屏蔽样品4.3 有屏蔽vs无屏蔽样品 5. 估算6. 总结7. 补充说明 -- 50mW视频 1. 源由…

1.3 字符设备驱动

1、字符设备驱动工作原理 2、file_operations结构体 struct file_operations { struct module *owner; //拥有该结构的模块的指针&#xff0c;一般为THIS_MODULES loff_t (*llseek) (struct file *, lof…

【日常记录】【CSS】生成动态气泡小球

文章目录 1、分析2、实现 1、分析 核心有两点&#xff0c;通过这两个不一样就可以实现每个小球的颜色、动画时间不一致 给每个元素都设置一个css 变量 bgc 用于控制每一个小球的颜色给每个元素都设置一个css 变量 duration 用于控制每一个小球的时间 2、实现 <!DOCTYPE ht…

java中的线程通讯和线程池,Callable任务

线程通讯&#xff1a; 在多线程中&#xff0c;某个线程进入“等待状态”时&#xff0c;需要某个线程来唤醒 等待方法&#xff1a; wait()//无线等待 wait(long 毫秒)//计时等待 注意&#xff0c;调用wait方法&#xff0c;会自动释放掉锁资源 处于wait状态只能由其他线程唤醒 唤…

信创产品适配的前因后果

“信创”的本意是指“信息技术应用创新”。这个概念最早来源于“信创工委会”&#xff08;信息技术应用创新工作委员会&#xff09;&#xff0c;一个由24家专业从事软硬件关键技术研究及应用的国内单位&#xff0c;在2016年共同发起成立的非营利性社会组织。近些年来&#xff0…

GitHub repository - commits - branches - releases - contributors

GitHub repository - commits - branches - releases - contributors 1. commits2. branches3. releases4. contributorsReferences 1. commits 在这里可以查看当前分支的提交历史。左侧的数字表示提交数。 2. branches 可以查看仓库的分支列表。左侧的数字表示当前拥有的分…

android studio 网络请求okhttp3、okgo

一、在build.gradle文件里添加 implementation com.squareup.okhttp3:okhttp:4.9.0 implementation com.squareup.okhttp3:okhttp:3.12.0 implementation com.squareup.okio:okio:1.17.4 implementation com.lzy.net:okgo:3.0.4 implementation com.alibaba:fastjson:1.2.57 i…

25、链表-环形链表

思路&#xff1a; 这道题就是判断链表中是否有环&#xff0c;首先使用集合肯定可以快速地解决&#xff0c;比如通过一个set集合遍历&#xff0c;如果遍历过程中有节点在set中已经存在那么说明存在环。 第二种方式就是通过快慢指针方式寻找环。具体思路就是一个慢指针每次直走一…

Android适配平板屏幕尺寸

一、划分手机和平板 人为判断方法: 大于6英寸的就是平板。小于6英寸的都是手机 平板尺寸&#xff1a; 6英寸、7英寸、10英寸、14英寸… Android系统支持多配置资源文件&#xff0c;我们可以追加新的资源目录到你的Android项目中。命名规范&#xff1a; 资源名字-限制符 l…

2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现&#xff1a; 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值&#xff0c;不仅对中国文…

Go程序设计语言 学习笔记 第十一章 测试

1949年&#xff0c;EDSAC&#xff08;第一台存储程序计算机&#xff09;的开发者莫里斯威尔克斯在他的实验室楼梯上攀登时突然领悟到一件令人震惊的事情。在《一位计算机先驱的回忆录》中&#xff0c;他回忆道&#xff1a;“我突然完全意识到&#xff0c;我余生中的很大一部分时…

2024妈妈杯mathorcup数学建模C题 物流网络分拣中心货量预测及人员排班

一、数据预处理 数据清洗是指对数据进行清洗和整理&#xff0c;包括删除无效数据、缺失值填充、异常值检测和处理等。数据转换是指对数据进行转换和变换&#xff0c;包括数据缩放、数据归一化、数据标准化等。数据整理是指对数据进行整理和归纳&#xff0c;包括数据分组、数据聚…

一文读懂Java中的WebEndpointProperties类(附Demo)

目录 前言1. 基本知识2. Demo3. 彩蛋 前言 对于Java的相关知识&#xff0c;推荐阅读&#xff1a;java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09; 1. 基本知识 Spring Boot 的配置类 WebEndpointProperties&#xff0c;用于配置 Web 端…

【python】基于pyttsx3库的字符串转音频文件

一、源码 import pyttsx3 engine pyttsx3.init() engine.setProperty(volume, 0.8) engine.setProperty(rate, 150) engine.save_to_file("Hello, World!", "output.mp3") engine.runAndWait()二、介绍 使用pyttsx3库&#xff0c;设置声音与速率&#x…

RTR3学习笔记

目录 引言第二章、图形渲染管线2.1 图形渲染管线架构概述&#xff08;1&#xff09;渲染管线的主要功能&#xff08;2&#xff09;渲染结果是由输入对象相互作用产生的&#xff08;3&#xff09;图像渲染管线的三个阶段&#xff08;4&#xff09;其他讨论 2.2 应用程序阶段&…

SpringBoo利用 MDC 机制过滤出单次请求相关的日志

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.MDC 是什么 3.代码实战 4.总结 1.前言 在服务出现故障时&#xff…

Composer 安装与配置

Composer 是 PHP 领域中非常重要的一个工具&#xff0c;它作为 PHP 的依赖管理工具&#xff0c;帮助开发者定义、管理、安装项目所依赖的外部库。Composer 的出现极大地简化了 PHP 项目的构建和管理过程&#xff0c;使得开发者可以更加专注于代码的编写和功能的实现。 Compose…

matlab使用教程(42)—常见的二维图像绘制方法

这个博客用于演示如何在 MATLAB 中创建曲线图、条形图、阶梯图、误差条形图、极坐标图、针状图、散点图。 1.曲线图 plot 函数用来创建 x 和 y 值的简单线图。 x 0:0.05:5; y sin(x.^2); figure plot(x,y) 运行结果&#xff1a; 线图可显示多组 x 和 y 数据。 x 0:0.05:…

气膜建筑的优势与应用—轻空间为您解答

气膜建筑作为一种利用气膜材料构建主体结构的建筑形式&#xff0c;在现代建筑领域日益受到关注。轻空间将介绍气膜建筑的优势以及其在不同领域的应用。 1. 轻便灵活&#xff1a; 气膜建筑采用轻质材料&#xff0c;相比传统建筑更为轻便&#xff0c;从而减轻了基础负荷和运输成本…

day05-Elasticsearch01

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch 是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在 GitHub 搜索代码在电商网站搜索商品在百度搜索答案在打…