串口发送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);
}
}
|