Im Internet findet man Hinweise und Beschreibungen um mit einem AVR ohne Nutzung eines ADC-Eingangspins die EIGENE Versorgungsspannung zu messen. Ausgenutzt wird dafür die Möglichkeit die interne Bandgapreferenzspannung wie einen ADC Eingangspin zum Messen an den ADC anzuschalten.
Dazu hier ein Codeschnipsel mit Bascom für einen ATmega88. Mit dem ADC-Meßwert wird Vcc berechnet und auf eine Kommastelle gerundet über UART ausgegeben.
Als Referenzspannung für den ADC wird Avcc eingestellt und dann die µC-eigene interne Bandgapreferenz gemessen. Verändert Vcc sich zB durch leer werdende Akkus bleibt die Bandgapreferenz trotzdem relativ sehr stabil.Mit der stabilen Bandgapreferenz läßt sich dann die tatsächliche Avcc, die ja gleich der Versorgungsspannung ist, bestimmen.
Der ADC Meßwert, der im ADCH/ADCL Register erscheint, bestimmt sich laut Datenblatt mit:
ADC = Vin * 1024 / Vref
Vin = Spannung am ADC Eingang, Vref = Referenzspannung.
Der höchste anzeigbare ADC-Wert von 1023 steht für Vref minus 1 LSB (laut DB).
Zur Bestimmung von Vcc, die ja durch die ADC Konfiguration gleich Vref ist, ist die Formel nach Vref umzustellen. Vin, die Bandgapreferenz ist mit 1,1V bekannt.
Vref = Vin * 1024 / ADC
Vref = 1,1V * 1024 / ADC
Code:
'#########################################################################################
'### ###
'### VCC-MESS.BAS ###
'### ATmega88 ###
'### Demo zum Messen von Vcc mittels ADC ohne Nutzung eines ADC-Eingangspins ###
'### ###
'### Ausgenutzt wird die Möglichkeit die interne Bandgapreferenzspannung wie einen ###
'### ADC-Eingangspin zum Messen an den ADC anzuschalten. Als Referenzspannung für ###
'### den ADC wird Avcc konfiguriert und daraus die tatsächliche Vcc berechnet. ###
'### ###
'### IDE: Bascom Demo Version 2.0.7.5 ###
'### Author: Searcher (User im www.roboternetz.de) ###
'### ###
'#########################################################################################
$regfile "m88def.dat"
$crystal = 8000000
$hwstack = 34
$swstack = 32
$framesize = 32
$baud = 9600
Dim Supply_voltage As Single
Dim Adc_result As Word
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Konfiguration des ADC mit Vcc als Referenz
Do
Adc_result = Getadc(14) 'Dummy Messung auf MUX Kanal 14, der internen Bandgap Referenzspannung (1.1V)
Waitms 1 'Stabilisierungszeit für Bandgap Spannung
Adc_result = Getadc(14) 'Mit gültiger Messung die erste Messung verwerfen
Supply_voltage = 1126.4 / Adc_result 'Errechnen von Vcc (1024*1.1/ADC)
Wait 1 'Verlangsamung der Loop zur Betrachtung der Meßwerte
Print Fusing(supply_voltage , "#.#") 'Ausgabe des gerundeten Wertes über UART
Loop
End 'end program
Die Bandgapreferenz wird beim ATmega88 über Kanal 14, im obigen Programm mit Getadc(14) gemessen. Ausschnitt aus Datenblatt:
Bild hier
Beim zB ATtiny24/44/84 findet sich im Datenblatt noch der Hinweis, daß nach Auswählen der Bandgap als Eingang für den ADC eine Stabilisierungszeit nötig ist.
Gruß
Searcher
Lesezeichen