Hallo in die Runde,
ich bin auf diesen Gebiet noch ein Anfänger und habe nun ein kleines
Problem.
Ich möchte mit folgenden Code die Spannung messen mit der der Attiny45
versorgt wird. Dabei ist mir eine hohe(?) Differenz zwischen meinen
Multimeter und dem Attiny45 aufgefallen.
Hier die Daten:
Multimeter zeigt eine Spannung von 4,9 Volt an
Attiny45 jedoch nur 4,0 Volt macht eine Differenz von 0,9 Volt. Wenn ich
den Attiny45 mit 3x AA Akkus betreiben möchte und mir anzeigen möchte
wann die Akkus zu neige gehen habe ich bei so einer hohen Differenz ja
fast keine Chance frühzeitig die Akkus zu wechseln.
Bei den Akkus wird nur ein sehr geringer Strom entnommen da die meiste
Zeit der Attiny45 schläft. Welchen Wert würdet ihr nehmen? Sind 1,2 Volt
schon zu spät (Bei der Schwankung bestimmt)?
Bei Alkalime Batterien hätte ich dieses Problem ja nicht so stark da die
Spannung fast konstant abnimmt was jedoch bei Akkus fast nicht der Fall
ist.
Wie kann ich meinen Code verbessern um eine genauere Messung mir
anzeigen zu lassen?
1 | int led = 1; //Pin der LED
|
2 | int adc_low, adc_high; //Zwischenspeicher für die Ergebnisse des ADC
|
3 | long adc_result; //Gesamtergebnis der Messung des ADC
|
4 | long vcc; //Versorgungsspannung
|
5 |
|
6 | void setup() {
|
7 | pinMode(led, OUTPUT);
|
8 |
|
9 | ADMUX |= (1<<REFS1); //VCC als Referenzspannung für den AD-Wandler
|
10 | ADMUX |= (1<<MUX3) | (1<<MUX2) | (1<<MUX1); //1.1V Referenzspannung als Eingang für ADC
|
11 | delay(10); //warten bis sich die Referenzspannung eingestellt hat
|
12 | ADCSRA |= (1<<ADEN); //ADC aktivieren
|
13 | }
|
14 |
|
15 | // the loop routine runs over and over again forever:
|
16 | void loop() {
|
17 | ADCSRA |= (1<<ADSC); //Messung starten
|
18 |
|
19 | while (bitRead(ADCSRA, ADSC)); //warten bis Messung beendet ist
|
20 | //Ergebnisse des ADC zwischenspeichern. Wichtig: zuerst ADCL auslesen, dann ADCH
|
21 | adc_low = ADCL;
|
22 | adc_high = ADCH;
|
23 |
|
24 | adc_result = (adc_high<<8) | adc_low; //Gesamtergebniss der ADC-Messung
|
25 | vcc = 1125300 / adc_result; //Versorgungsspannung in mV berechnen (1100mV * 1023 = 1125300)
|
26 |
|
27 | //wenn Spannung kleiner als 4V
|
28 | if (vcc < 4000)
|
29 | {
|
30 | digitalWrite(led, HIGH); //schalte LED an
|
31 | }
|
32 | //wenn größer oder gleich 4V
|
33 | else
|
34 | {
|
35 | digitalWrite(led, LOW); //schalte LED aus
|
36 | }
|
37 |
|
38 | delay(500);
|
39 | }
|
Danke und Gruß
Torsten
PS: Den Code habe ich aus dem Internet und nur die Werte für ADMUX laut
Datenblatt angepasst.