MQ-3酒精检测传感器​

MQ-3酒精检测传感器​

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

模块来源 ​采购链接:https://detail.tmall.com/item.htm?abbucket=0&id=695089814069&ns=1&spm=a21n57.1.0.0.5668523c1NVcMb 资料下载链接:https://pan.baidu.com/s/1B8WhPIzTmWwQsFFVayRpAA?pwd=9966 资料提取码:9966

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

移植过程 ​我们的目标是在立创开发板GD32E230C8T6上能够判断当前环境状况的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。

查看资料 ​MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器。

其对应的原理图见图2.31.3.1-2,AO输出为MQ-3传感器直接输出的电压,所以为模拟量;DO为经过LM393进行电压比较后,输出高低电平,所以为数字量。

因此DO引脚可以配置为GPIO的输入模式,AO引脚需要配置为ADC模拟输入模式。

引脚选择 ​想要使用ADC,需要确定使用的引脚是否有ADC外设功能。可以通过数据手册【GD32E230xx_Datasheet_Rev2.3.pdf】进行查看。

在数据手册的第19页,是关于GD32E230Cx系列芯片引脚的功能定义示意图。

这里选择使用PA1的附加ADC功能。使用ADC0的第1道输入通道。

移植至工程 ​移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_mq3.c与bsp_mq3.h。移植完成后面修改相关代码。

详细可见【TTP224触摸传感器】中的移植至工程目录(点我查看)。这里不再过多讲述。移植完成后面修改相关代码。

在文件bsp_mq3.c中,编写如下代码。

c/********************************************************************************

* 文 件 名: bsp_mq3.c

* 版 本 号: 初版

* 修改作者: LC

* 修改日期: 2023年5月6日

* 功能介绍:

******************************************************************************

* 注意事项:

*********************************************************************************/

#include "bsp_mq3.h"

#include "systick.h"

#include "stdio.h"

//DMA缓冲区

uint16_t gt_adc_val[][];

/******************************************************************

* 函 数 名 称:ADC_DMA_Init

* 函 数 说 明:初始化ADC+DMA功能

* 函 数 形 参:无

* 函 数 返 回:无

* 作 者:LC

* 备 注:无

******************************************************************/

void ADC_DMA_Init(void)

{

/* DMA初始化功能结构体定义 */

dma_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时钟 */

rcu_adc_clock_config(RCU_ADCCK_APB2_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);

/* 清除 DMA通道0 之前配置 */

dma_deinit(CHANNEL_DMA);

/* DMA初始化配置 */

dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA); //设置DMA传输的外设地址为ADC0基地址

dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; //关闭外设地址自增

dma_single_data_parameter.memory_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_width = DMA_PERIPHERAL_WIDTH_16BIT;

dma_single_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;

dma_single_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; //DMA传输方向为 外设往内存

dma_single_data_parameter.number = SAMPLES * CHANNEL_NUM; //传输的数据长度为:每个通道采集30次 * 1个通道

dma_single_data_parameter.priority = DMA_PRIORITY_HIGH; //设置高优先级

dma_init(CHANNEL_DMA, &dma_single_data_parameter);//将配置保存至DMA1的通道0

/* 使能DMA1通道0循环模式 */

dma_circulation_enable(CHANNEL_DMA);

/* 启动DMA1的通道0功能 */

dma_channel_enable(CHANNEL_DMA);

/* 配置ADC为独立模式 */

//adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);

/* 使能连续转换模式 */

adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE);

/* 使能扫描模式 */

adc_special_function_config(ADC_SCAN_MODE, ENABLE);

/* 数据右对齐 */

adc_data_alignment_config(ADC_DATAALIGN_RIGHT);

/* ADC0设置为规则组 一共使用 CHANNEL_NUM 个通道 */

adc_channel_length_config(ADC_REGULAR_CHANNEL, CHANNEL_NUM);

/* ADC规则通道配置:ADC0的通道11的扫描顺序为0;采样时间:15个周期 */

/* DMA开启之后 gt_adc_val[][] = PC1的数据 */

adc_regular_channel_config(0, CHANNEL_ADC, ADC_SAMPLETIME_13POINT5);

/* ADC0设置为12位分辨率 */

adc_resolution_config(ADC_RESOLUTION_12B);

/* ADC外部触发禁用, 即只能使用软件触发 */

adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);

adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);

/* 使能规则组通道每转换完成一个就发送一次DMA请求 */

//adc_dma_request_after_last_enable(PORT_ADC);

/* DMA通道外设选择 */

/* 数据手册的195页根据PERIEN[]值确定第三个参数,例是100 则为DMA_SUBPERI4 例是010 则为DMA_SUBPERI2 */

/* 我们是ADC0功能,PERIEN[]值为000,故为DMA_SUBPERI0 */

//dma_channel_subperipheral_select(PORT_DMA, CHANNEL_DMA, DMA_SUBPERI0);

/* 使能DMA */

adc_enable();

/* 等待ADC稳定 */

delay_1ms(1);

/* 开启ADC自校准 */

adc_calibration_enable();

/* 使能DMA请求 */

adc_dma_mode_enable();

/* 开启软件触发ADC转换 */

adc_software_trigger_enable(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[][];

}

/* 求平均值 */

AdcValue=AdcValue / SAMPLES;

printf("Value:%d\r\n",AdcValue);

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;

}

}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193在文件bsp_mq3.h中,编写如下代码。

c /******************************************************************************

* 测试硬件:立创开发板·GD32E230C8T6 使用主频72Mhz 晶振8Mhz

* 版 本 号: V1.0

* 修改作者: www.lckfb.com

* 修改日期: 2023年11月02日

* 功能介绍:

*****************************************************************************

* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源

* 开发板官网:www.lckfb.com

* 技术支持常驻论坛,任何技术问题欢迎随时交流学习

* 立创论坛:club.szlcsc.com

* 其余模块移植手册:【立创·GD32E230C8T6开发板】模块移植手册

* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!

* 不靠卖板赚钱,以培养中国工程师为己任

******************************************************************************/

#ifndef _BSP_MQ3_H_

#define _BSP_MQ3_H_

#include "gd32e23x.h"

#define RCU_MQ3_GPIO_AO RCU_GPIOA

#define RCU_MQ3_GPIO_DO RCU_GPIOB

#define RCU_MQ3_ADC RCU_ADC

#define RCU_MQ3_DMA RCU_DMA

#define PORT_DMA DMA1

#define CHANNEL_DMA DMA_CH0

#define PORT_ADC ADC

#define CHANNEL_ADC ADC_CHANNEL_1

#define PORT_MQ3_AO GPIOA

#define GPIO_MQ3_AO GPIO_PIN_1

#define PORT_MQ3_DO GPIOB

#define GPIO_MQ3_DO GPIO_PIN_1

//采样次数

#define SAMPLES 10

//采样通道数

#define CHANNEL_NUM 1

extern uint16_t gt_adc_val[][]; //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);

#endif12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455移植验证 ​在自己工程中的main主函数中,编写如下。

c /******************************************************************************

* 测试硬件:立创开发板·GD32E230C8T6 使用主频72Mhz 晶振8Mhz

* 版 本 号: V1.0

* 修改作者: www.lckfb.com

* 修改日期: 2023年11月02日

* 功能介绍:

*****************************************************************************

* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源

* 开发板官网:www.lckfb.com

* 技术支持常驻论坛,任何技术问题欢迎随时交流学习

* 立创论坛:club.szlcsc.com

* 其余模块移植手册:【立创·GD32E230C8T6开发板】模块移植手册

* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!

* 不靠卖板赚钱,以培养中国工程师为己任

******************************************************************************/

#include "gd32e23x.h"

#include "systick.h"

#include "bsp_usart.h"

#include "bsp_mq3.h"

#include "stdio.h"

int main(void)

{

systick_config(); //滴答定时器初始化 1ms

ADC_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);

}

}123456789101112131415161718192021222324252627282930313233移植现象:输出换算后的酒精浓度百分比。

文件下载

📌 资料下载中心(点击跳转)

📌 在 资料下载中心->【模块移植手册资料下载】 里面的本章节压缩包中。

相关文章

为什么PCB 上会有黑焊盘,怎么解决?
28365365bet官网

为什么PCB 上会有黑焊盘,怎么解决?

08-03 阅读: 3006
莆田系是什么意思?揭秘中国医疗行业的“莆田系”现象
魔兽盟约战役需要做多久
365dni是真的吃吗

魔兽盟约战役需要做多久

08-31 阅读: 9704
太阳镜是多少类商标
365dni是真的吃吗

太阳镜是多少类商标

08-16 阅读: 3773
方舟生存进化石制栅栏地基制作方法
365bet国际娱乐网址

方舟生存进化石制栅栏地基制作方法

09-06 阅读: 1986
最喜欢的花及其花语是什么?每朵花背后的意义解读?