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_(); //等待四个机器周期
}
|