📄 ad_change.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 + -