本帖最后由 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()两个子函的值。
|