Próbuję wykonać pomiary napięcia baterii.
Napięcie podłączam do ADC1 (PB2) przez dzielnik napięcia; górny resytor 4,7k dolny 1k.
init ADC:
Kod:
ADMUX |= (1 << MUX0);
ADMUX |=(1<<REFS0);
ADCSRA |= (1 << ADEN);
ADMUX |= (1 << ADLAR);
ADCSRA |= (1 << ADPS0)|(1 << ADPS2);
zegar wew. 4,8MHz
pomiaru dokonuję tak:
Kod:
//make mesurements
for ( i=0;i<50;++i){
//_delay_ms(50);
ADCSRA |= (1<<ADSC);
//while( !(ADCSRA & (1<<ADSC)) );
while (ADCSRA & (1 << ADSC));
//_delay_ms(100);
batt_level+=ADCH;
//average:
}
i potem dzielę oraz przynaję wynikowi odpowiadajacy poziom naładowania baterii, potem diodą wymiguję poziom jej naładowania:
Kod:
batt_level/=50;
batt_level=0; //error state
if(batt_level>_0)batt_state=0;
if(batt_level>_10)batt_state=1;
if(batt_level>_20)batt_state=2;
if(batt_level>_30)batt_state=3;
if(batt_level>_40)batt_state=4;
if(batt_level>_50)batt_state=5;
if(batt_level>_60)batt_state=6;
if(batt_level>_70)batt_state=7;
if(batt_level>_80)batt_state=8;
if(batt_level>_90)batt_state=9;
if(batt_level>_100)batt_state=10;
if(batt_level>800)batt_state=20; //error state
for( i=0;i<batt_state+1;++i){
PORTB|=(1<<PB4);
for(uint8_t g=0;g<11-batt_state;++g)
_delay_ms(30);
PORTB&=~(1<<PB4);
for(uint8_t g=0;g<11-batt_state;++g)
_delay_ms(30);
};
Problem mój jest taki zawsze moje pomiary to między 149 a 143 czyli dioda miga 5 razy. A napięcie mierzone miernikiem jest zupełnie inne.
Napięcie zasilania to ogniwo li-ion.