打印
[ZLG-MCU]

MAX144AD采集为何总是跳动?

[复制链接]
1135|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxr89c51|  楼主 | 2008-9-15 21:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为何采集的数据总是跳动?采用数字滤波。而且输入电压非常稳定。

实输入         跳变显示......
0通道:1V       1.24  1.12  1.07  1.62  1.73
1通道:1V       1.29  1.90  2.01  1.01  1.45

0通道:1.88V    1.07  1.25  730   980   773   1.42
1通道:1.68V    1.42  1.85  1.78  1.38  1.23  1.97

0通道:600mV    489   428   537   1.35  915  637
1通道:720mV    1.65  1.36  1.42  1.17  1.76

//*********************************************************
sbit Max144_CS    =P2^3;
sbit Max144_Do    =P1^4;
sbit Max144_Sck    =P1^2;
//*********************************************************
extern void Delay10uS(unsigned int i);
//*****************************************************************/
void SetMax144Init(void){
//    Max144_CS=1;    //关闭内部RC震荡
    Max144_Sck=1;    //它控制1-》内部震荡 ,0-》外部
    Max144_CS=0;    //启动内部RC震荡
    Delay10uS(1);     //10uS
    Max144_Sck=0;    //启动采样!
}
//*********************************************************
//    读取一个字节
unsigned int Rd_Max144(void){
    unsigned int i;
    unsigned char j;    

    i=0;
    Delay10uS(1);     //10uS
    //*******************************************
    //等待AD转换结束
    while (!Max144_Do);
    //*******************************************
    for(j=0;j<16;j++){
        Max144_Sck=1;    //输出数据
        i<<=1;
        if(Max144_Do)    ++i;
        Max144_Sck=0;
    }
    Max144_CS=1;
    Max144_Sck=1;    
    return i;
}
//*********************************************************
//计算电压值
float CountAD(unsigned int *p,unsigned char Long){
    #define MAX_U        2500    //满档电压 单位MV
    #define MAX_DATA    0x0fff    //分数
    unsigned long m;
    unsigned char i;
    m=0;
    i=Long;
    while(Long--){
        m +=*p++;    
    }
    m=m/i;
    return ((float)m*MAX_U/MAX_DATA);    
}
//**********************************************************
//MAX144数据处理 采用数字滤波
//**********************************************************
void GetMax144AD(float *p){
    #define MAX_AD_No        5 //平均的个数
    static unsigned int xdata CH0[MAX_AD_No];
    static unsigned int xdata CH1[MAX_AD_No];
    static unsigned char CH0_Piont=0,CH1_Piont=0;
    unsigned int i=0;

    SetMax144Init();
    i=Rd_Max144();
    if ((i & 0x1000)==0){
        CH0[CH0_Piont++]= (i & 0x0fff);
        if( CH0_Piont >= MAX_AD_No)        CH0_Piont=0;
        p[0]=CountAD(CH0,MAX_AD_No);
    }else{
        CH1[CH1_Piont++]= ( i & 0x0fff);
        if( CH1_Piont >= MAX_AD_No)        CH1_Piont=0;
        p[1]=CountAD(CH1,MAX_AD_No);
    }    
}

相关帖子

沙发
wahahaabc| | 2008-9-16 11:33 | 只看该作者

Rd_Max144(void)函数错误

使用特权

评论回复
板凳
wahahaabc| | 2008-9-16 11:43 | 只看该作者

w

//*********************************************************
//    读取一个字
unsigned int Rd_Max144(void){
    unsigned int i;
    unsigned char j;    

    i=0;
    Delay10uS(1);     //10uS
    //*******************************************
    //等待AD转换结束
    while (!Max144_Do);
    //*******************************************
    for(j=0;j<16;j++){
        i<<=1;
        // 读取1bit数据
        if(Max144_Do)
            i |= 1;

        // 给出clk,以便读取下一个bit数据
        Max144_Sck=1;    //输出数据
        
        // 加入延迟操作

        Max144_Sck=0;
    }
    Max144_CS=1;
    Max144_Sck=1;    
    return i&0x0FFF; // 屏蔽掉高4位,也可以不屏蔽
}

使用特权

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

本版积分规则

10

主题

22

帖子

0

粉丝