⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_change.cpp

📁 采用LPC的芯片做的气体排放检测,包括气体成分分析,数据的处理,数据传输给工作站.
💻 CPP
字号:
#include	"stdafx.h"
#include  "config.h"
#include	"target.h"
#define CUTOFF_COUNT  4665              //55℃对应的COUNT
#define FIRST_TEMP_TABLE_STEP 5552.57   // 49℃对应的COUNT 
#define LAST_TEMP_TABLE_STEP 17282.14   // -10℃对应的count
#define REAL_TEMP_TABLE_SIZE (91)       //温度表长度
#define TEMP_TABLE_SIZE (91)
#define TEMP_TABLE_STEP ((LAST_TEMP_TABLE_STEP-FIRST_TEMP_TABLE_STEP)/REAL_TEMP_TABLE_SIZE)  //步长
#define MAX_ENV_TEMP   45           //最高工作环境温度
U16 U16_MeasureRecord[30*5];//30秒数据缓存
extern  U8 g_ucTeso2;
extern U8 g_ucTestNO;
extern float Kcoef,Kcoef1,Kbleed,Kbleed1,Ktemp1,Ktemp2;
_All_Data0 g_alldata;
extern	_DEV_FGA4100_DATA	g_FGA4100CurData;
U16 CO2_DATA[5];
extern U16 FLOWSEP;
extern int g_iPenuVar;
extern U16  U16_O2data;
extern U16  U16_O2data1;
extern float Ko2;
extern float Co2;
const  S16
tempTable[] = {4900,4818,4738,4658,4581,4504,4429,4354,	
4281,4209,4138,4068,3998,3929,3862,3794,3728,3662,3597,	
3532,3468,3405,3342,3279,3217,3155,3094,3033,2972,2912,	
2852,2792,2733,2674,2615,2556,2498,2440,2381,2324,2266,	
2208,2150,2093,2036,1978,1921,1864,1806,1749,1692,1635,	
1577,1520,1462,1405,1347,1289,1230,1172,1113,1054,994,	
934,874,813,751,688,625,560,495,427,362,297,231,164,
96,28,-42,-114,-194,-262,-333,-409,-487,-567,-649,-733,	
-819,-908,-1000};
	                   //在一定的COUNT间隔下对应的温度眪;
void GET_AdData(U32 uccode);
struct  ADchang
{
	U16 us_temp1;
	U16 us_temp2;
	U16 us_dry;
	U16 us_press;
}adchange_0;
U32 AD_resuet;
U32  AD_count;
//U16 ConvTemp(U16 TempCount);
void READ_ADresult()
 {  //U16 i;
    GET_AdData(0);
	adchange_0.us_press=(U16)(AD_resuet*Kbleed);
	US0_putchar((adchange_0.us_press)>>8);
	//US1_putchar(adchange_0.us_press);
	GET_AdData(1);
	adchange_0.us_dry=(U16)(AD_resuet);
    US0_putchar(adchange_0.us_dry>>8);
    //US0_putchar(adchange_0.us_dry);
    GET_AdData(2);
    adchange_0.us_temp1=AD_resuet;
    US0_putchar(adchange_0.us_temp1>>8);
	GET_AdData(3);
	 adchange_0.us_temp2=AD_resuet;
	US0_putchar(adchange_0.us_temp2>>8);
	//return;
	//adchange_0.us_temp1=23;
	//adchange_0.us_temp2=23;
	//adchange_0.us_press=10100;
}

void GET_AdData(U32 uccode)
{  
    U16 i;
    U16 j;
    AD_resuet=0;
    AD_count=0;
   for(i=0;i<100;i++)
   {
    AD0CR=((AD0CR&0XFFFFFF00)|(1<<uccode)|(1<<24));					
    while(AD0DR&0X80000000==0);
    for(j=0;j<100;j++);
    AD_resuet=(AD0DR&0x0000ffc0);
    AD_count+=AD_resuet;
    for(j=0;j<100;j++);
    AD0CR=(AD0CR&0XFEFFFF00);
    }
    AD_resuet=((AD_count/100)&0x0000ffc0);
}


U16 ConvTemp(U16 TempCount)
{
    S16 temp_c;
	U16	   interpolate,
		   temp_index;
     
     
     if(TempCount < CUTOFF_COUNT)                             //最高温度
     {
         temp_c = 0X5500;
         return temp_c;
     }
     
	 if(TempCount > FIRST_TEMP_TABLE_STEP)                  
		TempCount -= FIRST_TEMP_TABLE_STEP;
	 else
		TempCount = 0;
		temp_index = TempCount / TEMP_TABLE_STEP;                //温度表索引

	 if(temp_index >= TEMP_TABLE_SIZE)
	 {
	    temp_index = TEMP_TABLE_SIZE - 1;                     //最低温度
	    temp_c = tempTable[(S16)temp_index];
	 }
	 else
	 {
		temp_c = tempTable[(S16)temp_index];           //线性插值
		interpolate = temp_index - (S16)temp_index;
		temp_c +=
		 	 (tempTable[(S16)temp_index+1] -
			  tempTable[(S16)temp_index]) *
			  interpolate;
	 }
	  
	 return temp_c;
}


void Get_Countreasult()
{
     float	fPenuVar;
     float  V,V1,V2,V3,V4,R,Vraw;
     float CdiL,Craw,Cback;
     static U8 MeasureRecord_count;
     U16 uwgetnodata;
     U16 *p1;
     _DEV_FGA4100_DATA  *p;
     p = &g_FGA4100CurData;

     if(g_ucTeso2)//如果用CO2平台则向CO2平台取数
     {
         PerformDevCmd(enuFGA4100Cmd_GetCO2,&g_FGA4100CurData,&fPenuVar,3);//向CO2平台取数
         if(fPenuVar < -5000.)
         {
             SetSysFaceStat(BLOWOFF);
         }
         CO2_DATA[0]=(p->wCO2);
         //保存稀释后的CO2的浓度
         g_alldata.wCO2_1=CO2_DATA[0];
         PerformDevCmd(enuFGA4100Cmd_GetCO2,&g_FGA4100CurData,&fPenuVar,2);//向尾气平台取数
         if(fPenuVar<-1000)
         {
              SetSysFaceStat(LOW_FLOW);
         }
         //保存尾气排出五气的浓度
         g_alldata.wHC=g_FGA4100CurData.wHC;
         g_alldata.wCO=g_FGA4100CurData.wCO;
         g_alldata.wCO2=g_FGA4100CurData.wCO2;
         g_alldata.wO2=g_FGA4100CurData.wO2;
         g_alldata.wNO=g_FGA4100CurData.wNO;
         g_alldata.S_RPM=g_FGA4100CurData.wSPEED;
         g_alldata.temp_oil=g_FGA4100CurData.wOIL_T;
         if(g_ucTestNO)//判断是否用NO平台
         {
              p1=&uwgetnodata;
              PerformNOcmd(Get_NOData,p1,NULL);
              g_alldata.wNO=*p1;
         }
         if((p->wCO2)<1){R=0;}
         else  R=(((float)CO2_DATA[0])/((float)(p->wCO2)));//计算稀释比
         Vraw=((float)FLOWSEP*R);
    }    
    else//采用氧化告的浓度计算
    {
         Cback=209.;
         CdiL=((float)g_alldata.wO2_1);
         //US0_putchar(55);
         PerformDevCmd(enuFGA4100Cmd_GetCO2,&g_FGA4100CurData,&fPenuVar,2);//向尾气平台取数
         if(fPenuVar<g_iPenuVar)
         {
              SetSysFaceStat(LOW_FLOW);
         }
         
         //保存尾气排出五气的浓度
         g_alldata.wHC=g_FGA4100CurData.wHC;
         g_alldata.wCO=g_FGA4100CurData.wCO;
         g_alldata.wCO2=g_FGA4100CurData.wCO2;
         g_alldata.wO2=g_FGA4100CurData.wO2;
         g_alldata.wNO=g_FGA4100CurData.wNO;
         g_alldata.S_RPM=g_FGA4100CurData.wSPEED;
         g_alldata.temp_oil=g_FGA4100CurData.wOIL_T;
         if(g_ucTestNO)//判断是否用NO平台
         {
              p1=&uwgetnodata;
              PerformNOcmd(Get_NOData,p1,NULL);
              g_alldata.wNO=*p1;
         }
         //计算稀释比
         Craw=(float)(g_alldata.wO2);
         if((Cback-Craw)<0.001)R=0;
         else R=(((float)(Cback-CdiL))/((float)(Cback-Craw)));
         //US0_putchar(88);
         //g_alldata.R_XSB=(U16)R*100;
        // US0_putchar(FLOWSEP);
         //US0_putchar(FLOWSEP>>8);
         Vraw=(float)((FLOWSEP)*R);
     }
     
     //保存30秒数据缓存
     if(MeasureRecord_count>30)
     {MeasureRecord_count=0;}
     (*(U16*)(BASE_HC+MeasureRecord_count)) = g_alldata.wHC;
	 (*(U16*)(BASE_CO+MeasureRecord_count)) = g_alldata.wCO;
	 (*(U16*)(BASE_CO2+MeasureRecord_count)) = g_alldata.wCO2;
	 (*(U16*)(BASE_O2+MeasureRecord_count)) = g_alldata.wO2;
	 (*(U16*)(BASE_NO+MeasureRecord_count)) = g_alldata.wNO;
	 MeasureRecord_count++;
     
     //读AD转换结果并保存
     //READ_ADresult();
     g_alldata.temp_in=adchange_0.us_temp1;//读流量计入口温度
     g_alldata.temp_natur=adchange_0.us_temp2;//读环境温度
     g_alldata.Bleed_in=adchange_0.us_press;//读流量计入口压力
     g_alldata.coefRH=adchange_0.us_dry;//读环境湿度
     //计算单位时间类各气体的排除总量
     //US0_putchar(99);
     V1=((Vraw*g_alldata.wHC)/1000000.);
     fPenuVar = (8.31*(g_alldata.temp_in+273.15));
     if(fPenuVar < 0.001)	fPenuVar = 0.001;
     V=(((g_alldata.Bleed_in*V1*13.)*1000)/fPenuVar);//计算单位时间排出的NO质量
     if(V<0.01)					g_alldata.gHC = 0;
     else if(V > 30000)		 	g_alldata.gHC = 30000;
     else						g_alldata.gHC = (U16)V;
     //US0_putchar(99); 
         
     V2=((Vraw*g_alldata.wNO)/1000000.);
     fPenuVar = (8.31*(g_alldata.temp_in+273.15));
     if(fPenuVar < 0.001)	fPenuVar = 0.001;
     V=(((g_alldata.Bleed_in*V2*30.)*1000)/fPenuVar);//计算单位时间排出的NO质量
     if(V<0.01)					g_alldata.gNO = 0;
     else if(V > 60000)		 	g_alldata.gNO = 30000;
     else						g_alldata.gNO = (U16)V;
       
     V3=((Vraw*g_alldata.wCO)/100.);
     fPenuVar = (8.31*(g_alldata.temp_in+273.15));
     if(fPenuVar < 0.001)	fPenuVar = 0.001;
     V=(((g_alldata.Bleed_in*V3*28.)*1000)/fPenuVar);//计算单位时间排出的NO质量
     if(V<0.01)					g_alldata.gCO = 0;
     else if(V > 60000)		 	g_alldata.gCO = 30000;
     else						g_alldata.gCO = (U16)V;
        
     V4=((Vraw*g_alldata.wCO2)/100.);
     fPenuVar = (8.31*(g_alldata.temp_in+273.15));
     if(fPenuVar < 0.001)	fPenuVar = 0.001;
     V=(((g_alldata.Bleed_in*V4*44.)*1000)/fPenuVar);//计算单位时间排出的NO质量
     if(V<0.01)					g_alldata.gCO2 = 0;
     else if(V > 60000)		 	g_alldata.gCO2 = 30000;
     else						g_alldata.gCO2 = (U16)V;
    
     g_alldata.add_gdata=(g_alldata.gHC+g_alldata.gNO+g_alldata.gCO+g_alldata.gCO2);//单位时间排出废气的总质量
     g_alldata.add_Vdata=(U16)(V1+V2+V3+V4);
       

}

//校准各路AD转换的结果
void TEMP1_calibration(S16*p1)
 {
      U16   y;
      READ_ADresult();
      Ktemp1=((float)*p1)/(float)adchange_0.us_temp1;
      y=Ktemp1*1000;
      Write24c256((U8*)&y,ROM_ADDR_spanGasT,(U16)2);
 }
 
 
void TEMP2_calibration(S16*p1)
 {
      U16   y;
      READ_ADresult();
      Ktemp2=((float)*p1)/(float)adchange_0.us_temp2;
      y=Ktemp1*1000;
      Write24c256((U8*)&y,ROM_ADDR_spanEnvT,(U16)2);
 }
 
 
void COEF_calibration(S16*p1)
 {
      U16   y;
      READ_ADresult();
      Kcoef1=((float)*p1)/(float)adchange_0.us_dry;
      y=Kcoef1*1000;
      Write24c256((U8*)&y,ROM_ADDR_spanRH,(U16)2);
 }
 
void PRESS_calibration(S16*p1)
{
      U16   y;
      READ_ADresult();
      Kbleed1=((float)*p1)/(float)adchange_0.us_press;
      y=Kbleed1*1000;
      Write24c256((U8*)&y,ROM_ADDR_spanATP,(U16)2);
 }
 

 
 void O2_calibration(U16 *p1)//校准氧化告
  {
     /* if(U16_O2data-U16_O2data1<1)
      {return;}*/
      Ko2=(float)(209.0-(*p1))/(U16_O2data-U16_O2data1);
      Co2=(float)(209.-Ko2*U16_O2data);
      Write24c256((U8*)&Ko2,(U16)ROM_ADDR_Ko2,4);
      Write24c256((U8*)&Co2,(U16)ROM_ADDR_Co2,4);
      return;
      //Write24c256((U8*)&y,ROM_ADDR_spanATP,(U16)2)
      /*float x;
      U16   y;
      READ_ADresult();
      x=(float)(p1*Ktemp2)/(float)adchange_0.us_press;
      Kbleed1=x;
      y=Kbleed1*1000;
      Write24c256((U8*)&y,ROM_ADDR_spanATP,(U16)2);*/
         
  }
 

 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -