budo's Web
Hier finden ihr einiges zu meinen Hobbies

Arduino Stromverbrauchsmessung und andere AD-Wandler Messungen

Zur Messung des Stromverbrauchs eines Arduino durch den Arduino selbst, ist ein High-Side Current Shunt Monitor, wie z.B. der AD8217, erforderlich. Bei der Strommessung High-Side liegt die Last gegen Masse und nicht wie üblich der Shunt-Widerstand. Dies ermöglicht einen Arduino als Last zu sehen und mit dem Arduino eine Spannung per ADW zu messen, die beim Arduino auf Masse bezogen sein muss. Der AD8217 verstärkt den Spannungsabfall am Shunt um den Faktor 20 und kann dann per Arduino ADC gemessen werden. Die AD8217 Ausgangsspannung ist Vout = 20 * Vshunt = 20 * Rshunt * Ishunt.

Bei wahlweisen Shunt-Widerständen von 0.1, 1.0 und 10 Ohm ergeben sich bei einer Referenzspannung des ADC von 5 Volt maximale messbare Ströme von 2.5, 0.25 und 0.025 Ampere, was für viele Messungen ausreichend sein sollte. Die Auflösung ist dabei jeweils 1/1024, d.h. 2.44, 0.244 und 0.0244 mA. Die Strommessung via AD8217 kann die üblichen 6 AD-Kanäle (beim UNO) und die Standard-Befehle readAnalog() zum Lesen der Spannung und analogReference() zur Auswahl der Referenzspannung (5/3.3V und 1.1V beim UNO) benutzen.

Blockschaltbild

sm

Strommessung mit AD8217

Stromlaufplan

sm

Strommessadapter mit USB Light Adaption

Bilder

sm

Strommessadapter

lochraster

Aufbau der Strommessung am budoino mit Strommessadaption am USB Light Adapter

ATmega 328/168 Möglichkeiten

Ein ATmega328 (oder Atmega168) kann aber mehr, als nur an 6 Eingängen die Spannung zu messen. Laut Datenblatt sind beim ATmega328/168 11 Multiplexer Eingänge des ADC bestückt. Neben 8 analogen Standard-Eingängen liegen noch ein Temperatursensor, 1.1V und Masse auf dem Multiplexer, die verwendet werden können. Die ganz großen ATmega2560 und ATmega1284, haben keinen integrierten Temperatursensor, der ganz kleine ATtiny85 jedoch schon (jedoch mit anderer Kurve als beim ATmega328).

Messung der internen Versorgungsspannung

Normalerweise ist Vref gleich der Versorgungsspannung (5V/3.3V) oder 1.1V und am Multiplexer liegt die zu messende Spannung Vin an. Der ADC Wert (0..1023) berechnet sich wie folgt: ADC = (Vin * 1024) / Vref . Bei der Messung der internen Versorgungsspannung (hier am Beispiel 5V) wird das Prinzip umgedreht. An Vref liegen die 5V die man messen will und am Mux liegen die 1.1V als Referenz. Mit obiger Formel ergibt sich hier: ADC = (1.1V * 1024) / Vmess bzw. Vmess =(1.1V * 1024) / ADC .

Da man zur Messung der internen Versorgungsspannung die 1.1V über den Mux schalten muss, was per analogRead() nicht auswählbar ist, müssen hier die Register des ATmega direkt beschrieben/gelesen werden. Das Schreiben von Register ADMUX legt Vref und den Multiplexerkanal fest. Über Register ADCSRA wird der ADC gestartet und in ADCW steht das Ergebnis.

Messung der externen Versorgungsspannung

Natürlich kann man auch den Strom und die Spannung von Verbrauchern messen, die mit einer anderen Spannung als der üblichen +5VDC versorgt werden. Hierzu ist nur ein Spannungsteiler für höhere Spannungen erforderlich, der die Spannung für den Arduino auf max. 5V begrenzt. Der AD8217 hat einen Arbeitsbereich von 4,5 .. 80,0 VDC.

sm

Erweiterung um eine externe Spannungsmessung

Messung der internen Chip Temperatur

Bei der Messung der internen Chip Temperatur ist die Zuordnung wieder normal, d.h., die zu messende Spannung liegt am Multiplexer (hier Kanal 8) und Vref ist 1.1V. Da Kanal 8 nicht per analogRead() auswählbar ist, erfolgt der ADC Ablauf wie bei der Messung der internen Versorgungsspannung. Die Berechnung erfolgt nach der Formel: ADC * 1.012 - 273.

Die Formel ADC * 1.012 - 273 ergibt sich durch 3 Werte (+85°C = 380mV, +25°C = 314mV, -45°C = 242mV) im Datenblatt. Betrachtet man die 2 äußeren Punkte so ergibt sich die Steigung von 138mV pro 130° -> 1.0615mV/°. Zusätzlich haben wir den Zusammenhang für das ADC Maximum von 1024 ADC-Werten für 1100mV -> 1.0742 mV/ADC. Absolut betrachtet entsprechen die 380mV für +85°C gleich 380mV / 1.0615mV/° = 356° . Zieht man davon die 85° ab erhält man den Nulldurchgang der Kurve bei -273°C. Dadurch ergibt sich die obige Formel.

Die Genauigkeit der Temperatur ist laut Datenblatt relativ schlecht mit +/- 10°C angegeben und eigentlich nur für relative Temperatur-Betrachtungen geeignet. Die Abweichung ist Chip abhängig, das heißt jedes Bauteil hat einen anderen Fehler. Aus diesem Grund sollte eine "Kalibrierung" vorgenommen werden. Hierzu misst man die Umgebungstemperatur bei ausgeschaltetem Prüfling mit einem separaten Temperaturmesser (z.B. Data-Logger), notiert sich den eingeschwungen Messwert und notiert sich zusätzlich den ersten Messwert der internen Temperaturmessung des Prüflings nach dessen Einschalten. Aus der Differenz wird dann ein Korrekturwert gebildet, der dann der Formel individuell pro Prüfling hinzugefügt wird. Wichtig dabei ist, dass der Prüfling die Umgebungstemperatur hat, d.h., dass er lange genug vorher ausgeschaltet war. Die endgültige Formel ist dann: InterneTemperatur = ADC * 1.012 -273° + Korrekturwert, mit Korrekturwert = Umgebungstemperatur - InterneTemperaturUnkorrigiert. Der Korrekturwert muss natürlich nur einmalig pro Chip ermittelt werden.

Software

Nachfolgend das zugehörige Programm mit den 3 unterschiedlichen Messungen in Folge. Der Korrekturwert für die CPU Temperaturmessung muss gemessen und in der SW eingetragen werden.


Nach Oben