uwegw
09.10.2008, 18:53
Eine Methode, mit der ein AVR seine eigene Betriebsspannung messen kann, ohne einen externen Spannungsteiler zu benötigen.
Ich baue gerne besonders kleine Roboter. Mein aktuelles Projekt wiegt nur etwa 25g.
http://img230.imageshack.us/img230/8045/robenbd8.th.jpg (http://img230.imageshack.us/my.php?image=robenbd8.jpg)
Dafür braucht man natürlich auch sehr kleine Akkus.
Mittlerweile sind aber kleine LiPos recht günstig zu haben. Man muss bei ihnen jedoch aufpassen, sie nicht zu tief zu entladen, sonst gehen sie schenll kaputt. Also muss eine Überwachung der Akkuspannung her!
Die übliche Methode ist es nun, die Akkuspannung über einen Spannungsteiler herunterzuteilen und sie dann mit dem ADC zu messen, der mit der internen Referenzspannung betrieben wird. Der Nachteil dabei ist natürlich, dass man zwei Widerstände braucht, und wenn man auf 3,5x2,5cm einen Mega8, einen Motortreiber, diverse Steckverbinder, Elkos und andere Teile unterbringen muss, ist man für jedes Teil weniger dankbar.
Nun habe ich eine Methode gefunden, wie ein AVR seine Betriebsspannung messen kann, und zwar ohne externe Bauteile.
Die interne Referenzspannung von 2,56V im Mega8 wird aus der sogenannten "Bandgap-Referenz" mit einer Spannung von 1,23V erzeugt. Diese Spannung kann man als Eingang für den ADC auswählen. Und wenn man jetzt AVCC als Referenz für den ADC wählt, hat man folgende Situation am ADC:
-> Eingangsspannung bekannt, 1,23V
-> AVCC unbekannt, Betriebsspannung des AVR= Akkuspannung
Also die umgekehrte Situation wie bei einer normalen ADC-Messung, wo die Eingangsspannung unbekannt und die Referenz bekannt ist.
Das ist aber letztendlich nur ein mathematisches Problem, das leicht zu lösen ist. Man erhält für den ADC-Messwert zu einer gegebenen Akkusspannung:
ADCval= (1,23V/Uakku)*1024
Damit kann man sich nun zu einem Spannungs-Grenzwert den ADC-Wert berechen, um bei Überschreitung dieses Wertes Alarm auszulösen.
Überschreitung, weil die Zuordnung ADC-Wert->Spannung eine Antiproportionalität ist:
Uakku= (1,23V/ACDval)*1024
Die Umsetzung ist nicht weiter schwierig. Man muss bloß bei der Wahl des ADC-Kanals die MUX..-Kombination für Vbg (Siehe Tabelle der ADC-Eingänge im Datenblatt) auswählen. Beim Mega8 entspricht das Kanal 14. Außerdem muss natürlich die Referenz auf AVCC eingestellt sein. Und natürlich klappt es nur, wenn der AVR direkt vom Akku gespeist wird.
Ich baue gerne besonders kleine Roboter. Mein aktuelles Projekt wiegt nur etwa 25g.
http://img230.imageshack.us/img230/8045/robenbd8.th.jpg (http://img230.imageshack.us/my.php?image=robenbd8.jpg)
Dafür braucht man natürlich auch sehr kleine Akkus.
Mittlerweile sind aber kleine LiPos recht günstig zu haben. Man muss bei ihnen jedoch aufpassen, sie nicht zu tief zu entladen, sonst gehen sie schenll kaputt. Also muss eine Überwachung der Akkuspannung her!
Die übliche Methode ist es nun, die Akkuspannung über einen Spannungsteiler herunterzuteilen und sie dann mit dem ADC zu messen, der mit der internen Referenzspannung betrieben wird. Der Nachteil dabei ist natürlich, dass man zwei Widerstände braucht, und wenn man auf 3,5x2,5cm einen Mega8, einen Motortreiber, diverse Steckverbinder, Elkos und andere Teile unterbringen muss, ist man für jedes Teil weniger dankbar.
Nun habe ich eine Methode gefunden, wie ein AVR seine Betriebsspannung messen kann, und zwar ohne externe Bauteile.
Die interne Referenzspannung von 2,56V im Mega8 wird aus der sogenannten "Bandgap-Referenz" mit einer Spannung von 1,23V erzeugt. Diese Spannung kann man als Eingang für den ADC auswählen. Und wenn man jetzt AVCC als Referenz für den ADC wählt, hat man folgende Situation am ADC:
-> Eingangsspannung bekannt, 1,23V
-> AVCC unbekannt, Betriebsspannung des AVR= Akkuspannung
Also die umgekehrte Situation wie bei einer normalen ADC-Messung, wo die Eingangsspannung unbekannt und die Referenz bekannt ist.
Das ist aber letztendlich nur ein mathematisches Problem, das leicht zu lösen ist. Man erhält für den ADC-Messwert zu einer gegebenen Akkusspannung:
ADCval= (1,23V/Uakku)*1024
Damit kann man sich nun zu einem Spannungs-Grenzwert den ADC-Wert berechen, um bei Überschreitung dieses Wertes Alarm auszulösen.
Überschreitung, weil die Zuordnung ADC-Wert->Spannung eine Antiproportionalität ist:
Uakku= (1,23V/ACDval)*1024
Die Umsetzung ist nicht weiter schwierig. Man muss bloß bei der Wahl des ADC-Kanals die MUX..-Kombination für Vbg (Siehe Tabelle der ADC-Eingänge im Datenblatt) auswählen. Beim Mega8 entspricht das Kanal 14. Außerdem muss natürlich die Referenz auf AVCC eingestellt sein. Und natürlich klappt es nur, wenn der AVR direkt vom Akku gespeist wird.