第1章 产品简介
1.1 概述
此文档是针对本公司mems气体探头所设计的多功能探头信号采集与输出的转接板使用指导说明,我们提供详细的设计思路包括原理图设计思路以及实例、基于STM32F030F4P6单片机的编程思路,以及标定思路,提供设计原理,以及设计接口封装。
适用于:
SMD封装气体传感器
型号 | 名称 |
JND101-001 | MEMS模拟VOC传感器 |
JND102-001 | MEMS模拟可燃气体传感器 |
JND103-001 | MEMS模拟氢气传感器 |
JND104-001 | MEMS模拟CO传感器 |
JND105-001 | MEMS模拟NH3传感器 |
JND106-001 | MEMS模拟H2S传感器 |
JND107-001 | MEMS模拟乙醇传感器 |
JND109-001 | MEMS模拟丙烷传感器 |
JND110-001 | MEMS模拟氟利昂传感器 |
JND112-001 | MEMS模拟二氧化氮传感器 |
JND115-001 | MEMS模拟烟雾传感器 |
JND116-001 | MEMS模拟甲醛传感器 |
JND117-001 | MEMS模拟丙酮传感器 |
TO封装气体传感器
型号 | 名称 |
JP-131 | TO封装VOC传感器使用说明 |
JP-137 | TO封装氨气传感器使用说明 |
JP-140 | TO封装丙酮传感器使用说明 |
JP-5 | TO封装丙烷传感器使用说明 |
JP-141 | TO封装二氧化氮传感器使用说明 |
JP-139 | TO封装氟利昂传感器使用说明 |
JP-4 | TO封装可燃气体传感器使用说明 |
JP-136 | TO封装硫化氢传感器使用说明 |
JP-8 | TO封装氢气传感器使用说明 |
JP-7 | TO封装一氧化碳传感器使用说明 |
JP-3 | TO封装乙醇传感器使用说明 |
MQ封装气体传感器
型号 | 名称 |
MQ-2 | 烟雾传感器 |
MQ-3 | 酒精传感器 |
MQ-5 | 可燃气体传感器 |
MQ-7 | 一氧化碳传感器 |
MQ-8 | 氢气传感器 |
MQ-131 | 臭氧传感器 |
MQ-135 | 空气质量传感器 |
MQ-136 | 硫化氢传感器 |
MQ-137 | 氨气传感器 |
MQ-138 | 苯传感器 |
MQ-139 | 氟利昂传感器 |
MQ-140 | 甲烷传感器 |
MQ-141 | 丙烷传感器 |
MQ-142 | 液化气传感器 |
第2章 设计要点
MEMS气体传感器利用MEMS工艺在SI基衬底上制作微热板,所使用的气敏材料是在清洁空气中电导率较低的金属氧化物半导体材料。当环境空气中有被检测气体存在时传感器电导率发生变化,该气体的浓度越高,传感器的电导率就越高。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
(1)mems气体传感器工作需要一路加热电压,以及一路回路电压。加热电压为固定值不可更改:
MEMS气体传感器(模拟)VH:2.5V±0.1V DC
To封装气体传感器VH:1.4V±0.1V DC
MQ封装气体传感器VH:5V±0.1V DC
(2)回路电压实际是在传感器测量端施加电压,通过电阻分压的方式,来实现对传感器电阻的测量,由于受电路中元件功率的限制,故回路电压需<=24V DC(典型3.3V DC)。
第3章 硬件设计
(以下电路均使用立创EDA设计)
下图为本公司提供的测试套件:
整体示意图
3.1 电源设计
公司MEMS气敏传感器,加热电压可以分为1.4v、2.5v、5v,下面以SDM封装为例,提供设计分析:
模组电路板采用的是5v供电,通过LDO稳压芯片输出3.3v作为后端mcu供电以及为气敏传感器提供回路电压,3.3v电压在经过另一路LDO稳压芯片输出1.4v电压为mems气敏探头提供加热电压。
或:
图2.电源电路
3.2 传感器部分电路设计
(1)MEMS气体传感器(模拟)
(2)To封装气体传感器
(3)MQ封装气体传感器
3.3 单片机电路设计
模组单片机采用stm32f030f4p6芯片,此次需要用到一路串口PA2、PA3(USART1),一路ADC采集口PA0。
图3.单片机电路
3.4 信号输出设计
信号输出分为:(1)串口信号输出
(2)模拟量信号输出
第4章 使用思路
4.1 定性使用:
定性使用是根据客户所使用的要求,超过设置的某一电压值,输出高低电平的方式。通过比较电路输配合滑动变阻器实现这一功能。
MQ封装实例:
4.2 定量使用:
气体传感器输出模拟量信号,接入单片机的ADC采集口,采集模拟量信号,通过标定转化为实际浓度,基于实际浓度数值,进行其他的操作。
第5章 软件编程设计
(1) 标定思路
MEMS气敏探头的的阻值变化跟所检测气体浓度成正比:
通标气标定曲线
(2) 程序例程
实现功能:mems气体探头的输出电压值,通过用标气进行标定得到实际值,通过串口实现信号的输出:
/*********************************************************/
实现功能:此版配套测试程序
使用芯片:stm32f030f4p6
波特率:9600
/*********************************************************/
管脚初始化配置:
void GPIOInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*******************************************************/
串口初始化配置:
void USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
/*配置PA9 ,PA10*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //设置端口复用
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
/* NVIC configuration */
/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/********************************************************************/
Adc初始化:
static void ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_DeInit(ADC1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ScanDirection=ADC_ScanDirection_Upward;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_ChannelConfig(ADC1,ADC_Channel_0, ADC_SampleTime_239_5Cycles);
ADC_GetCalibrationFactor(ADC1);
ADC_Cmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
ADC_StartOfConversion(ADC1);
}
/*************************************************************************/
模拟量采集以及滤算法
#define A 401
u32 caiji[A];
u16 last_ResultVolt;
uint32_t ADC_Check(void)
{
uint16_t i,j,k;
u32 ResultVolt2;
for(i=0;i
{
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
caiji[i]=(uint32_t)ADC_GetConversionValue(ADC1);
for(j=0;j<500;j++)
{;}
}
for(j=0;j
{
for(k=0;k
{
if(caiji[k]>caiji[k+1])
{
ResultVolt2=caiji[k];
caiji[k]=caiji[k+1];
caiji[k+1]=ResultVolt2;
}
}
}
ResultVolt=caiji[(A-1)/2];
ResultVolt=ResultVolt*3300;
ResultVolt= ResultVolt/4096;
if(ResultVolt>last_ResultVolt+3||ResultVolt
{
last_ResultVolt=ResultVolt;
}
else
{
ResultVolt=last_ResultVolt;
}
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
return ResultVolt;
}
/*************************************************************/
标定思路:
固态电解质所得模拟量与实际值存在线性关系。
通固定数值的标气,与实际所采集的模拟量进行拟合成一条曲线
void ADC_Read()
{
double dianya;
dianya=shuchumax*ResultVolt/3300;
Speed=dianya*SHUCHUcheng/SHUCHUchu+SGUCHUjia;
}
/***********************************************************/
串口通讯协议:采用modbus标准协议进行串口通讯
/***********************************************************/