📄 temp_mod.c
字号:
/****************************************************************
discrible:温度计算主程序
author :Ye Yun Kai
date :05.04.15(yy.mm.dd)
****************************************************************/
#include "msp430x42x.h"
#include "Sys_data.h"
#include "Sys_fun.h"
void Temp_Mod(void)
{
unsigned char M_temp_Sub,H_temp_Sub,L_temp_Sub;
unsigned char i,temp_A;
unsigned char In_Temp1,In_Temp0,Out_Temp1,Out_Temp0;
P2OUT |= 0x08; //开启温度测试电路电源
Delay(10); //延时 20*4 ms
SD16CTL |= 0x0008; //开启bit.3:即Vmin (bit.3影响功耗)
SD16CCTL0 |= 0x0002; //通道0启动转换
SD16CCTL1 |= 0x0002; //通道1启动转换
SD16CCTL2 |= 0x0002; //通道2启动转换
// IE2 |= BTIE; // Enable BT interrupt//测SD采样一次所用时间用
// key_timers = 0;
//----------排序算法拿到中断外面来,减少中断执行时间,防止丢脉冲(50次排序算法需:80ms;30次排序算法需:30ms)
if(BasicSamps>=100)//校准采样
{
Value_Mem0 = Sum_samp0/BasicSamps; //BasicSamps次求平均
Value_Mem1 = Sum_samp1/BasicSamps; //BasicSamps次求平均
Value_Mem2 = Sum_samp2/BasicSamps; //BasicSamps次求平均
}
else
{
Queue_SDvalue();//对3个SD数组中的SD值进行排序,并取中间30个值累加
Value_Mem0 = Sum_samp0/(BasicSamps-20); //BasicSamps次求平均
Value_Mem1 = Sum_samp1/(BasicSamps-20); //BasicSamps次求平均
Value_Mem2 = Sum_samp2/(BasicSamps-20); //BasicSamps次求平均
}
Sum_samp0 = 0; //清0
Sum_samp1 = 0; //清0
Sum_samp2 = 0; //清0
//------------------------------------------------------------------------------------------------------
BasicValue[0] = (unsigned char)Value_Mem0; //基准口温度SD值
BasicValue[1] = (unsigned char)(Value_Mem0 >> 8);
In_SD16Value[0] = (unsigned char)Value_Mem1; //进口温度SD值
In_SD16Value[1] = (unsigned char)(Value_Mem1 >> 8);
Out_SD16Value[0] = (unsigned char)Value_Mem2; //出口温度SD值
Out_SD16Value[1] = (unsigned char)(Value_Mem2 >> 8);
/**************入口温度处理(温度计算,温度校准)***************/
if(Value_Mem1 >= Value_Mem0)//----入口SD值大于基准值才去算温度
{
Cal_InOutTemp(In_Temp); //计算进水口温度
Cal_InSub_temp(); //计算5~95之间的进口温度漂移量
AdjustIn_Temp(); //入口温度校准
Up_Datebuffer(In_Temp,3); //更新进水温度到Data_buffer
}
else//---------------------------入口SD值小于基准值则出错(即小于0度,则出错)
{
In_Temp[2] =0x00;
In_Temp[1] =0x0E;
In_Temp[0] =0x01;
Up_Datebuffer(In_Temp,3); //更新进水温度到Data_buffer
}
/**************出口温度处理(温度计算,温度校准)***************/
if(Value_Mem2 >= Value_Mem0)//----出口SD值大于基准值才去算温度
{
Cal_InOutTemp(Out_Temp); //计算出水口温度
Cal_OutSub_temp(); //计算5~95之间的出口温度漂移量
AdjustOut_Temp(); //出口温度校准
Up_Datebuffer(Out_Temp,3); //更新出水温度到Data_buffer
}
else//---------------------------出口SD值小于基准值则出错(即小于0度,则出错)
{
Out_Temp[2] =0x00;
Out_Temp[1] =0x0E;
Out_Temp[0] =0x02;
Up_Datebuffer(Out_Temp,3); //更新进水温度到Data_buffer
}
/**********************入口出口温差计算***********************/
if( (In_Temp[1] !=0x0E) &&(Out_Temp[1] !=0x0E) )//入口出口温度没出错时才去算温差
{
// M_temp_Sub = In_Temp[2] - Out_Temp[2]; //温差百位数
if(In_Temp[1]>Out_Temp[1])//入口In_Temp[1]>出口Out_Temp[1]
{
In_Temp1 = In_Temp[1];
In_Temp0 = In_Temp[0];
Out_Temp1 = Out_Temp[1];
Out_Temp0 = Out_Temp[0];
}
else if(Out_Temp[1]>In_Temp[1])//出口Out_Temp[1]>入口In_Temp[1]
{
In_Temp1 = Out_Temp[1];
In_Temp0 = Out_Temp[0];
Out_Temp1 = In_Temp[1];
Out_Temp0 = In_Temp[0];
}
else//--------------------------入口In_Temp[1]大==出口Out_Temp[1]
{
if(In_Temp[0]>=Out_Temp[0])//入口大于出口
{
In_Temp1 = In_Temp[1];
In_Temp0 = In_Temp[0];
Out_Temp1 = Out_Temp[1];
Out_Temp0 = Out_Temp[0];
}
else//-----------------------出口大于入口
{
In_Temp1 = Out_Temp[1];
In_Temp0 = Out_Temp[0];
Out_Temp1 = In_Temp[1];
Out_Temp0 = In_Temp[0];
}
}
if(In_Temp0 >= Out_Temp0) //入口小数点>=出口小数点
{
if((In_Temp1&0x0F) >= (Out_Temp1&0x0F)) //温差整数位
H_temp_Sub = In_Temp1 - Out_Temp1;
else
H_temp_Sub = In_Temp1 - Out_Temp1 - 6;
if((In_Temp0&0x0F) >= (Out_Temp0&0x0F)) //温差小数位
L_temp_Sub = In_Temp0 - Out_Temp0;
else
L_temp_Sub = In_Temp0 - Out_Temp0 - 6;
}
else //入口小数点<出口小数点
{
if((In_Temp1&0x0F) > (Out_Temp1&0x0F)) //温差整数位
H_temp_Sub = In_Temp1 - Out_Temp1 - 1;
else
{
if((In_Temp1&0xF0) < (Out_Temp1&0xF0))
H_temp_Sub = 0x99-Out_Temp1+In_Temp1;
else
H_temp_Sub = In_Temp1 - Out_Temp1 - 7;
}
L_temp_Sub = In_Temp0 + ((0x99 - Out_Temp0)&0xF0);//小数高位先加
temp_A = ((0x99 - Out_Temp0)&0x0F) + 0x01; //再将temp_A加到小数低位
for(i=0;i<temp_A;i++)
{
L_temp_Sub++;
if((L_temp_Sub&0x0F) > 0x09)//若加过9,即有A出现
{
L_temp_Sub &= 0xF0;
L_temp_Sub += 0x10;
}
}
}
// Sub_Temp[2] = M_temp_Sub; //温差百位数
Sub_Temp[1] = H_temp_Sub; //温差整数位
Sub_Temp[0] = L_temp_Sub; //温差小数位
if( (Sub_Temp[2]>0)||(Sub_Temp[1]>0x99) )//--"E 3" 大于99度出错 (这种出错情况为出口温度比入口高)
{
Sub_Temp[2] =0x00;
Sub_Temp[1] =0x0E;
Sub_Temp[0] =0x03;
}
Up_Datebuffer(Sub_Temp,3); //更新温差到Data_buffer
}
else//若入口出口温度有一个出错,则温差不去算,并也出错
{
Sub_Temp[2] =0x00;
Sub_Temp[1] =0x0E;
Sub_Temp[0] =0x03;
Up_Datebuffer(Sub_Temp,3); //更新温差到Data_buffer
}
}
/***************************************************
discrible:计算入口或出口温度值
date :2005-8-16
***************************************************/
void Cal_InOutTemp(unsigned char *add)
{
unsigned int temp_SD,temp_Basic,Temp;
unsigned char L_Temp,H_Temp,M_Temp;
if(add == In_Temp)
temp_SD = In_SD16Value[1]*256 + In_SD16Value[0]; //入口的SD值
else
temp_SD = Out_SD16Value[1]*256 + Out_SD16Value[0];//出口的SD值
temp_Basic = BasicValue[1]*256 + BasicValue[0]; //基准口SD值
A = ((temp_SD - temp_Basic) *100000) / (temp_Basic - 0x8000);//计算A值
search_Q(); //根据A值查找Q值
MPY = A;
OP2 = Q;
Temp = (RESHI*65536 + RESLO)/100000;//A*Q,即得到温度值
M_Temp = Temp/10000; //温度百位数
H_Temp = (Temp/100)%100; //温度整数位
L_Temp = Temp%100; //温度小数位
if(add == In_Temp)
{
In_Temp[2] = M_Temp; //百位十进制转换成十六进制
In_Temp[1] = (H_Temp/10)*16 + (H_Temp%10); //十位十进制转换成十六进制
In_Temp[0] = (L_Temp/10)*16 + (L_Temp%10); //小数位十进制转换成十六进制
}
else
{
Out_Temp[2] = M_Temp; //百位十进制转换成十六进制
Out_Temp[1] = (H_Temp/10)*16 + (H_Temp%10); //十位十进制转换成十六进制
Out_Temp[0] = (L_Temp/10)*16 + (L_Temp%10); //小数位十进制转换成十六进制
}
}
/***************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -