📄 非线性校正与温度补偿.txt
字号:
#include"user.h"
sbit
AdjPort=P1^6;
#define ZERO_VAL 0
struct LINE{
float k;
float b;
};
#define TEMP_DEPTH 7 //温度级数
struct LINE code
L[TEMP_DEPTH]={{2.6867,0},{2.8169,0},{2.9580,0},{2.9726,0},{3.0788,0},{3.2063,0},{3.3220,0}};
float code t[TEMP_DEPTH]={-10,0,10,20,30,40,50};
float f[TEMP_DEPTH];
float AA[TEMP_DEPTH];
int
Offset=0;
//零点校准
void AdjOffset(int val){
if(AdjPort==0){
Offset=ZERO_VAL-val;
}
}
int PRS(WORD AdcVal,int TempVal){
BYTE index,JcIdx;
float Prs,tmp;
//计算不同温度对应压强值
for(index=0;index<TEMP_DEPTH;index++){
f[index]=L[index].k;
display();
}
//牛顿插值计算
AA[0]=f[0];
for(index=1;index<TEMP_DEPTH;index++){
for(JcIdx=index;JcIdx<TEMP_DEPTH;JcIdx++){
AA[JcIdx]=(f[JcIdx]-f[JcIdx-1])/(t[JcIdx]-t[JcIdx-index]);
display();
}
for(JcIdx=index;JcIdx<TEMP_DEPTH;JcIdx++){
f[JcIdx]=AA[JcIdx];display();
}
}
Prs=0;
for(index=0;index<TEMP_DEPTH;index++){
tmp=AA[index];
for(JcIdx=0;JcIdx<index;JcIdx++){
tmp*=(TempVal-t[JcIdx]);display();
}
Prs+=tmp;
}
//计算去掉零点的压强值
AA[0]=Prs;
Prs=AA[0]*(float)AdcVal;
AdjOffset((int)Prs);
Prs+=Offset;
if(Prs<0)Prs=0;
return (int)Prs;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -