【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,表示给定数字的个数。 第二…...
从巨鲸到万物生长:Claude Code如何颠覆AI开发,带你从对话走向Agent平台搭建!
Claude Code凭借其六大核心能力,将AI开发带入全新阶段。通过CLAUDE.md实现项目记忆增强,Skills固化可复用工作流,Sub-Agent处理专业化任务,MCP连接外部服务,Plug-In打包完整解决方案。本文深入解析这些功能,…...
ColorMemLCD电子纸驱动库:面向LPM013M126A的嵌入式低功耗显示方案
1. ColorMemLCD 库概述ColorMemLCD 是一款专为 JDI(Japan Display Inc.)LPM013M126A 型彩色内存式 LCD 显示模块设计的嵌入式图形驱动库。该库并非从零构建,而是继承自 ARM mbed OS 生态中广泛使用的GraphicDisplay抽象基类,延续了…...
一文搞懂训练大模型的数据怎么准备!
谈到大模型,很多人第一反应都是模型参数大、算力强,但其实数据才是大模型真正的底座。没有足够大、足够干净的数据,再先进的模型也发挥不出威力。今天就从数据层面,把大模型训练的几个关键环节梳理清楚。 数据采集与清洗 大模型训…...
asp毕业设计下载(全套源码+配套论文)——基于asp+access的办公系统设计与实现
基于aspaccess的办公系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspaccess的办公系统设计与实现,更多精选毕业设计项目实例见文末哦。 文章目录: 基于aspaccess的办公系统设计与实现(毕…...
戴尔Precision Pro商务笔记本回归,新一代产品聚焦便携性
看起来2026年是戴尔按下重启键的一年——在消费者和商用产品线中,戏剧性的品牌重塑都在被回归。有时候,老品牌确实是好品牌:熟悉的XPS名称和设计今年回归是有原因的,绝对不是因为戴尔Premium有正面的品牌认知度。在戴尔商务产品方…...
小红书笔记API避坑指南:数据结构解析与常见错误排查
小红书笔记API避坑指南:数据结构解析与常见错误排查 在小红书生态中,API作为连接开发者与平台数据的桥梁,其重要性不言而喻。但许多开发者在实际调用过程中,常常陷入数据结构理解不透、错误排查效率低下的困境。本文将从小红书笔记…...
保姆级教程:用 Modelfile 快速部署 ModelScope 的 GGUF 模型到 Ollama(以 DeepSeek 为例)
从零到一:用Modelfile高效部署ModelScope的GGUF模型至Ollama实战指南 在本地运行大语言模型正成为开发者探索AI边界的新常态。不同于直接调用云端API,本地部署能带来数据隐私保障、响应速度提升以及模型深度定制等独特优势。Ollama作为轻量级模型运行框架…...
电工必看:正弦交流电路中的相量法实战技巧(附计算示例)
电工必看:正弦交流电路中的相量法实战技巧(附计算示例) 在电气工程领域,正弦交流电路的分析是每位电工和电气工程师必须掌握的核心技能。面对复杂的电路计算,传统的三角函数解析法往往让从业者陷入繁琐的运算泥潭。相量…...
别再只调参了!深入RepVgg设计思想,用CCFF模块优化你的模型特征融合效率
深入解析CCFF模块:用RepVgg思想重构跨尺度特征融合技术 在计算机视觉领域,特征融合一直是提升模型性能的关键环节。传统方法如FPN、PANet虽然有效,但在实时性要求高的场景下往往成为计算瓶颈。今天我们要探讨的CCFF(Cross-scale C…...
基于Matlab的大气信道仿真:MIE理论在雨中光衰减计算的实践
152.基于matlab的大气信道的仿真程序。 MIE理论计算光在雨中的衰减。 前项递推法或者直接计算贝塞尔函数在计算雨这种吸收性大颗粒,自变量太大而产生溢出,限制mie计算范围,用MIE散射理论,计算单球粒子对平面光波的散射。 程序已调…...
