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

📄 dataprocess.c

📁 aduc7026裸机程序
💻 C
字号:
#include "main.h"

int p	= 0;              //优化变量
int t	= 198;
int s	= 1;
int v	= 0;
int w	= 1; 
int etc	= 0;
int ratioint;

unsigned int countadjust=3000;   //计数用的变量

	
unsigned char ratiointendh 	= 0;     //eto co2中间转换值
unsigned char ratiointendl 	= 0;
unsigned char rr1			= 0;            //呼吸率转换值
unsigned char rr2			= 0;
unsigned char factor;	  
unsigned char a2;                //rationint changing number时时的co2值
unsigned char a1;


unsigned char flagadjust	= 1;
unsigned char text			= 0;
unsigned char ttflag;

int   utem;					//采用得到温度值
int   uco2tem;				//temp variable
int   ureftem;

void DataProc()  //数据采集数据处理
{	
	float baseline 	= 950;		//基线值
	float baseline2 = 0;			//基线参考值
	float tempslop	= 0.5;	       //co2浓度计算用的温度补偿系数(可改动系数*****************************)
	float uco2;					//CO2光路输出值
	float uref;					//参考光路的输出值
	float ratio;					//采用比值
	int   count 	= 1000;		//评价计算用的平均次数
	int	  lapcount	= 1;			//time int
	int   rr 		= 16;		////呼吸率
	int   basetemp	= 3100;		 //预设基准温度

//bit to unsigned char
	unsigned char   rrflag 		= 0;			//呼吸率计算用的标志位
	unsigned char   rrflag2 		= 0;
	unsigned char   lapflag		= 0;		      //出现呼吸间隔的标志位
//	bit   flagstop		= 0;	             //程序起止标志位
    unsigned char   flagtemp	= 1;

	uco2=uco2*3/4+((float)uco2tem)/4;			              //对uco2,uref进行平均预处理
	uref=uref*3/4+((float)ureftem)/4;	
	ratio=(uco2/uref)*1000-(utem*0.8-basetemp)*tempslop;	  //CO2浓度的基本计算式		
		                                                          //ratio=(uco2/uref)*1000-3.4*exp((utem-2450)*0.01);

	if(countadjust != 0){
		if(countadjust > 1000){
			;	 									//系统工作的头30秒进行取样平均,
		}else{										//欲对baseline进行绝对校准。20秒空操作后
			baseline2 = baseline2 + ratio/count;	//10秒进行平均处理,得到新基准baseline2	
		}
		countadjust--;
		if(countadjust==1001&&flagtemp==1){
			 utem=ADCChannel(3);		      //在20秒末取温度值,作为basetemp
			 basetemp=utem;
			 flagtemp=0;
		}
		if(flagadjust==0&&(abs(ratio-baseline)>55)){
			rrflag=1;
			lapflag=1;							      //
			lapcount++;
			s=1;
		}else if(abs(ratio-baseline)<35){        							  //计算得到呼吸率 在呼吸的过程中适时地调整基线值							
			lapcount++;
			if((lapflag=1)&&(ratio>baseline)){
				baseline=ratio;
			}
			if((lapflag=1)&&(baseline>ratio+20)){
			    if(s>0){
					baseline=baseline-10;
					s--;
					if(baseline>ratio){
						baseline=baseline-5;
					}
				}
			}
			rrflag=0;
			rrflag2=1;
		}
		if(rrflag==1&&rrflag2==1){ 
			rr=rr/2+5600/lapcount/2;                                   //滚动计算
//          rr=5400/lapcount;
			if(rr<100){                	  
				rr1=(rr/128);
				rr2=(rr%128);
			}else{
				rr1=0;
				rr2=20;
			}
	   		lapcount=1;
            rrflag2=0;
			rrflag=0;
			lapflag=0;
		}    
	}else{	
		if(flagadjust!=0){		      //系统首次运行,进行绝对校准,以后则不在运行
			flagadjust=0;
			baseline=baseline2;
			baseline2=0;
			count=150;
			countadjust=count;
		}else{
			if(abs(baseline2-baseline)<30){
				if(baseline2>baseline){
					baseline=baseline+2;
				}else{ 
					baseline=baseline-2;
				}	
			}
			baseline2=0;
			count=300;
			countadjust=count;
		}
	}
	ratioint=(int)(((baseline-ratio)*(float)factor/10)+880);   //波形的计算公式
	a1=((ratioint/256)<<1)+(((ratioint%256)&0x80)/128);                                                           //取值转换
	a2=(ratioint%256)&0x7f;
    if(ratioint>1150){ 
       v++;
       etc=etc+ratioint;
       p=0;
       if(v>6){
		    etc=etc/210;
		    ratiointendh=((etc/256)<<1)+(((etc%256)&0x80)/128);
		    ratiointendl=(etc%256)&0x7f;
			etc=0;
			v=0;
		}
	}
    if(ratioint<1005){
		p++;
		if(p>1000){
			ratiointendh=0;
			ratiointendl=0;
		}
	}	
	if(ttflag==0&&flagadjust!=0){
		SendHex(0x80);
		SendHex(0x04);
		SendHex(0x05);
		SendHex(0x07);
		SendHex(0x68);
	}else if(ttflag==0){     //波形输出
		SendHex(0x80);
	    SendHex(0x04);
	    SendHex(0x05);
	    SendHex(a1);
	    SendHex(a2);		
	}
} 

⌨️ 快捷键说明

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