求解:STM32库函数编程全部变量问题

[复制链接]
2971|9
 楼主| stevendaoyun 发表于 2013-7-2 21:55 | 显示全部楼层 |阅读模式
本帖最后由 stevendaoyun 于 2013-7-2 22:01 编辑

现在我在程序中定义了三个全局变量,由对应子函数进行赋值,利用其中全局变量带入公式中计算得到的结果不正确,如果在公式语句前,给这两个变量赋值,赋的值正是子函数计算出的值,公式得到结果正确,不知道问题出在哪了。
  1. 定义了三个全局变量:
  2. double Data_T,Data_R,Data_Z;
  3. 三个子函数最后一句话是给全局变量赋值,这是程序一部分,子函数代码不用看,测试结果正确:
  4. /**************环境温度检测函数*****************/
  5. void T_det()
  6. {
  7.         double Rt,r,Ut,Average;
  8.         Average=(double)(ADC1_Average());
  9.         Ut=Average/1000;
  10.         Rt=2000*(5+0.42*Ut)/(100-0.42*Ut);
  11.         r=(Rt-R1)/(R2-R1);
  12.         Data_T=49.989*r+0.03*r*r-0.02*r*r*r;//适用于0到50摄氏度        
  13. }
  14. /*********交流电阻R测试函数***************/
  15. void R_det()
  16. {        
  17.         u8 i;
  18.         u32  temp1,temp2,Uh=0,Ul=0,U=0;
  19.         flag=0;
  20.         DAC_Configuration();                    //DAC配置数控恒流源
  21.         DAC_DATA=(u16)(49.636*TestCurrent1);
  22.         DAC_WriteData();
  23.         delay_us(100);
  24.         GPIO_SetBits(GPIOA,GPIO_Pin_8);        //使能参考电压
  25.         ADC_Configuration_R_Z();
  26.         Timer_Configuration();
  27.         TIM_Cmd(TIM3,ENABLE);//启动定时器
  28.         while(j<num) //等待num次数据采集完成
  29.         {
  30.         //        printf("当交流电阻R测试电流为:%d(mA)\r\n",Current());        
  31.         }        
  32.         TIM_Cmd(TIM3,DISABLE);//关闭定时器
  33.         GPIO_ResetBits(GPIOA,GPIO_Pin_6);//PA6、PA7置低电平为Z测试做准备        
  34.         GPIO_ResetBits(GPIOA,GPIO_Pin_7);
  35.         j=0;
  36.         for(i=10;i<(num-10);i++) //采样num-20次
  37.         {
  38.             if(i%2==0) //获取正向(反向)电压
  39.                 {
  40.                     temp1=0;
  41.                         temp1=ADC_RegularConvertedValueTab1[i];
  42.                         Uh=Uh+temp1;
  43.                         printf("电阻R正向电压转换值=%dmV\r\n",ADC_RegularConvertedValueTab1[i]);
  44.                 }
  45.                 else
  46.                 {
  47.                         temp2=0;
  48.                         temp2=ADC_RegularConvertedValueTab1[i];
  49.                         Ul=Ul+temp2;
  50.                 printf("电阻R反向电压转换值=%dmV\r\n",ADC_RegularConvertedValueTab1[i]);
  51.                 }
  52.         }        
  53.         printf("Uh=%d,Ul=%d\r\n",Uh,Ul);
  54.         U=Uh-Ul; //正向和反向电压差
  55.         Data_R=U*1.0/(2*2*TestCurrent1*50);//计算交流电阻R
  56. }
  57. /************优值系数Z测试函数************/
  58. void Z_det()//Z值测试子函数 等待TEC工作稳定
  59. {
  60.         u32 Uadd=0,Ua=0,temp1,temp2;
  61.         double Ua1,Uadd1,Ur1;
  62.         u8 i,w;
  63.         flag=1;
  64.         DAC_DATA=(u16)(49.636*TestCurrent2);
  65.         DAC_WriteData();
  66.         delay_us(100);
  67.         GPIO_SetBits(GPIOA,GPIO_Pin_8);
  68.         ADC_Configuration_R_Z();        
  69.         Timer_Configuration();
  70.         TIM_Cmd(TIM3,ENABLE);        
  71.         for(w=WaitTime_S;w>0;w--)        //延时等待TEC工作在稳定状态
  72.         {
  73.                 delay_ms(500);
  74.                 delay_ms(500);
  75.         }
  76.         Z_TestStart=1;               
  77.         while(k<num)
  78.         {
  79.          //        printf("当前优值系数Z测试电流为:%d(mA)\r\n",Current());
  80.         }
  81.         TIM_Cmd(TIM3,DISABLE);
  82.         Z_TestStart=0;
  83.         k=0;
  84.         for(i=10;i<(num-10);i++)  //测量num-20次
  85.         {
  86.                 if(i%2==0)        //获取塞贝克电压值
  87.                 {
  88.                 temp1=0;
  89.                 temp1=ADC_RegularConvertedValueTab2[i];
  90.                 Ua=Ua+temp1;
  91.                 printf("              塞贝克电压Ua=%dmV\r\n",ADC_RegularConvertedValueTab2[i]);
  92.                 }
  93.                 else        //获取电阻电压与塞贝克电压之和电压值
  94.                 {
  95.                 temp2=0;
  96.                 temp2=ADC_RegularConvertedValueTab2[i];
  97.                 Uadd=Uadd+temp2;
  98.                 printf("电阻电压与塞贝克电压和Uadd=%dmV\r\n",ADC_RegularConvertedValueTab2[i]);
  99.                 }
  100.         }
  101.         Ua1=(double)((Ua-2500*50)/(2*50));
  102.         Uadd1=(double)((Uadd-2500*50)/(2*50));
  103.         Ur1=Uadd1-Ua1;
  104.         Data_Z=(double)(Ua1/(Ur1*Data_T));//塞贝克电压与电阻电压比值为优值系数Z值
  105. }
  106. 主函数main中用到的公式:
  107. Max_Temper_Differ=(double)((Data_T+273)-(sqrt(1+2*(Data_T+273)*Data_Z/1000)-1)/(Data_Z/1000));
  108. 直接利用子函数给全局变量Data_T和Data_Z赋值,通过Printf语句观察,全局变量确实被赋值了,然而这样得到的计算结果错误。
  109. 下面直接给全局变量赋值,所赋值的两个数是子函数计算结果:
  110. Data_T=8.58;
  111. Data_Z=1.42;                                                            
  112. Max_Temper_Differ=(double)((Data_T+273)-(sqrt(1+2*(Data_T+273)*Data_Z/1000)-1)/(Data_Z/1000));
  113. 得到的结果正确,两个值正是T_det()和Z_DET()两个子函的值。
 楼主| stevendaoyun 发表于 2013-7-3 09:20 | 显示全部楼层
自己顶一下,翘首企盼高手到来
pentral0311 发表于 2013-7-3 11:22 | 显示全部楼层
你得变量是否在中断中用过?
sun1238898 发表于 2013-7-3 11:42 | 显示全部楼层
你这个问题,完全是变量在处理的时候,造就的问题,你可以把这变量值在main函数当中应用的时候,将这三个全局变量再赋值给三个局部变量,然后在main函数当中,打印出这三个局部变量。就可以了解了。还有注意变量类型。
hawksabre 发表于 2013-7-3 19:17 | 显示全部楼层
问题解决了就好    楼上高手
 楼主| stevendaoyun 发表于 2013-7-3 23:36 | 显示全部楼层
sun1238898 发表于 2013-7-3 11:42
你这个问题,完全是变量在处理的时候,造就的问题,你可以把这变量值在main函数当中应用的时候,将这三个全 ...

这个我之前试过,打印出局部变量的值也是对的,但是计算结果和用全局变量一样,数据类型我再看看有没有问题
 楼主| stevendaoyun 发表于 2013-7-3 23:39 | 显示全部楼层
pentral0311 发表于 2013-7-3 11:22
你得变量是否在中断中用过?

没有在中断中用过,但是数据是在TIM3中断函数中采集,将采集的数据存在全局数组中,子函数通过数组中的数据计算出三个全局变量值
sun1238898 发表于 2013-7-4 09:59 | 显示全部楼层
我想应该是你的程序设计,哪里出现了异常,导致这样的问题,你再瞅瞅看看,
 楼主| stevendaoyun 发表于 2013-7-4 23:18 | 显示全部楼层
sun1238898 发表于 2013-7-4 09:59
我想应该是你的程序设计,哪里出现了异常,导致这样的问题,你再瞅瞅看看, ...

恩,今天一天在忙,没调程序,明天继续调程序
 楼主| stevendaoyun 发表于 2013-7-5 15:13 | 显示全部楼层
感谢各位热情帮助,问题解决了,是我数据处理出了点问题,打印函数中为了方便观察结果,将Data_Z乘以了1000
  1. printf("Data_Z:%f(1000/K)\r\n",Data_Z*1000);

而最大温差计算函数中直接用Data_Z带入我帖子了的代码是这样的:
  1. Max_Temper_Differ=(double)((Temper+273)-(sqrt(1+2*(Temper+273)*Data_Z/1000)-1)/(Data_Z/1000));

正确的是这样的:
  1. Max_Temper_Differ=(double)((Temper+273)-(sqrt(1+2*(Temper+273)*Data_Z)-1)/(Data_Z));
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

25

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部