Hi,
Ich will gerade in einer Schaltung mit einem tiny461 den eigenen
Batterie-Status überwachen.
dazu habe ich Vref auf VCC gestellt und mux auf 1.1V
1 | /**
|
2 | * \return supply voltage in [V/100]
|
3 | */
|
4 | static uint16_t getBatteryState()
|
5 | {
|
6 | uint16_t vBat;
|
7 | ADMUX = (0<<REFS1) | (0<<REFS0) // VCC
|
8 | | (1<<ADLAR) // leftadjust result
|
9 | | (30 << MUX0); // Chanel 30 -> 1.1V
|
10 | ADCSRB = 0;
|
11 | ADCSRA = (1<<ADEN) | (1<<ADSC)
|
12 | | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // 16 --> 125kHz
|
13 | while( ADCSRA & (1<<ADSC)){
|
14 | /* do nothing */;
|
15 | }
|
16 | ADCSRA = (1<<ADSC);
|
17 | while( ADCSRA & (1<<ADSC)){
|
18 | /* do nothing */;
|
19 | }
|
20 | // measuring 1.1V with battery voltage as reference
|
21 | // -> ADCH = (1.1*256) / V_bat // with left adjusted result
|
22 | // V_bat = 281.6V/ADCH
|
23 | // V_bat = 28160/ADCH * 1V/100
|
24 | //
|
25 |
|
26 | vBat = 28160/ADCH;
|
27 | ADCSRA = 0;
|
28 | return vBat;
|
29 | }
|
Ich bekomme immmer Werte um die 3.5V, obwohl ich an 5V hänge
Außerdem habe ich festgestellt, dass der Wert abhängig davon zu sein
scheint, was an einem anderen Pin, den ich in einer anderen Routine
Messe, anliegt.
1 | static bool getPinState()
|
2 | {
|
3 | bool res;
|
4 | ADMUX = (1<<REFS1) | (0<<REFS0) //internal 2.56 without cap on aref
|
5 | | (1<<ADLAR) // leftadjust result
|
6 | | (MONITORED_ADC_CHAN << MUX0);
|
7 | ADCSRB = (1<<REFS2) ;
|
8 | ADCSRA = (1<<ADEN) | (1<<ADSC)
|
9 | | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // 2 --> 1000kHz -> no full resolution
|
10 | while( ADCSRA & (1<<ADSC)){
|
11 | /* do nothing */;
|
12 | }
|
13 | ADCSRA = (1<<ADSC);
|
14 | while( ADCSRA & (1<<ADSC)){
|
15 | /* do nothing */;
|
16 | }
|
17 | res = ADCH > 70;
|
18 | ADCSRA = 0;
|
19 | return res;
|
20 | }
|
testweise rufe ich die hintereinander auf. Später werden die in recht
großen abständen aufgerufen, deswegen auch die deaktivierung und
neuintialisierungen des ADCs.
Ich hab schon testwesie eine Mssung eingeführt, die ich verwerfe, was
aber unnötig sein sollte, wenn der ADC nicht läuft, wärend des
Umstellens von ref und mux. Ändert aber auch nix.
was übersehe ich, hat jemand einen Tip?