本帖最后由 tianxj01 于 2018-6-30 17:59 编辑
先请看代码:
#define ADC_CHIN ADCCON0&=0xF0;ADCCON0|=0x08; //内部带隙基准
#define ADC_EN ADCCON1|=SET_BIT0;
#define RESET EA =0;TA=0xAA;TA=0X55;CHPCON|=0x80
#define UN_TA TA=0xAA;TA=0X55
#define UID_AP 0x04
u16 ADC_RUN_12(void)
{
u16 ADC_TMP=0;
clr_ADCF;
set_ADCS; // Each time ADC start trig signal
while(ADCF == 0);
ADC_TMP=ADCRL;
ADC_TMP+=ADCRH<<4;
return (ADC_TMP);
}
u16 READ_BANDGAP()
{
u8 iii,BIT_TMP,READ_TMP[2];
u16 Bandgap,Vin_tmp;
u32 xdata tmp_32;
BIT_TMP=EA;
EA =0;
UN_TA;
CHPCON |= 0x01; //IAPEN = 1, enable IAP mode CHPCON TA保护
IAPCN =UID_AP;
IAPAH=0;
for(iii=0;iii<2;iii++)
{
IAPAL=iii+0x0C;
UN_TA;
IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process
READ_TMP[iii]=IAPFD;
}
UN_TA;
CHPCON &= ~0x01; //IAPEN = 0, disable IAP mode
Vin_tmp=READ_TMP[1]&0x0F;
Vin_tmp+=READ_TMP[0]<<4;
//丢掉4次测试
ADC_CHIN;
for(iii=0;iii<4;iii++)
{
ADC_RUN_12();
}
Bandgap=0;
for(iii=0;iii<16;iii++)
{
Bandgap+=ADC_RUN_12();
}
Bandgap/=16;
tmp_32=3072;
tmp_32*=Vin_tmp;
tmp_32/=Bandgap;
Bandgap=tmp_32;
EA = BIT_TMP;
return (Bandgap);
}
程序就是这些,调试都可以,问题是这样:目标板子,读内部UID后的2字节0C 0D 2字节 数据是:0X68,0X93.按照官方用法,拼起来=0x0683=十进制1667,根据官方公式,内部基准实际数据应该=1667*3072/4096=1250mV。
现在问题就来了,确定了带隙基准准确值,反推单片机电压Bandgap 都是错的。实际被调试机器,VCC=4.98V 而用该电压做基准,丢弃前面4次结果,后连续测量16次平均获得的内部带隙基准值大概在0x03F3到0x03F0之间,
理论上,该值应该在(1250/4980)X4096=0X0404,误差非常大。
这个情况,不知道什么原因,希望来个新唐技术支持,能够给分析支持一下。
|