AVR单片机ATMEGA16的ADC采样不连续问题!!

m16想采样ADC0引脚的电压,想精确到10位,但是我连续改变电压时,输出的数据却是跳跃的,有很多值就是搞不到。

例如我用下面的程序结果只能输出这些值:56
60
62
63
71
78
79
88
92
96
。中间的那些怎么都没有。
我用两个电位器微调电压,所以电压的连续性应该没有问题。不知道为什么采样达不到10位的精度。帮帮忙吧!!

#include<iom16v.h>

unsigned long angular,adth,adtl;
unsigned char count=0,adjok=0;
unsigned long speed=0;
unsigned long temp;
adinit()
{
ADMUX=0xc0;
ACSR=0x80;
ADCSRA=0xc8;
}
uinit()
{
UBRRL=51;
UCSRB|=0x88;
SREG|=0x80;

}

portinit()
{
DDRA=0;
PORTA=0x00;
}

delay(){
unsigned int i;
for(i=0;i<100;i++);
}
sendchar(char ch)
{
while(!(UCSRA&0x20));
UDR=ch;}

adjust()
{SREG&=0x7f;
speed=0;
angular=0;
count=0;
adjok=0;
SREG|=0x80;
}

#pragma interrupt_handler adcsvr:15
adcsvr()
{
adtl=ADCL;
adth=ADCH;

ADCSRA=0xc8;
//sendchar(adth);
sendchar(adtl);

angular=angular+((adth<<8)+adtl)*1000-speed;

if(adjok==0)
{
if(count<255) count++;
else
{adjok=1;
speed=angular/256;
}
}

}

main()
{
MCUCR=0x00;
uinit();
portinit();
adinit();
delay();
adjust();
while(1)
{
/*sendchar(adtl);
sendchar(angular>>24);
sendchar((angular>>16)&0xff);
sendchar((speed>>8)&0xff);
sendchar(speed&0xff);
delay();
*/

}

}

第1个回答  2011-07-21
基准电压有问题吧,另外电源电压不稳会引起ad值疯狂跳动,需要做滑动窗口滤波
相似回答