STC15W408AS
利用bandgap作為參考電壓,10位采集,什么原因導致測量的電壓總是精度為0.2V,有沒有哪位大佬處理過類似問題。
//初始化ADC
void AdInit()
{
P1ASF = 0x03; //00000011允許P1.0,P1.1執行ADC
ADC_RES = 0; ADC_RESL = 0; //清除ADC結果寄存器
CLK_DIV = 0x20; //00100000、ADRJ 為 1,
//ADC_RES 存放高兩位結果,
//ADC_RESL 存放低 8 位結果
ADC_CONTR = 0x88|0x01; //0x88是ADC_POWER|ADC_SPEEDLL|ADC_START的結果
delay_ms(20); //等待ADC穩定
EADC = 1; //允許AD轉換中斷
}
//獲取芯片出廠bandgap的ADC值(ADCbg)
void GetADCbg()
{
P1ASF = 0x00;
ADC_RES = 0; ADC_RESL = 0;
CLK_DIV = 0x20;
ADC_CONTR = 0x88; //ADC_POWER|ADC_SPEEDLL|ADC_START的結果
delay_us(2);
ADC_CONTR = 0x88|0x00; //啟動ADCbg第九通道的轉換
delay_us(5);
while(!(ADC_CONTR & ADC_FLAG)); //等待轉換完成
ADC_CONTR &= ~ADC_FLAG; //關閉ADC
ADCbg = (ADC_RES*256+ADC_RESL);
}
//獲取芯片出廠bandgap的電壓值(bandgap)
void bdgp()
{
uchar idata *iptr; //定義RAM內存區指針
iptr = ID_ADDR_RAM;
bandgap=*iptr++;
bandgap<<=8;
bandgap+=*iptr; //從內存區讀取BandGap電壓值(單位毫伏
}
void adc_isr()interrupt 5 using 1
{
static char VoCount,CrCount,m,ch;
static uint VoResult,CrResult;
ADC_CONTR &= !0x10; //CLOSE ADC ADC_FLAG復位
if(ch==0){
OPPCur = (float)bandgap*(ADC_RES*256+ADC_RESL)/ADCbg*cur_sampling/100; //
if(m==32){
if(CrCount < ADC_TIMES){
CrResult += (ADC_RES*256+ADC_RESL);
CrCount++;
}else{
CFt = (float)bandgap*(CrResult/ADC_TIMES)/ADCbg*cur_sampling/100;
CrCount = 0;
CrResult = 0;
}
}
}
if(ch==1){
OPPVol = ((float)bandgap*(ADC_RES*256+ADC_RESL)/ADCbg/vol_sampling)/100; //123V
if(m==32){
if(VoCount < ADC_TIMES){
VoResult += (ADC_RES*256+ADC_RESL);
VoCount++;
}else{
VFt = ((float)bandgap*(VoResult/ADC_TIMES)/ADCbg/vol_sampling)/100+voloffset;
VoCount = 0;
VoResult = 0;
}
}
}
if((m%33)==32) ch++;
m++;
if(m>32) m = 0;
if(ch>1)ch=0;
ADC_CONTR = 0x88|ch;
_nop_();_nop_();_nop_();_nop_(); //等待四個機器周期
}
|