P0_4用作adc时出现的问题
我现在用p0_4来ADC,P0_2和p0_3用作485通信,输入的电压通过560k 和220k电阻分压, 220k电阻接地,若在220k 并联100nf的电容,测试到的电压为4037,若把100nf电容去掉,则测试到的电压为2567mv,现在是采用的12 bit的分辨率,ad ref是内部的1.25v。单次触发ad方式,请大家帮我分析是什么问题,谢谢。
/******************************************************************************
*函 数 名:InitADC
*功 能:ADC初始化
*入口参数:参考电压 reference、转换通道 channel、分辨率resolution
*出口参数:ADC转换结果
******************************************************************************/
uint16 Read_advalue(uint8 reference, uint8 channel, uint8 resolution)
{
uint16 value;
uint16 buf=0;
uint8 loop;
uint8 tmpADCCON3 = ADCCON3;
APCFG |= 1 << channel ; //设置ADC输入通道,模拟I/O使能
delay_us(20000);
for(loop=0;loop<10;loop++)
{
ADCIF = 0;
ADCCON3 = (reference | resolution | channel);
//
while(!ADCIF); //等待 AD 转换完成
value = ADCL >> 2; //ADCL 寄存器低 2 位无效
value |= ((uint8)ADCH << 6); //连接AD转换结果高位和低位
buf+=value;
}
buf/=10;
value=buf;
//根据分辨率获得ADC转换结果有效位
switch(resolution)
{
case ADCCON2_Sdiv_64: value >>= 7;break; //7 bit ad
case ADCCON2_Sdiv_128: value >>= 5;break; //9 bit ad
case ADCCON2_Sdiv_256: value >>= 4;break; //10
case ADCCON2_Sdiv_512: value >>= 2;break; //12bit
default:;
}
ADCCON3 = tmpADCCON3;
return (value);
先单独接一个电压表,看看两种情况下,实际电压各是多少
然后对于TI的ADC,精度没有标称的那么高,要多次采样求平均,适当增加一些延时