为何采集的数据总是跳动?采用数字滤波。而且输入电压非常稳定。
实输入 跳变显示...... 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); } }
|