自已DIY一个移动电源,单片机用的是ATTINY24A 锂电池供,为了检测USB端口上的电流,发现ADC采集信号非常不准,查了一天,慢慢发现问题的真相。如果,当ADC3测量电池电压,读数正常,程序又去采集ADC1通道的USB电流就非常不准。如果我不测量ADC3,只测量ADC1,ADC1又十分准确。我在想是不是ATTINY24A通道切换的时候比较长,在两次采样加了延时,一样不准,只要打开了ADC3,再测ADC1就没办法了。8M内部时钟,64分频,ADC时钟125K,完全在数据手册的范围内。我无助了。求指点。
unsigned int adc_bat()
{
unsigned int a=0;
DDRA&=~BIT(3);
ADMUX=0X83;//选用内部1.1V参考源,3通道
ADCSRA=0X86;//64分频
ADCSRA|=BIT(6);
while((ADCSRA&0X10)==0)
{
;
}
a=ADC;
ADMUX=0X00;
ADCSRA=0X00;
return(a);
}
unsigned int adc_usb1()// USB
{
unsigned int a=0;
DDRA&=~BIT(1);
PORTA&=~BIT(1);
ADMUX=0X81;//选用内部1.1V基准为参考源,1通道
ADCSRA=0X86;//
ADCSRA|=BIT(6);
while((ADCSRA&0X10)==0)
{
;
}
a=ADC;
ADMUX=0X00;
ADCSRA=0X00;
return(a);
}
主程序内的一段程序
if(temp_ok==1)//电池有电
{
usb_en();
usb_adc_temp1=adc_usb1();
if(usb_adc_temp1>7) //80ma
{
led_r(0);
led_g(1);
}
else
{
led_r(1);
led_g(0);
}
}
else //电池没有电
{
usb_dis();//关USB
// led_r(1);
// led_g(0);
}
我只要在主循环加一句
adcbat_temp=adc_bat();//adc转换采集 ADC3通道
然后 usb_adc_temp1=adc_usb1(); 读出来的数据就不准了,两个指示灯都会亮,说明ADC1读到值离散性比较大。只要把前ADC3通道取消,就正常州了。求指教
|