?? adc.c
字號(hào):
/*
數(shù)字濾波采用限幅+遞推均值濾波法
*/
#include<def.h>
#define f 10 //濾波器的頻率,HZ
#define fadc 2457600 //ADC時(shí)鐘
#define fcode fadc/f/128 //tm7707濾波器的值
ulong databuf[6]={0,0,0,0,0,0};
ulong dataave[6]={0};
//---------------------------------------------adc_8bit串行數(shù)據(jù)輸入程序-----------------------------------------------------------------------
//上升沿傳輸數(shù)據(jù)
void adc_in8bit(uchar adc_data)
{
uchar m;
DIN=1;
SCLK=1;
for(m=0;m<8;m++)
{
SCLK=0;
if((adc_data&0x80)!=0)
{
DIN=1;
}
else
{
DIN=0;
}
SCLK=1;
adc_data=adc_data<<1;
}
}
//下降沿傳輸數(shù)據(jù)
void adc_in8bit_neg(uchar adc_data)
{
uchar m;
DIN=1;
for(m=0;m<8;m++)
{
SCLK=1;
if((adc_data&0x80)!=0)
{
DIN=1;
}
else
{
DIN=0;
}
SCLK=0;
adc_data=adc_data<<1;
}
}
//---------------------------------------------adc_8bit串行數(shù)據(jù)輸出程序-----------------------------------------------------------------------
//上升沿傳輸數(shù)據(jù)
uchar adc_out()
{
uchar m,k;
DOUT=1; //端口設(shè)置輸入口
SCLK=1;
for(m=0;m<8;m++)
{
SCLK=0;
k=k<<1;
if(DOUT==0)
{
k=k&0xfe;
}
else
{
k=(k|0x01&0xff);
}
SCLK=1;
}
return(k);
}
//下降沿傳輸數(shù)據(jù)
uchar adc_out_neg()
{
uchar m,k;
DOUT=1; //端口設(shè)置輸入口
for(m=0;m<8;m++)
{
SCLK=1;
k=k<<1;
if(DOUT==0)
{
k=k&0xfe;
}
else
{
k=(k|0x01&0xff);
}
SCLK=0;
}
return(k);
}
//---------------------------------------------ADC轉(zhuǎn)換控制程序---------------------------------------------------------------------------------
uint adc7705_con()
{
uchar datal;
uint adcdata=0;
do
{
adc_in8bit(0x08); //寫通訊寄存器,選擇下一步讀通訊寄存器
datal=adc_out(); //讀通訊寄存器,等待最高位為0
}
while((datal&0x80)==0x80);
adc_in8bit(0x38); //寫通訊寄存器,選擇下一步讀數(shù)據(jù)寄存器
//讀數(shù)據(jù)寄存器
adcdata=adc_out();
adcdata<<=8;
adcdata|=adc_out();
return (adcdata);
}
uint adc7715_con()
{
uchar datal;
uint adcdata=0;
do
{
adc_in8bit(0x0b); //寫通訊寄存器,選擇下一步讀通訊寄存器
datal=adc_out(); //讀通訊寄存器
}
while((datal&0x80)==0x80);
adc_in8bit(0x3b); //寫通訊寄存器,選擇下一步讀數(shù)據(jù)寄存器
//讀數(shù)據(jù)寄存器
adcdata=adc_out();
adcdata<<=8;
adcdata|=adc_out();
return (adcdata);
}
ulong adc7707_con()
{
uchar datal;
ulong adcdata=0;
do
{
adc_in8bit_neg(0x0c); //寫通訊寄存器,選擇下一步讀通訊寄存器
datal=adc_out_neg(); //讀通訊寄存器
}
while((datal&0x80)==0x80); //等待最高位為0
adc_in8bit_neg(0x5c); //寫通訊寄存器,選擇下一步讀數(shù)據(jù)寄存器
//讀數(shù)據(jù)寄存器
adcdata=adc_out_neg();
adcdata<<=8;
adcdata|=adc_out_neg();
adcdata<<=8;
adcdata|=adc_out_neg();
return (adcdata);
}
//-----------------------------------------------adc初始化程序------------------------------------------------------------
void adcinit()
{
uchar p;
//發(fā)送連續(xù)40個(gè)時(shí)鐘
DIN=1;
for(p=0;p<40;p++)
{
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
}
if(adcbit1==0)
{
if(adcbit0==0)
{
//tm7705初始化
adc_in8bit(0x20); //寫通訊寄存器,選擇下一步寫時(shí)鐘寄存器,CH1通道
adc_in8bit(0x84); //寫時(shí)鐘寄存器,使用2.4576M晶體,輸出更新速率20HZ
adc_in8bit(0x10); //寫通訊寄存器,選擇下一步寫設(shè)置寄存器
adc_in8bit(0x7c); //寫設(shè)置寄存器,G=128,單極性,無緩沖
}
else
{
//tm7715初始化
adc_in8bit(0x13); //寫通訊寄存器,選擇下一步寫設(shè)置寄存器,G=128
adc_in8bit(0x60); //寫設(shè)置寄存器
}
}
else
{
//tm7707初始化
adc_in8bit_neg(0x24); //寫通訊寄存器,選擇下一步寫濾波器高8位
adc_in8bit_neg(0xe0|(fcode/256)); //寫濾波器高8位
adc_in8bit_neg(0x34); //寫通訊寄存器,選擇下一步寫濾波器低8位
adc_in8bit_neg(fcode%256); //寫設(shè)置寄存器
adc_in8bit_neg(0x14); //寫通訊寄存器,選擇下一步寫設(shè)置寄存器
adc_in8bit_neg(0x3c); //寫設(shè)置寄存器,設(shè)置增益為16,自校準(zhǔn),并啟動(dòng)AD轉(zhuǎn)換
}
}
//--------------------------------------------------ADC數(shù)據(jù)處理--------------------------------------------------------------
ulong adccon()
{
uchar i,j;
ulong idata temp,adcresult;
ulong idata adcdata_new,adcdata_now,adcdata_old;
//采集數(shù)據(jù)
if(adcbit1==0)
{
if(adcbit0==0)
{
adcdata_new=adc7705_con();
}
else
{
adcdata_new=adc7715_con();
}
}
else
{
adcdata_new=adc7707_con();
}
//數(shù)據(jù)處理
if(adcdata_new>=adcresult)
{
temp=adcdata_new-adcresult;
}
else
{
temp=adcresult-adcdata_new;
} //得到新的數(shù)據(jù)與濾波器值的差值
if(temp>data_th)
{
//比較上一次ADC的數(shù)據(jù)與本次濾波器的差值是否大于閥值
if(adcdata_old>=adcresult)
{
temp=adcdata_old-adcresult;
}
else
{
temp=adcresult-adcdata_old;
} //得到上次ADC的數(shù)據(jù)與濾波器值的差值
if(temp>data_th)
{
//稱重發(fā)生變化
dataave[0]=dataave[1]=dataave[2]=dataave[3]=dataave[4]=dataave[5]=adcdata_new; //用新的ADC的數(shù)據(jù)代替濾波器中的所有數(shù)據(jù)
adcdata_old=adcdata_new; //更新上次ADC采集到的數(shù)據(jù)
adcresult=(dataave[1]+dataave[2]+dataave[3]+dataave[4])/4;
return (adcresult); //返回平均值
}
else
{
adcdata_now=adcresult; //認(rèn)為是干擾
}
}
else
{
adcdata_now=adcdata_new;
}
adcdata_old=adcdata_new; //更新上次ADC采集到的數(shù)據(jù)
//采用遞推平均濾波
databuf[5]=databuf[4];
databuf[4]=databuf[3];
databuf[3]=databuf[2];
databuf[2]=databuf[1];
databuf[1]=databuf[0];
databuf[0]=adcdata_now;
dataave[5]=dataave[4];
dataave[4]=dataave[3];
dataave[3]=dataave[2];
dataave[2]=dataave[1];
dataave[1]=dataave[0];
dataave[0]=(databuf[0]+databuf[1]+databuf[2]+databuf[3]+databuf[4]+databuf[5])/6;
//將得到的數(shù)據(jù)按照從小到大的順序排列
for(j=0;j<5;j++)
{
for(i=0;i<5-j;i++)
{
if(dataave[i]>dataave[i+1])
{
temp=dataave[i];
dataave[i]=dataave[i+1];
dataave[i+1]=temp;
}
}
}
adcresult=(dataave[1]+dataave[2]+dataave[3]+dataave[4])/4;
return (adcresult); //返回平均值
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -