青岛做网站排名,做新媒体应该关注什么网站,wordpress加载更多文章,银川建设2.31 MQ-3酒精检测传感器
MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn0)。当传感器所处环境中存在酒精蒸气时#xff0c;传感器的电导率随空气中酒精蒸气浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。…2.31 MQ-3酒精检测传感器
MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn0)。当传感器所处环境中存在酒精蒸气时传感器的电导率随空气中酒精蒸气浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。2.31.1 模块来源
采购链接 MQ-3 酒精传感器模块 乙醇易燃气敏气体高灵敏检测报警器感应探头 资料下载链接 https://pan.baidu.com/s/1B8WhPIzTmWwQsFFVayRpAA?pwd9966 资料提取码9966
2.31.2 规格参数
工作电压3.3V-5V 工作电流150MA 输出方式: DO接口为数字量输出 AO接口为模拟量输出 读取方式ADC 管脚数量4 Pin2.54mm间距排针
2.31.3 移植过程
我们的目标是在梁山派GD32F470上能够判断当前环境状况的功能。首先要获取资料查看数据手册应如何实现再移植至我们的工程。
2.31.3.1 查看资料
MQ-3气体传感器对酒精的灵敏度高可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器。 其对应的原理图见图2.31.3.1-2AO输出为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* 函 数 说 明初始化ADCDMA功能* 函 数 形 参无* 函 数 返 回无* 作 者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(i0; i SAMPLES; i){/* 累加 */AdcValuegt_adc_val[i][CHx];}/* 求平均值 */AdcValueAdcValue / 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);#endif2.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.hint main(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组systick_config(); //滴答定时器初始化 1msADC_DMA_Init();usart_gpio_config(115200U);printf(ADCDMA demo start\r\n);while(1){ printf(%d%%\r\n, Get_MQ3_Percentage_value() );delay_1ms(1000);}
}移植现象输出换算后的酒精浓度百分比。 移植成功示例见文件2.31.4-1 。