串口發送BGV5的值為0x04D9, 換算為電壓為1242mv,與芯片讀取的電壓一致。看起來應該沒有問題,
但芯片5V vcc供電,但實際串口發送的是4238mv, ADC采集vcc供電的電壓也是4238mv, 請再幫忙解釋一下。
uint idata BGV5 _at_ 0xef;
void main()
{
uchar i;
P1M0 = 0x00;P1M1 = 0x80; //P1.7高阻用作ADC輸入
P3M0 = 0x00;P3M1 = 0x00;
P5M0 = 0x00;P5M1 = 0x00;
InitUart(); //初始化串口
InitADC(); //初始化ADC
//BGV5=IapReadByte(IAP_ADDRESS)<<8|IapReadByte(IAP_ADDRESS+1);//程序開始時讀取EEPROM中保存的BandGap數據
//BGV5=0x04D9;
/*if(BGV5==0xffff) //如果EEPROM中沒有有效數據
{
BGV5=0x0100; //內部BandGap參考電壓在標準5V VCC的ADC轉換值
IapEraseSector(IAP_ADDRESS); //擦除EEPROM
IapProgramByte(IAP_ADDRESS, BGV5>>8);//寫高8位
IapProgramByte(IAP_ADDRESS+1, BGV5);//寫低8位
}*/
while (1)
{
P1ASF = 0x00; //不設置P1口為模擬口,開通ADC內部第9通道
Delay_ms(1);
BGVx=GetADCResult(0); //讀ADC的內部第9通道
// 當前VCC_mV = 標準電壓mV * 標準電壓BandGap轉換值 / 當前電壓BandGap轉換值
VCC = 5000*(long)BGV5/BGVx; //計算當前VCC電壓
dis_buf[0]=VCC/1000%10+'0';
dis_buf[1]=VCC/100%10+'0';
dis_buf[2]=VCC/10%10+'0';
dis_buf[3]=VCC%10+'0';
dis_buf[4]=' ';
P1ASF = 0x80; //設置P1.7為模擬口,開通ADC第8通道
Delay_ms(1);
VINx=GetADCResult(7); //讀ADC的第8通道
VIN=VCC*(long)VINx/1023; //計算第8通道當前輸入電壓
dis_buf[5]=VIN/1000%10+'0';
dis_buf[6]=VIN/100%10+'0';
dis_buf[7]=VIN/10%10+'0';
dis_buf[8]=VIN%10+'0';
dis_buf[9]='\n';
for(i=0;i<10;i++)
SendData(dis_buf[i ]); //串口發送當前VCC電壓和當前輸入電壓
// SendData((BGV5>>8)&0xff);
// SendData(BGV5&0xff);
Delay_ms(1000);
}
}
|