打印

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

[复制链接]
2487|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stevendaoyun|  楼主 | 2013-7-2 21:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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()两个子函的值。
沙发
stevendaoyun|  楼主 | 2013-7-3 09:20 | 只看该作者
自己顶一下,翘首企盼高手到来

使用特权

评论回复
板凳
pentral0311| | 2013-7-3 11:22 | 只看该作者
你得变量是否在中断中用过?

使用特权

评论回复
地板
sun1238898| | 2013-7-3 11:42 | 只看该作者
你这个问题,完全是变量在处理的时候,造就的问题,你可以把这变量值在main函数当中应用的时候,将这三个全局变量再赋值给三个局部变量,然后在main函数当中,打印出这三个局部变量。就可以了解了。还有注意变量类型。

使用特权

评论回复
5
hawksabre| | 2013-7-3 19:17 | 只看该作者
问题解决了就好    楼上高手

使用特权

评论回复
6
stevendaoyun|  楼主 | 2013-7-3 23:36 | 只看该作者
sun1238898 发表于 2013-7-3 11:42
你这个问题,完全是变量在处理的时候,造就的问题,你可以把这变量值在main函数当中应用的时候,将这三个全 ...

这个我之前试过,打印出局部变量的值也是对的,但是计算结果和用全局变量一样,数据类型我再看看有没有问题

使用特权

评论回复
7
stevendaoyun|  楼主 | 2013-7-3 23:39 | 只看该作者
pentral0311 发表于 2013-7-3 11:22
你得变量是否在中断中用过?

没有在中断中用过,但是数据是在TIM3中断函数中采集,将采集的数据存在全局数组中,子函数通过数组中的数据计算出三个全局变量值

使用特权

评论回复
8
sun1238898| | 2013-7-4 09:59 | 只看该作者
我想应该是你的程序设计,哪里出现了异常,导致这样的问题,你再瞅瞅看看,

使用特权

评论回复
9
stevendaoyun|  楼主 | 2013-7-4 23:18 | 只看该作者
sun1238898 发表于 2013-7-4 09:59
我想应该是你的程序设计,哪里出现了异常,导致这样的问题,你再瞅瞅看看, ...

恩,今天一天在忙,没调程序,明天继续调程序

使用特权

评论回复
10
stevendaoyun|  楼主 | 2013-7-5 15:13 | 只看该作者
感谢各位热情帮助,问题解决了,是我数据处理出了点问题,打印函数中为了方便观察结果,将Data_Z乘以了1000
printf("Data_Z:%f(1000/K)\r\n",Data_Z*1000);

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

正确的是这样的:
Max_Temper_Differ=(double)((Temper+273)-(sqrt(1+2*(Temper+273)*Data_Z)-1)/(Data_Z));

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

25

帖子

1

粉丝