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();
*/
}
}