我一直在ATmega 32的ADC项目中工作 我的ADC是10位分辨率,Vref = 2.56V(内部 根据这些信息,我可以得出结论,步长= 2.56 / 1024 = 2.5mV
然后,如果输入电压为2.5伏,则数字数据输出必须为2.5V /2.5mV = 1000 = 0b1111101000
我已经制作了代码并在proteus中进行了模拟,但是当输入电压为2.5V时,输出为999(十进制)= 0b1111100111而不是1000为什么?? !!
注意:数字数据输出正确调整
这是我的代码:
int main(void)
{
DDRB = 0xFF;
DDRD = 0xFF;
DDRA = 0;
ADCSRA = 0x87; //ADC enable, clk/128
ADMUX = 0xC0; //Internal vref, single ended ADC0
while(1){
ADCSRA |=(1<<ADSC); //start conversion
while(ADCSRA & (1<<ADIF) == 0);
PORTD = ADCL;
PORTB = ADCH;
}
return 0;
}
这是proteus模拟的输出
答案 0 :(得分:4)
你的数学有点偏差。在0V时,ADC输出为0,因此只有 1023 步长才能达到2.56V。
2.5V /(2.56V / 1023)= 999.02344