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