聚豐項目 > 基于STM32的高精度氣體傳感器的設計
本項目應用電調制紅外光源,根據朗伯—比爾(Lambert-Beer)吸收定律,采用熱釋電紅外傳感器,主要設計了一款高精度的氣體傳感器,用于檢測煤炭經過燃燒以后均勻氣體中CO2、CO、SO2、H2的濃度,從而達到檢測煤炭中含C和S的百分比。
h1654155909.0656
分享h1654155909.0656
團隊成員
陳新喜 副教授
一:熱釋電紅外傳感器的組成和工作原理:
圖1雙探測元熱釋電紅外傳感器內部結構圖 圖2:雙探測元熱釋電紅外傳感器實物圖
熱釋電紅外傳感器和熱電偶都是基于熱電效應原理的熱電型紅外傳感器。不同的是熱釋電紅外傳感器的熱電系數遠遠高于熱電偶,其內部的熱電元由高熱電系數的鐵鈦酸鉛汞陶瓷以及鉭酸鋰、硫酸三甘鐵等配合濾光鏡片窗口組成,其極化隨溫度的變化而變化。為了抑制因自身溫度變化而產生的干擾 該傳感器在工藝上將兩個特征一致的熱電元反向串聯或接成差動平衡電路方式,因而能以非接觸式檢測出物體放出的紅外線能量變化并將其轉換為電信號輸出。
熱釋電紅外傳感器在結構上引入場效應管的目的在于完成阻抗變換。由于熱電元輸出的是電荷信號,并不能直接使用,因而需要用電阻將其轉換為電壓形式 該電阻阻抗高達104MΩ,故引入的N溝道結型場效應管應接成共漏形式 即源極跟隨器 來完成阻抗變換。熱釋電紅外傳感器由傳感探測元、干涉濾光片和場效應管匹配器三部分組成。
圖1是一個雙探測元熱釋電紅外傳感器的結構示意圖。使用時D端接電源正極,G端接電源負極,S端為信號輸出。該傳感器將兩個極性相反、特性一致的探測元串接在一起,目的是消除因環境和自身變化引起的干擾。
二:電調制非分光紅外傳感器氣體分析機理:
當紅外光通過待測氣體時,氣體分子對特定波長的紅外光有吸收作用,其吸收關系服從朗伯—比爾(Lambert-Beer)吸收定律:設平行入射光的強度為I0,出射光的強度為I1,氣體介質的厚度為L,氣體的濃度為c,氣體的吸收系數為,則其關系表達式為:
--(1)
其中是表示不同氣體的吸收系數,是表示不同氣體的濃度。
當為多種混合氣體時,為了分析特定特定的氣體組分,需要在傳感器或者紅外光源前安裝一個適合分析氣體吸收波長的窄帶濾光片,使傳感器的信號變化只反映被測氣體的濃度變化。
三:硬件電路設計
根據系統的設計要求,本系統的主要由一下幾個模塊組成:
圖3:系統硬件框圖
3.1 STM32主控電路圖
圖4:STM32主控電路及平臺硬件圖
3.2 A/D轉換電路
圖5:A/D轉換電路原理圖
3.3:信號處理電路
圖6:信號處理電路圖
4.1上位機監控軟件
4.2 下位機控制程序
#include
#include "absacc.h"
#include "intrins.h"
//#include "string.h"
//#include "math.h"
#include
//#include
#define sum (2) //108 (76) (140)//(28) (22) (240)
#define Average (10)
#define Full_Scale (65000) //TBD adjust volatile resistance to get the value
#define Coefficient (6500) //TBD
#define nCHANNEL (2)
bit sample_flag,sampling_enabled;
//uint xdata signal_buffer[10],temp_buffer[10];
uchar data count,channel,Txd_count;
uint xdata sample_value[3][sum],average[3],adjust_value ; //signal_value[3],temp_value[3];
//uint xdata signal_average,temp_average;
uint xdata concentration;
//longint xdata signal_sum,temp_sum;
unsigned long int data sampling_buffer,sample_value24;
void data_processing(void)
{
uchar idata i,j,checkout;
// uint xdata tmp;
// longint xdata signal_sum;
// float idata tmp_val;
EA=false;
EX0=false;
// SCLK=true; //reset the a/d chip
/* for ( i=0;i<sum-1;i++ )
{
for ( j=i+1;j<sum;j++ )
{
if ( sample_value[i]<sample_value[j] )
{
tmp=sample_value[i];
sample_value[i]=sample_value[j];
sample_value[j]=tmp;
}
}
} */
// signal_sum=0;
/* for ( i=6;i<sum-6;i++ )
{
signal_sum+=sample_value[i];
}
average[!channel]=signal_sum/(sum-12); */
//////////////////////////////////////////////////
/* for ( i=0;i<sum;i++ )
{
signal_sum+=sample_value[0][i];
}
average[0]=signal_sum/sum; //use
*/
// sample_value24=sample_value24/sum;
//average[0]=average[0]*2; //test
/* signal_sum=0;
for ( i=0;i<sum;i++ )
{
signal_sum+=sample_value[1][i];
}
average[1]=signal_sum/sum; */
//average[1]=average[1]*2; //test
////////////////////////////////////////////
/* if ( sample_value[0][0]>0x7000 )
{
adjust_value=sample_value[0][0]-0x7000;
sample_value[2][0]=sample_value[1][0]+adjust_value;
} */
////////////////////////////////////////////
sample_flag=false;
//if ( !channel )
{
Txd_count++;
Send_Disp(0x55);
i=0;
j=0;
checkout=0;//i^j;
i=sample_value[0][0]>>8;
j=sample_value[0][0]&0x00ff;
checkout=i^j;
Send_Disp(i);
Send_Disp(j); // so2
i=sample_value[1][0]>>8;
j=sample_value[1][0]&0x00ff;
checkout=checkout^i^j;
Send_Disp(i);
Send_Disp(j); //co2 h2o
Send_Disp(Txd_count);
Send_Disp(0);
checkout=checkout^Txd_count^0;
/* i=sample_value[2][0]>>8;
j=sample_value[2][0]&0x00ff;
checkout=checkout^i^j;
Send_Disp(i);
Send_Disp(j); //H2O check temp
*/
Send_Disp(checkout);
}
//SCLK=false;
_nop_();
LED_Green=Txd_count/128; //!LED_Green;
EA=true;
//EX0=true;
/*
maximal=sample_value[0];
minimal=sample_value[0];
for ( i=1;i<Filter_times;i++ )
{
if ( maximal<sample_value[i] )
{
serial_number[0]=i;
maximal=sample_value[i];
}
else if ( minimal>sample_value[i] )
{
serial_number[0]=i;
minimal=sample_value[i];
}
} */
/* float idata nVoltage;
sample_flag=false;
count++;
if ( count>Filter_times )
{
//signal_sum += adjust_signal(); //sample_value[0];
nVoltage=signal_sum/Average;
nVoltage=Full_Scale/nVoltage;
nVoltage=log(nVoltage);
concentration=nVoltage*Coefficient;
//ES=false;
Send_Disp(concentration&0x00ff);
Send_Disp(concentration>>8);
//ES=true;
signal_sum=0;
temp_sum=0;
count=0;
}
else
{
;//signal_sum += adjust_signal(); //sample_value[0];
//temp_sum += adjust_signal(1); //sample_value[1];
}
*/
}
/*
uchar rec_len;
/*********************************************/
void Main(void)
{
_nop_();
_nop_();
_nop_();
Mcu_Init();
Variable_Init();
delay(1000); //for a/d chip reset
SCLK=false;
EA=true;
//EX0=true;
while(1)
{
Watch_Dog=!Watch_Dog;
scout();
if ( sample_flag ) data_processing();
}
}
經過軟硬件的設計,將測試到的信號上傳到上位機監控窗口,監測到的信號如圖8和圖9所示。
圖8:信號波形(箱體內常溫)
圖9:圖8:信號波形(48度恒溫箱體內檢測)
由上面的測試數據可以看出,信號變化大概在130uV;測試精度高。
動心忍性1234: 您好我是無線電雜志的編輯,我們對您的項目十分感興趣,請問您有興趣投稿嗎?成為我們的作者除稿費外還有其他優厚條件。敬請參與。投稿請聯系QQ260534978.
回復
可樂_47480004: 看不見圖片
回復