用mega48的AD,用内部1.1V的基准,单次转换,出来的数据误差很大,是什么原因呢?
结果如下,测了几个数值,输入电压越低误差越大。如果是几个数字的误差,还能修正。可是输入电压低时有18个字的误差!!
输入电压V | 基准电压V | 应得值 | 测得值 | 0.019 | 1.07 | 18 | 1 | 0.027 | 1.07 | 26 | 8 | 0.064 | 1.07 | 61 | 45 | 0.091 | 1.07 | 87 | 69 | 0.15 | 1.07 | 144 | 126 | 0.184 | 1.07 | 176 | 158 | 0.187 | 1.07 | 179 | 161 | 0.395 | 1.07 | 378 | 372 | 0.463 | 1.07 | 443 | 435 | 0.86 | 1.07 | 823 | 820 |
单片机5V供电,程序见下,winavr
void ADC_Init()
{
Adc_DDR=0;
Adc_PORT=0;
DIDR0=0x3f; //禁止管脚数字寄存器。
ADMUX=(1<<REFS1)|(1<<REFS0); //内部1.1V基准.
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //64分频,125K.
}
//
void AtoD(void)
{
uint8_t i=0;
uint8_t j;
// ADMUX&=0xf0;
ADMUX=(1<<REFS1)|(1<<REFS0); //内部1.1V基准.
while(i<6) //6
{
// if(i==2)ADMUX=0xce;
_delay_us(50); //测量内部1.1,需要延时50us,测量才准确。
for(j=0;j<4;j++)
{
if(j==0)ad_data=0;
ADCSRA|=(1<<ADSC);
loop_until_bit_is_clear(ADCSRA,ADSC); // wait until ADC is finish;
ad_data+=ADC;
}
ad_data=ad_data/4;
ADMUX+=1;
i++;
}
} |