PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AAR04 Arexx Arduino Roboter - Batteriespannung ermitteln



Fraggle
31.12.2012, 13:26
Hallo,

ich suche gerade nach einer Möglichkeit beim AAR04 die aktuelle Batteriespannung zu ermitteln. Meine erste Idee war, wie beim Asuro und beim NIBObee hierfür die interne Referenzspannung des Controllers zu verwenden. Die interne Referenzspannung beim ATmega 328P beträgt jedoch nur 1,1 V. Der Spannungsabfall an R31 ist jedoch deutlich größer. Wozu dann überhaupt dieser Spannungsteiler aus R31 und R32?
Im Schaltplan ist eine externe Referenzspannung von 3,3 V angegeben. Allerdings verstehe ich nicht, wo diese Spannung herkommt und ob sich diese für die Ermittlung der Batteriespannung eignet. Hat jemand eine Idee?

Gruß
Fraggle

radbruch
31.12.2012, 13:41
Pin 17 vom IC1. Das sollte sich als Referenz für die Batteriemessung eignen.

Fraggle
31.12.2012, 13:47
Ahhh, jetzt sehe ich auch wo die 3,3 V herkommen. Also versuche ich es mit der externen Referenzspannung. Vielen Dank!

markusj
31.12.2012, 14:41
Du kannst auch auf anderem Wege direkt messen, die interne Spannungsreferenz dürfte genauer sein als die 3,3V vom FT232. Dazu musst du ARef auf VCC stellen und den Messkanal Vin auf VBG (interne 1,1V Spannungsreferenz) konfigurieren.

Die Spannung berechnet sich dann wie folgend (ADC = Wert im ADC-Register nach der Wandlung, VCC = Versorgungsspannung, VBG = interne Referenzspannung):
ADC = Vin / ARef * 1024 = VBG / VCC * 1024
Nach Umformung: VCC = 1024 / ADC * VBG

mfG
Markus

Fraggle
31.12.2012, 15:33
ich habe selbst gerade feststellen müssen, dass die 3,3V vom FT232 völlig ungeeignet ist. Mit einem Multimeter gemessen beträgt diese 4,1 V im USB-Betrieb, bei Batteriebetrieb nochmals deutlich darüber. So kann es nicht gehen, ich werde jetzt die Idee von Markus umsetzen, vielen Dank dafür.

Gruß
Fraggle

- - - Aktualisiert - - -

@Markus: Wenn ich die interne Referenzspannung verwende, habe ich doch nur die Möglichkeiten a) Betriebsspannung als Referenz oder b) intern bereitgestellte Spannung (1,1V) als Referenz zu verwenden. Deinen Satz: "Dazu musst du ARef auf VCC stellen und den Messkanal Vin auf VBG (interne 1,1V Spannungsreferenz) konfigurieren" verstehe ich nicht. Wie geht das?

radbruch
31.12.2012, 16:34
Hallo

Ein interessantes Thema. Schau mal ins Datenblatt unter "Table 24-4. Input Channel Selections" Um die internen 1.1V zu messen muss der Kanal 14 (0b1110) ausgewählt werden.

Zur Formel: Ich würde es so ausrechnen:

Vcc(=VREF)/1023 = 1.1V/ADC-Wert.

Ich glaube, der R29 (1k) muss entfernt werden und REFS1:0 muss 0:1 sein: "AVCC with external capacitor at AREF pin"

Gruß

mic

markusj
31.12.2012, 16:51
mic hat recht. Bei anderen AVRs gibt es noch AVCC ohne Entkoppelkondensator, es gibt dann keine Verbindung zum Pin AREF.

Edit: mic, dir ist die 1023 bei der Umformung abhanden gekommen. 2,2V VCC ergäben ADC 511 oder 512, du würdest da einen seeeeehr kleinen Wert ermitteln.

mfG
Markus

Fraggle
31.12.2012, 17:01
ja, die Tabelle 24-4 im Datenblatt habe ich auch schon betrachtet. Ich verstehe nur nicht, woher der Controller dann weis, dass er eigentlich die Spannung an Kanal 2 bestimmen soll und was meinst du mit "Um die internen 1.1V zu messen ...". Die 1,1V sind doch fest. Klar ist "AVCC with external capacitor at AREF pin" bezieht sich auf VCC als Referenzspannung. Nur die möchte ich ja gerade bestimmen. Das R29 entfernt werden muss glaube ich nicht, da die Liniensensoren mit VCC als Referenzspannung tadellos funktionieren. Ich muss jetzt noch etwas fürs Raclette vorbereiten. Morgen (oder Übermorgen) denke ich noch mal darüber nach. Guten Rutsch! Fraggle

radbruch
31.12.2012, 20:00
Hallo

Für mich ist das auch Neuland, ich hatte bisher immer die 2,56V-Referenz verwendet.

Hier muss man rückwärts denken: Welche Vcc müßte als Referenz anliegen damit die internen 1.1V als der vom ADC eingelesene Wert erscheint? Hier ein Rechnenbeispiel für 5V als Vcc (nach meiner Formel oben):

Vcc = 1.1V*1023/ADC

1023/5V = ADC/1.1V oder adc=1023/5V*1.1V

Der ADC würde ca. 225 einlesen.

Gegenprobe: Die Batteriespannung, und damit auch die Referenzspannung, sinkt und deshalb steigt der eingelesene Wert für die internen 1.1V (im Vergleich zu Vcc/VREF). Bei eingelesenen 250 würde die Batteriespannung auf 1.1V*1023/250 oder 4,5V abgesunken sein.

Der R29 verbindet die externe Referenz mit 3.3V, Wir wollen aber Vcc als Referenz verwenden, deshalb muss diese Verbindung über R29 verschwinden. Dann bleibt nur noch C9 als "external capacitor at AREF pin".

Was mich verwirrt: In dem von dir verlinkten Schaltplan ist ein Mega168-AU eingezeichnet, dessen Pinout ist unterschiedlich zu deinem 328P!

Gruß

mic

Fraggle
01.01.2013, 12:57
Frohes Neues,

endlich habe ich es auch verstanden! Ich war die ganze Zeit so auf den Spannungsteiler aus R31 und R32 und damit auf Kanal 2 des AD-Wandlers fixiert, dass ich alles andere ausgeblendet habe. Es funktioniert mit der sogenannten Bandgap-Referenz des AVRs. Dazu
- den Pin AVCC auf VCC legen (ist hardwaremäßig schon vorgegeben).
- AVCC als Referenzspannung festlegen.
- Kanal 14 als Eingangskanal (VBG) festlegen.
- Berechnung vom aktuellem VCC-Wert wie von Markus beschrieben.
Funktioniert bestens, vielen Dank für die Tipps!
@radbruch: Laut Datenblatt sind die AVRs ATmega168A und ATmega328P doch Pinkompatibel. Finde den Schaltplan allgemein sehr unübersichtlich, insbesondere wenn man den Roboter in C und nicht im Arduino-Dialekt programmieren möchte.

Gruß
Fraggle

markusj
01.01.2013, 13:29
Fraggle: Korrekt, aber wie mic schon festgestellt hat, müsstest du eigentlich R29 entfernen, da dieser AREF mit den 3,3V vom FT232 verbindet. Irgendwie ist die Verschaltung aber kompletter murks, der FT232 ist keine zuverlässige Referenzspannungsquelle. Gleichzeitig erfolgen alle analogen Messungen relativ zu VCC, es wäre also eigentlich sinnvoll VCC als AREF zu verwenden ...

Ach ja, wie man sich die Spannungsmessung wohl eigentlich gedacht hatte: Externes AREF (3,3V) verwenden und damit Kanal 2 (Spannungsteiler) ausmessen. Der halbiert den Pegel in etwa und passt damit in das Intervall 0-3,3V rein.

mfG
Markus

Fraggle
01.01.2013, 14:00
Externes AREF (3,3V) zu verwenden war ja auch meine ursprüngliche Idee, bis ich feststellen musste, dass die 3,3V vom FT232, abhängig von der Betriebsspannung, viel zu ungenau sind. Kaum vorzustellen, dass die Entwickler bei AREXX solchen Murks verzapfen und den auch noch in Serienfertigung geben.
Immerhin scheinen die 3,3V an AREF die AD-Wandlung nicht zu beeinflussen.

Gruß
Fraggle

markusj
01.01.2013, 14:13
Immerhin scheinen die 3,3V an AREF die AD-Wandlung nicht zu beeinflussen.

Was vermutlich daran liegt, dass die interne Verbindung im AVR mehr Strom liefern kann als durch den Widerstand zum FT232 abfließt. Dadurch hält man sich (mit nicht ganz sauberen Mitteln) die Möglichkeit offen, sowohl VCC als auch 3,3V als Referenzspannung zu verwenden. Einen Schönheitspreis gewinnt man damit aber nicht. Besser wäre der Verzicht auf R29 gewesen, den Spannungsteiler hätte man ganz streichen können und damit noch einen zusätzlichen freien Kanal gewonnen.

mfG
Markus

markusj
30.04.2013, 12:28
Die ausgegeben Werte sind jedoch konstant.

Fehlt da nicht noch ein paar Klammern? Spannung_Batterie() vielleicht? Der Code sollte so nicht compilieren ...

Davon abgesehen bekommst du Schwierigkeiten mit der Rundung, bzw. dem Wertebereich. 1024 * 1100 ist zu groß für einen (u)int16, die Rechnung muss mit einem 32-Bit-Datentyp erfolgen.

Rein aus Neugierde: Welcher Wert wird denn ausgegeben?

mfG
Markus

markusj
30.04.2013, 17:44
Das dürfte durch die Rundung verursacht sein. Ich schätze Mal, dass GCC zuerst die 1024 / ADCW berechnet, das ergibt dann für einen relativ großen Wertebereich (256 - 341) einfach nur 3. Und damit kommst du auf die 3300mV. Formuliere die Gleichung Mal so um, dass du explizit nur eine Division einer Konstanten hast: 1024 * 1100 / ADC

mfG
Markus