📄 math.c
字号:
, 4178 //8.357 700 14
, 4657 //9.315 750 15
, 5148 //10.296 800 16
, 5648 //11.297 850 17
, 6157 //12.315 900 18
, 6673 //13.347 950 19
, 7194 //14.389 1000 20
, 7824 //15.649 1050 21
, 8247 //16.494 1100 22
, 8881 //17.762 1150 23
, 9303 //18.607 1200 24
, 9831 //19.662 1250 25
, 10356 //20.713 1300 26
, 10878 //21.757 1350 27
, 11396 //22.793 1400 28
, 11909 //23.819 1450 29
, 12416 //24.833 1500 30
, 12917 //25.834 1550 31
, 13410 //26.821 1600 32
, 13895 //27.791 1650 33
, 14372 //28.744 1700 34
, 14839 //29.678 1750 35
, 15295 //30.591 1800 36
, 15742 //31.484 1850 37
, 16177 //32.354 1900 38
, 16600 //33.201 1950 39
, 17011 //34.023 2000 40
, 17409 //34.818 2050 41
, 17793 //35.587 2100 42
, 18164 //36.328 2150 43
, 18519 //37.039 2200 44
, 18860 //37.720 2250 45
, 19247 //38.495 2300 46
};
//==============================================================================
// Pt100(RTD)热电阻分度表(℃) //(型号代码: P100)
//==============================================================================
// --------------------------------------------------------------------
// 电阻值(Ω)X50 电阻值(Ω) 温度(℃)序号
// --------------------------------------------------------------------
int code tab_sn_pt1h[22]=
{
926 //18.52 -200 0
, 1986 //39.72 -150 1
, 3013 //60.26 -100 2
, 4015 //80.31 -50 3
, 5000 //100 0 4
, 5970 //119.4 50 5
, 6925 //138.51 100 6
, 7866 //157.33 150 7
, 8793 //175.86 200 8
, 9705 //194.1 250 9
, 10602 //212.05 300 10
, 11486 //229.72 350 11
, 12354 //247.09 400 12
, 13209 //264.18 450 13
, 14049 //280.98 500 14
, 14874 //297.49 550 15
, 15685 //313.71 600 16
, 16482 //329.64 650 17
, 17264 //345.28 700 18
, 18032 //360.64 750 19
, 18785 //375.70 800 20
, 19524 //390.48 850 21
};
//==============================================================================
// Cu100铜热电阻分度表 //(型号代码: C100)
//==============================================================================
// --------------------------------------------------------------------
// 电阻值(Ω)X100 电阻值(Ω) 温度(℃)序号
// --------------------------------------------------------------------
int code tab_sn_cu1h[5]=
{
7848 //78.48 -50 1
, 10000 //100.00 0 2
, 12141 //121.41 50 3
, 14280 //142.80 100 4
, 16427 //164.27 150 5
};
//==============================================================================
// Cu50铜热电阻分度表 //(型号代码: C50)
//==============================================================================
// --------------------------------------------------------------------
// 电阻值(Ω)X200 电阻值(Ω) 温度(℃)序号
// --------------------------------------------------------------------
int code tab_sn_cu50[5]=
{
7848 //39.242 -50 1
, 10000 //50.000 0 2
, 12140 //60.704 50 3
, 14280 //71.400 100 4
, 16426 //82.134 150 5
};
// --------------------------------------------------------------------
// 分度索引表
// --------------------------------------------------------------------
int code tab_sn_ref[15][3]=
{
// s
36 //点数
, 1000 //倍率
, -50 //起始点数值
// r
, 37 //点数
, 1000 //倍率
, -50 //起始点数值
// b
, 23 //点数
, 1000 //倍率
, 700 //起始点数值
// k
, 30 //点数
, 500 //倍率
, -100 //起始点数值
// e
, 23 //点数
, 400 //倍率
, -100 //起始点数值
// j
, 27 //点数
, 400 //倍率
, -100 //起始点数值
// n
, 29 //点数
, 500 //倍率
, -100 //起始点数值
// t
, 11 //点数
, 1000 //倍率
, -100 //起始点数值
// tu3
, 47 //点数
, 500 //倍率
, 0 //起始点数值
// tu5
, 47 //点数
, 500 //倍率
, 0 //起始点数值
// tu20
, 41 //点数
, 1000 //倍率
, 0 //起始点数值
// tu26
, 47 //点数
, 500 //倍率
, 0 //起始点数值
// pt100
, 22 //点数
, 50 //倍率
, -2000 //由于精度原因 * 10, 应为 -200
// cu100
, 5 //点数
, 100 //倍率
, -500 //由于精度原因 * 10, 应为 -50
// cu50
, 5 //点数
, 200 //倍率
, -500 //由于精度原因 * 10, 应为 -50
};
//=========================================================================================
//阻型电阻表
int unsigned code Tab_rt[5]= //wint
{
18
, 70
, 170
, 270
, 350
};
/*************************************************************************************
函数名 mat_scale
功能 标度变换
入口条件 tt 目标标度高端
tb 目标标度低端
st 源标度高端
sb 源标度低端
**************************************************************************************/
int mat_scale(int temp_value) //stt
{
if(temp_value>st)
{
temp_value=st;
}
if(temp_value<sb)
{
temp_value=sb;
}
return mat_calculate(temp_value,1);
}
int mat_calculate(int temp_value,int multiple)
{
calculate=(long)(temp_value-sb)*(tt-tb)*multiple/(st-sb)+tb*multiple;//
return (int)calculate;
}
/**************************************************************************************
函数名 mat_du_add
功能 对当前的温度进行修正,根据du0,duf,sc0,scf进行修正
入口条件 当前的温度
出口条件 修正后的温度
***************************************************************************************/
int mat_du_add(int temp_value)
{
int data cycle_value;
cycle_value=temp_value;
tb=ref_table[ref_du0]+1000;
tt=ref_table[ref_duf]+1000;
sb=ref_table[ref_sc0];
st=ref_table[ref_scf];
temp_value= mat_scale(temp_value);
return (temp_value+cycle_value-1000);
}
/****************************************************************************************
函数名 choose_range
功能 根据分度号类型和量程选择不同的AD放大倍数
//////current 指向要查的表项
****************************************************************************************/
void choose_range(void)
{
unsigned char data temp=ref_table[ref_sn];
switch(temp)
{
// s
case 0: current=tab_sn_s; // 铂铑10-铂热电偶分度表(℃) ;( 型号代码: S )
choose_range_sub(1700,0,0,0);
break;
// r
case 1: current=tab_sn_r;
choose_range_sub(1750,0,0,0);
break;
// b
case 2: current=tab_sn_b;
choose_range_sub(1800,0,0,0);
break;
// k
case 3: current=tab_sn_k;
choose_range_sub(484,967,1350,0);
break;
// e
case 4: current=tab_sn_e;
choose_range_sub(286,536,787,1000);
break;
// j
case 5: current=tab_sn_j;
choose_range_sub(366,713,1034,1200);
break;
// n
case 6: current=tab_sn_n;
choose_range_sub(584,1100,1300,0);
break;
// t
case 7: current=tab_sn_t;
choose_range_sub(400,0,0,0);
break;
// tu3
case 8: current=tab_sn_tu3;
choose_range_sub(1089,2300,0,0);
break;
// tu5
case 9: current=tab_sn_tu5;
choose_range_sub(1096,2300,0,0);
break;
// tu20
case 10: current=tab_sn_tu20;
choose_range_sub(1254,2000,0,0);
break;
// tu26
case 11: current=tab_sn_tu26;
choose_range_sub(1266,2300,0,0);
break;
// pt100
case 12: current=tab_sn_pt1h;
choose_range_sub(0,185,467,850);
break;
// cu100
case 13: current=tab_sn_cu1h;
choose_range_sub(0,150,0,0);
break;
// cu50
case 14: current=tab_sn_cu50;
choose_range_sub(150,0,0,0);
break;
}
}
/*----------------------------------------------------------*/
///ref_table_temp[40]//参数存储数组
///ref_scf = 3 标称/变送的高端
////led_degree/// //计算出来的温度值
////degree_overflow 0x7fff //表示这个数值不再显示
/*-----------------------------------------------------------*/
void choose_range_sub(unsigned int a,unsigned int b,unsigned int c,unsigned int d)
{
unsigned int data temp=ref_table[ref_scf]; //量程上限
ADC0MD = 0x80; // 使能ADC0 ADC0=空闲模式
b_o_flag=1;
if(ref_table[ref_sn]>=rt_start)
{
temp=temp/10; //阻型
}
if(temp<a)//10mv
{
ADC0CN = 0x16;//3; //////增益8
volt_range=1;
ADC0MD |= 0x83; // 启动连续转换
return;
}
if(temp<b)//20mv
{
ADC0CN = 0x15;//2; /////// 增益4
volt_range=2;
ADC0MD |= 0x83; // 启动连续转换
return;
}
if(temp<c)//40mv
{
ADC0CN = 0x14;//1;
volt_range=3; ////////增益2
ADC0MD |= 0x83; // 启动连续转换
return;
}
if(temp<d)//80mv
{
ADC0CN = 0x14;//0; ////////增益1
volt_range=4;
ADC0MD |= 0x83; // 启动连续转换
return;
}
ADC0CN = 0x10;
volt_range=4;
//led_degree=sc_overflow;
b_o_flag=0;
ADC0MD |= 0x83; // 启动连续转换
}
/********************************************
函数名: temp_proccess
功能: 数据处理
形式参数:无
返回值:无
********************************************/
void temp_process(void)
{
unsigned char data cycle_value;
unsigned char data temp=ref_table[ref_sn];
unsigned char data counter=volt_range+1;
//int data temp_value;
if(temp>=rt_start) // 0为阻处理
{
t_flag=0;
cal_mod_value=Adc0_hdl(0x67);
// led_degree=cal_mod_value;
//return;
if(cal_mod_value>0x6d00)//0x0614)//
{
//t_flag=1;//下断线
led_degree=degree_brok;
return;//goto end;
}
else
{
//temp_value=tab_sn_ref[ref_table[ref_sn]][1];
ref_buffer=ref_rt1+volt_range-1; //选择头地址
for(cycle_value=0;cycle_value<counter;cycle_value++)
{
if(ref_table[ref_buffer]>cal_mod_value)
break;
ref_buffer +=4-cycle_value; //遍历查表相关值
}
if(cycle_value==counter) //超上限时的处理,始终使ref_buffer存的为较大值
{
cycle_value--;
ref_buffer -=(4-cycle_value);
}
if(cycle_value==0)
{
cycle_value++;
ref_buffer +=4; //超下限的处理,始终使ref_buffer存的为较大值
}
tt=Tab_rt[cycle_value]; //阻值查询的高
tb=Tab_rt[cycle_value-1]; //阻值查询的低
st=ref_table[ref_buffer]; //AD 值高
sb=ref_table[ref_buffer-(5-cycle_value)];//4-(cycle_value-1)
cal_mod_value=mat_calculate(cal_mod_value,tab_sn_ref[temp][1]);
// led_degree=cal_mod_value;
//return;
}
}
else //偶型
{
t_flag=1;
cal_mod_value=Adc0_hdl(0x45);
if(cal_mod_value<0)
{
//t_flag=0; //下断线
led_degree=degree_brok;
return;//goto end;
}
else
{
tt=20*volt_range;
tb=0;
st=ref_table[ref_tcf+volt_range-1];
sb=ref_table[ref_tc0+volt_range-1];
cal_mod_value=mat_calculate(cal_mod_value,tab_sn_ref[temp][1]);
}
}
//led_degree=cal_mod_value;
//return;
//查表 偶阻公共部分
for(cycle_value=0;cycle_value<tab_sn_ref[temp][0];cycle_value++)
{
if(*current<cal_mod_value)
{current++;}
else break;
}
//阻处理
if(t_flag==0)
{
if(cycle_value==tab_sn_ref[temp][0]) //上断线处理 0为点数
{
led_degree=degree_overflow;
return;//goto end;
}
if(cycle_value==0) //下断线处理,
{
led_degree=degree_overflow;
return;//goto end;
}
//正常
tt=500;
tb=0;
st=*current;
current--;
sb=*current;
cal_mod_value=mat_scale(cal_mod_value);
cycle_value--;
cal_mod_value=500*cycle_value+tab_sn_ref[temp][2]+cal_mod_value; //safe
}
else
{
if(cycle_value==tab_sn_ref[temp][0]) //上断线处理
{
//t_flag=1;//上断线
led_degree=degree_overflow;
return;//goto end;
}
if(cycle_value==0) //下断线处理
{
//t_flag=0; // 下断线
led_degree=degree_overflow;
return;//goto end;
}
//正常
tt=50;
tb=0;
st=*current;
current--;
sb=*current;
cal_mod_value=mat_scale(cal_mod_value);
cycle_value--;
cal_mod_value=50*cycle_value+tab_sn_ref[temp][2]+cal_mod_value; //safe
//mat_t_fb();
//cal_mod_value +=run_t;
}
//du修正 偶阻公共部分
cal_mod_value=mat_du_add(cal_mod_value);
//显示温度值 偶阻公共部分
led_degree=cal_mod_value;
//lcd_show_dec(cal_mod_value)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -