【GD32】MQ-3酒精检测传感器
2.31 MQ-3酒精检测传感器
MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn0)。当传感器所处环境中存在酒精蒸气时,传感器的电导率随空气中酒精蒸气浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
2.31.1 模块来源
采购链接:
MQ-3 酒精传感器模块 乙醇易燃气敏气体高灵敏检测报警器感应探头
资料下载链接:
https://pan.baidu.com/s/1B8WhPIzTmWwQsFFVayRpAA?pwd=9966
资料提取码:9966
2.31.2 规格参数
工作电压:3.3V-5V
工作电流:150MA
输出方式: DO接口为数字量输出 AO接口为模拟量输出
读取方式:ADC
管脚数量:4 Pin(2.54mm间距排针
2.31.3 移植过程
我们的目标是在梁山派GD32F470上能够判断当前环境状况的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。
2.31.3.1 查看资料
MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器。
其对应的原理图见图2.31.3.1-2,AO输出为MQ-3传感器直接输出的电压,所以为模拟量;DO为经过LM393进行电压比较后,输出高低电平,所以为数字量。具体原理见光敏电阻光照传感器章节的2.3.3.1 查看资料。
2.31.3.2 引脚选择
想要使用ADC,需要确定使用的引脚是否有ADC外设功能。可以通过数据手册
在数据手册的第28页结尾,是关于GD32F450Zx系列芯片引脚的功能定义示意图。
当前只有AO引脚需要使用到ADC接口,所以DO引脚可以使用开发板上其他的GPIO。这里选择使用PC1的附加ADC功能。使用ADC0的第11道输入通道。
2.31.3.3 移植至工程
移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_mq3.c与bsp_mq3.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件bsp_mq3.c中,编写如下代码。
/********************************************************************************* 文 件 名: bsp_mq3.c* 版 本 号: 初版* 修改作者: LC* 修改日期: 2023年5月6日* 功能介绍: ******************************************************************************* 注意事项:
*********************************************************************************/#include "bsp_mq3.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_MQ3_GPIO_AO); rcu_periph_clock_enable(RCU_MQ3_GPIO_DO); /* 使能ADC时钟 */rcu_periph_clock_enable(RCU_MQ3_ADC); /* 使能DMA时钟 */rcu_periph_clock_enable(RCU_MQ3_DMA);/* 配置ADC时钟 */ adc_clock_config(ADC_ADCCK_PCLK2_DIV4); /* 配置DO为输入模式 */gpio_mode_set(PORT_MQ3_DO, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_MQ3_DO); /* 配置AO为浮空模拟输入模式 */gpio_mode_set(PORT_MQ3_AO, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_MQ3_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_MQ3_Percentage_value* 函 数 说 明:读取MQ3值,并且返回百分比* 函 数 形 参:无* 函 数 返 回:返回百分比* 作 者:LC* 备 注:无
******************************************************************/
unsigned int Get_MQ3_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_MQ3_DO_value* 函 数 说 明:获取MQ3DO引脚的电平状态* 函 数 形 参:无* 函 数 返 回:0=未检测到高于灵敏度的酒精值 1=检测到高于灵敏度的酒精值* 作 者:LC* 备 注:调整模块上的滑动电阻即可调整灵敏度
******************************************************************/
char Get_MQ3_DO_value(void)
{if( gpio_input_bit_get(PORT_MQ3_DO,GPIO_MQ3_DO) == RESET ){return 0;}else{return 1;}
}
在文件bsp_mq3.h中,编写如下代码。
#ifndef _BSP_MQ3_H_
#define _BSP_MQ3_H_#include "gd32f4xx.h"#define RCU_MQ3_GPIO_AO RCU_GPIOC
#define RCU_MQ3_GPIO_DO RCU_GPIOF#define RCU_MQ3_ADC RCU_ADC0
#define RCU_MQ3_DMA RCU_DMA1#define PORT_DMA DMA1
#define CHANNEL_DMA DMA_CH0#define PORT_ADC ADC0
#define CHANNEL_ADC ADC_CHANNEL_11#define PORT_MQ3_AO GPIOC
#define GPIO_MQ3_AO GPIO_PIN_1#define PORT_MQ3_DO GPIOF
#define GPIO_MQ3_DO GPIO_PIN_11//采样次数
#define SAMPLES 30
//采样通道数
#define CHANNEL_NUM 1extern 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_MQ3_Percentage_value(void);
char Get_MQ3_DO_value(void);#endif
2.31.4 移植验证
在自己工程中的main主函数中,编写如下。
/********************************************************************************* 文 件 名: main.c* 版 本 号: 初版* 修改作者: LC* 修改日期: 2023年05月06日* 功能介绍: ******************************************************************************* 注意事项:
*********************************************************************************/#include "gd32f4xx.h"
#include "systick.h"
#include "bsp_usart.h"
#include "bsp_mq3.h"
#include "stdio.h"int main(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组systick_config(); //滴答定时器初始化 1msADC_DMA_Init();usart_gpio_config(115200U);printf("ADC+DMA demo start\r\n");while(1){ printf("%d%%\r\n", Get_MQ3_Percentage_value() );delay_1ms(1000);}
}
移植现象:输出换算后的酒精浓度百分比。
移植成功示例,见文件2.31.4-1 。
相关文章:

【GD32】MQ-3酒精检测传感器
2.31 MQ-3酒精检测传感器 MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn0)。当传感器所处环境中存在酒精蒸气时,传感器的电导率随空气中酒精蒸气浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。…...

如何在极狐GitLab 启用依赖代理功能
本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何在[极狐GitLab…...

ES6中 Promise的详细讲解
文章目录 一、介绍状态特点流程 二、用法实例方法then()catchfinally() 构造函数方法all()race()allSettled()resolve()reject() 三、使用场景# 参考文献 一、介绍 Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(…...

网站建设也会涉及商标侵权,需要注意些!
以前普推知产老杨碰到建站涉及知识产权侵权的,但是大多数是其它方面的,前几天看到某同行说由于给客户建设网站,由于网站名称涉及商标被起诉要索赔几十万。 当时同行给做网站时还看了下营业执照,上面的主体名称与网站名称也是一致…...

Leetcode算法训练日记 | day25
一、组合总和Ⅲ 1.题目 Leetcode:第 216 题 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺…...

第23次修改了可删除可持久保存的前端html备忘录:增加了百度引擎
第22次修改了可删除可持久保存的前端html备忘录视频背景分离,增加了本地连接,增加了纯CSS做的折叠隐藏修改说明 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport…...

vue3中使用antv-S2表格(基础功能版)
先看展示效果: 可以调整行宽、列宽、自定义字段图标、表头图标、添加排序、显示总计、小计等 首先确保搭建一个vue3项目环境,从0开始的小伙伴着重看第一点: 一、搭建vue3项目环境 首先创建一个vue3vitets项目,可以查看下面相关…...

算数逻辑单元
目录 一、王道考研ppt总结 二、个人理解 一、王道考研ppt总结 二、个人理解 74181是一款经典的ALU 可以进行加减乘除和与或非、异或等计算;还有移位和求补等 输入有一个CU信号,即控制单元信号,有一个M信号,当M为1时,进…...

clickhouse深入浅出
基础知识原理 极致压缩率 极速查询性能 列式数据库管理 ,读请求多 大批次更新或无更新 读很多但用很少 大量的列 列的值小数值/短字符串 一致性要求低 DBMS:动态创建/修改/删除库 表 视图,动态查/增/修/删,用户粒度设库…...
TPS2041A 至 TPS2044A 、TPS2051A 至 TPS2054A
这份文件是德州仪器(Texas Instruments)关于一系列电流限制型电源分配开关的数据手册,型号包括 TPS2041A 至 TPS2044A 和 TPS2051A 至 TPS2054A。这些开关适用于可能遇到重负载电容负载和短路的应用程序。以下是该数据手册的核心内容概要&…...

Excel从零基础到高手【办公】
第1课 - 快速制作目录【上篇】第1课 - 快速制作目录【下篇】第2课 - 快速定位到工作表的天涯海角第3课 - 如何最大化显示工作表的界面第4课 - 给你的表格做个瘦身第5课 - 快速定位目标区域所在位置第6课 - 快速批量填充序号第7课 - 按自定义的序列排序第8课 - 快速删除空白行第…...

AI图书推荐:如何在课堂上使用ChatGPT 进行教育
ChatGPT是一款强大的新型人工智能,已向公众免费开放。现在,各级别的教师、教授和指导员都能利用这款革命性新技术的力量来提升教育体验。 本书提供了一个易于理解的ChatGPT解释,并且更重要的是,详述了如何在课堂上以多种不同方式…...

Redis中的集群(九)
集群 消息 集群中的各个节点通过发送和接收消息(message)来进行通信,我们称发送消息的节点为发送者(sender),接收消息 的节点成为接收者,如图所示。节点发送的消息主要有以下五种: 1.MEET消息:当发送者接到客户端发送的CLUSTER MEET命令时,…...

funasr 麦克风实时流语音识别
参考: https://github.com/alibaba-damo-academy/FunASR chunk_size 是用于流式传输延迟的配置。[0,10,5] 表示实时显示的粒度为 1060=600 毫秒,并且预测的向前信息为 560=300 毫秒。每个推理输入为 600 毫秒(采样点为 16000*0.6=960),输出为相应的文本。对于最后一个语音…...

英语学习笔记-音节划分和字母发音对照表
国际音标 音节划分 英语音节以元音为主体构成的发音单位,一般说来元音发音响亮,可以构成音节,辅音发音不响亮,不能单独构成音节 ((m] (n] [I] 例外)。 从单词拼写形式上看,有几个元字组就有几个音节 音节划分规则 长…...

使用odbc链接dm8数据库
一、环境说明 windows11 VMware Workstation 17 Pro ubuntu22.04 docker $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy因docker版本的dm8中,没有…...

开源项目one-api的k8s容器化部署(上)-- 制作镜像及部署准备
一、背景 最近需要对开源项目one-api进行k8s容器化部署,主要分以下几个步骤: 制作docker镜像申请mysql和redis数据库docker-compose部署方式k8s部署方式 整个的篇幅比较长,将会分成上下两篇来阐述。 二、制作docker镜像 开源项目one-api…...

面试-数据库基础以及MySql、ClickHost、Redis简介
面试-数据库基础以及MySql、ClickHost、Redis简介 0.数据完整性1.数据库并发控制1.1事物1.2 并发读写错误1.3 锁1.3.1 乐观锁与悲观锁1.3.2 共享锁和排他锁1.3.3 行锁与表锁1.3.4 意向锁 1.4 封锁协议与隔离级别1.5 MVCC1.5.1 概念1.5.2 当前读与快照读1.5.3 MVCC in InnoDB 2.…...

MySQL分库分表的方式有哪些
目录 一、为什么要分库分表 二、什么是分库分表 三、分库分表的几种方式 1.垂直拆分 2. 水平拆分 四、分库分表带来的问题 五、分库分表技术如何选型 一、为什么要分库分表 如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而…...
数据结构课程设计选做(一)---数字排序(哈希、排序)
2.1.1 题目内容 2.1.1-A [问题描述] 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。 2.1.1-B [基本要求] (1)输入格式: 输入的第一行包含一个整数n,表示给定数字的个数。 第二…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...