ad采集加了滤波后,整个main.c函数运行不正常了?

2019-07-15 08:39发布

我是用adc0804采集压力传感器的压力,得到的电压值不稳定,会在0.492V和0.512V之间跳动,在ad部分加了滤波函数,加了后,整个main.c函数运行不正常了,好像ad没采集似的,一直显示如下界面,什么都不变化。传感器输出的电压,压力是电压换算得到的。 IMG_7408.JPG

这是我ad.c部分
************************
#include<reg51.h>
#include<intrins.h>

#include<string.h>
#include "adc.h"
#include "display.h"


uchar  recieve_volt;


extern uchar data date_tab[8];
extern uint PresValue;
/*******************************************************************/
/*                                                                 */
/*  启动AD转换子程序                                               */                                                         
/*******************************************************************/
void start_ad(void)
{       cs=0;                 //允许进行A/D转换
        wr=0;_nop_();wr=1; //WR由低变高时,AD开始转换
        //while(intr);          //查询转换结束产生INTR 信号(低电平有效)
        cs=1;                 //停止AD转换
}
/*******************************************************************/
/*                                                                 */
/* 读A/D数据子程序                                              */                                                         
/*******************************************************************/
unsigned int read_ad()
{       uint ad_data;
        ad0_7=0xff;
        cs=0;                 //允许读
        rd=0;                 //读取转换数据结果数据结果
        _nop_();
        ad_data=ad0_7;         //把数据存到ad_data中
        rd=1;cs=1;            //停止A/D读取
        return(ad_data);
}
/*******************************************************************/
/*                                                                 */
/*取平均值滤波函数                                      */                                                         
/*******************************************************************/
uchar ad_filter()                                             
{
    uchar i,U[10],min,max,R;
    uint sum;
    start_ad();
    for(i=0,sum=0;i<10;i++)              //测量十次,去除最大最小值后取平均值
    {
    U=read_ad();  sum+=U;      //获取ad结果
    }
    for(i=1,min=U[0];i<=9;i++)
    {
     if(U<min)  min=U;           //求最小值
    }
    for(i=1,max=U[0];i<=9;i++)
    {
     if(U>max)  max=U;           //求最大值
    }  
     R=(sum-min-max)/8;
    return R;                     //返回计算结果
}


/*******************************************************************/
/*                                                                 */
/*电压采集子程序                                           */                                                         
/*******************************************************************/
void  Volt_collect()
{
        uint Pressure;//采集的压力值变量
        
        recieve_volt=ad_filter();
        
        recieve_volt=recieve_volt*201;       //5.15/256*10000=201     
        recieve_volt=recieve_volt+100;       //ad精度只能是0.0201v,加0.01v误差校准是为了显示与实际相符
        date_tab[0]=recieve_volt/10000;     //整数                          
        date_tab[1]=recieve_volt%10000/1000; // 十分位                     
        date_tab[2]=recieve_volt%1000/100;   // 百分位  
        date_tab[3]=recieve_volt%100/10;     //千分位
               


        //Pressure=1000*date_tab[0]+100*date_tab[1]+10*date_tab[2]+date_tab[3]-170;
        //Pressure=Pressure/8.86/0.98;
        
        
        Pressure=1000*date_tab[0]+100*date_tab[1]+10*date_tab[2]+date_tab[3]-220;
  
        
        if(Pressure<0)
        {
        Pressure=0;
        }
        
        Pressure=Pressure/92.7/0.098;;        //转换成cmH2O
        PresValue  =Pressure;              //传给main文件的全局变量


        
        date_tab[4] = Pressure/1000;
        date_tab[5] = Pressure/100%10;
        date_tab[6] = Pressure/10%10;
        date_tab[7] = Pressure%10;        


}


************************


0条回答

一周热门 更多>