本帖最后由 stevendaoyun 于 2013-7-2 22:01 编辑
现在我在程序中定义了三个全局变量,由对应子函数进行赋值,利用其中全局变量带入公式中计算得到的结果不正确,如果在公式语句前,给这两个变量赋值,赋的值正是子函数计算出的值,公式得到结果正确,不知道问题出在哪了。定义了三个全局变量:
double Data_T,Data_R,Data_Z;
三个子函数最后一句话是给全局变量赋值,这是程序一部分,子函数代码不用看,测试结果正确:
/**************环境温度检测函数*****************/
void T_det()
{
double Rt,r,Ut,Average;
Average=(double)(ADC1_Average());
Ut=Average/1000;
Rt=2000*(5+0.42*Ut)/(100-0.42*Ut);
r=(Rt-R1)/(R2-R1);
Data_T=49.989*r+0.03*r*r-0.02*r*r*r;//适用于0到50摄氏度
}
/*********交流电阻R测试函数***************/
void R_det()
{
u8 i;
u32 temp1,temp2,Uh=0,Ul=0,U=0;
flag=0;
DAC_Configuration(); //DAC配置数控恒流源
DAC_DATA=(u16)(49.636*TestCurrent1);
DAC_WriteData();
delay_us(100);
GPIO_SetBits(GPIOA,GPIO_Pin_8); //使能参考电压
ADC_Configuration_R_Z();
Timer_Configuration();
TIM_Cmd(TIM3,ENABLE);//启动定时器
while(j<num) //等待num次数据采集完成
{
// printf("当交流电阻R测试电流为:%d(mA)\r\n",Current());
}
TIM_Cmd(TIM3,DISABLE);//关闭定时器
GPIO_ResetBits(GPIOA,GPIO_Pin_6);//PA6、PA7置低电平为Z测试做准备
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
j=0;
for(i=10;i<(num-10);i++) //采样num-20次
{
if(i%2==0) //获取正向(反向)电压
{
temp1=0;
temp1=ADC_RegularConvertedValueTab1[i];
Uh=Uh+temp1;
printf("电阻R正向电压转换值=%dmV\r\n",ADC_RegularConvertedValueTab1[i]);
}
else
{
temp2=0;
temp2=ADC_RegularConvertedValueTab1[i];
Ul=Ul+temp2;
printf("电阻R反向电压转换值=%dmV\r\n",ADC_RegularConvertedValueTab1[i]);
}
}
printf("Uh=%d,Ul=%d\r\n",Uh,Ul);
U=Uh-Ul; //正向和反向电压差
Data_R=U*1.0/(2*2*TestCurrent1*50);//计算交流电阻R
}
/************优值系数Z测试函数************/
void Z_det()//Z值测试子函数 等待TEC工作稳定
{
u32 Uadd=0,Ua=0,temp1,temp2;
double Ua1,Uadd1,Ur1;
u8 i,w;
flag=1;
DAC_DATA=(u16)(49.636*TestCurrent2);
DAC_WriteData();
delay_us(100);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
ADC_Configuration_R_Z();
Timer_Configuration();
TIM_Cmd(TIM3,ENABLE);
for(w=WaitTime_S;w>0;w--) //延时等待TEC工作在稳定状态
{
delay_ms(500);
delay_ms(500);
}
Z_TestStart=1;
while(k<num)
{
// printf("当前优值系数Z测试电流为:%d(mA)\r\n",Current());
}
TIM_Cmd(TIM3,DISABLE);
Z_TestStart=0;
k=0;
for(i=10;i<(num-10);i++) //测量num-20次
{
if(i%2==0) //获取塞贝克电压值
{
temp1=0;
temp1=ADC_RegularConvertedValueTab2[i];
Ua=Ua+temp1;
printf(" 塞贝克电压Ua=%dmV\r\n",ADC_RegularConvertedValueTab2[i]);
}
else //获取电阻电压与塞贝克电压之和电压值
{
temp2=0;
temp2=ADC_RegularConvertedValueTab2[i];
Uadd=Uadd+temp2;
printf("电阻电压与塞贝克电压和Uadd=%dmV\r\n",ADC_RegularConvertedValueTab2[i]);
}
}
Ua1=(double)((Ua-2500*50)/(2*50));
Uadd1=(double)((Uadd-2500*50)/(2*50));
Ur1=Uadd1-Ua1;
Data_Z=(double)(Ua1/(Ur1*Data_T));//塞贝克电压与电阻电压比值为优值系数Z值
}
主函数main中用到的公式:
Max_Temper_Differ=(double)((Data_T+273)-(sqrt(1+2*(Data_T+273)*Data_Z/1000)-1)/(Data_Z/1000));
直接利用子函数给全局变量Data_T和Data_Z赋值,通过Printf语句观察,全局变量确实被赋值了,然而这样得到的计算结果错误。
下面直接给全局变量赋值,所赋值的两个数是子函数计算结果:
Data_T=8.58;
Data_Z=1.42;
Max_Temper_Differ=(double)((Data_T+273)-(sqrt(1+2*(Data_T+273)*Data_Z/1000)-1)/(Data_Z/1000));
得到的结果正确,两个值正是T_det()和Z_DET()两个子函的值。
|