atmega16单片机AD转化误差太大,怎么提高精度?

atmega16单片机AD转化误差太大,技术手册上说AD转换有10位精度,
可以推出: 如果测量范围是:0~5.03V,那么按照10位精度来说,5.03/1024=4.9mV,也就是可以测量到5mV
但是,实际测量精度是:只能正确的测量到V级别,就别提精确测量到5mV级别了.
我想问:1,如何提高AD转化精度?
2,测量效果这么差,是由于我硬件有问题呢, 还是我的软件有问题?
硬件图纸如下:

软件部分程序如下:开发环境是:iar embedded workbench IDE
void InitADC(void)
{
ADCH &= 0X03;
ADCSRA = 0X00;
ADMUX = 0x41; //选择通道A1,AVCC作为参考电压,转化结果右对齐
ACSR = 0X80; //模拟比较器关闭
SFIOR &= 0x1F;
SFIOR |= 0x80; //自动触发源选择:定时器0溢出
ADCSRA = 0XAF; //使能ADC和自动触发,128分频中断使能,16us
ADCSRA |= DB7; //开始转换
}
void T0Init(void)
{
TCCR0 = 0X05; //1024分频,晶振8MHz,128us
TCNT0 = 0xb1; //10ms
//TIMSK &= 0xfe; //停止定时溢出中断使能
TIMSK |= 0x01; //定时溢出中断使能
}

#pragma vector=ADC_vect
__interrupt void adc_isr(void)
{
ADC_cnt++;
ADCSRA &= 0x7F; //停止转换
ADCSRA = 0X00;
if(ADC_cnt>1)
{
ADC_cnt = 0;
ADC_value += ADCL;
ADC_value += (ADCH*256);
voltage = (((float)ADC_value)*0.004921);//4.921875
ADC_value = 0;
}
ADCH &= 0X03;
ADCSRA = 0XA8; //使能ADC和自动触发,128分频中断使能,16us
ADCSRA |= DB7; //开始转换
ADC_finish_flag = 1;
}

不知道是不是你那个浮点数应用方面是否有问题,
voltage = (((float)ADC_value)*0.004921);//4.921875

这个地方?
不至于只有V级的精度啊,你可以试试让你的系统直接显示采样值ADC_value,并改变采样点的电压看看。是否按理论值变化,如果是,那就是上面浮点数转换计算有问题,没有,那就考虑考虑硬件电路。。。看起来硬件电路没什么问题的。。。追问

应该是硬件方面的问题.

追答

AD输入波动大?还是单片机电源电压波动大?如果电源波动大那就用基准电压源TL431之类的。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答