wenn Ub sinkt, was passiert mit dem µC ?

Hallo,

ich möchte die Betriebsspannung vom Arduino überwachen und wenn diese zu weit sinkt das schreiben auf die SD-Karte blockieren. Soweit so gut. Aber was passiert mit dem restlichen Programmcode? Bleibt der µC einfach stehen wenn er zu wenig Spannung hat oder produziert er dann noch eine Weile Datenmüll? Die eigentliche Frage lautet also, hält man sein Programm komplett an oder kann es weiterlaufen bis nichts mehr geht?

Nennt sich BrownOutDetection ( BOD ). Über fuses kannst du den atmega chip dazu bringen, bei Unterschreiten einer gewählten Spannung abzuschalten. Ansonsten ist irgendwann die Taktfrequenz zu groß für die vorhandene Spannung und keiner weiss was passiert.

Zunächst mal die SD Karte nicht mehr zu beschreiben und statt dessen eine Warnung irgendwie anzuzeigen, ist eine gute Idee, die damit natürlich nichts zu tun hat, weil du dazu ja einen weiterlaufenden µC brauchst.

Wie willst du übrigens die Betriebsspannung des Arduino überwachen ? Das ist nicht ganz trivial, geht aber (indirekt) ...

Hallo,

ist "BrownOutDetection" beim Arduino aktiviert? Das wäre sehr gut.

Ub überwache ich mittels AD Wandler. Wenn diese einen eingestellten Wert unterschreitet, leuchtet z.Z. eine LED. Schwellwert und Ub simuliere ich noch mittels zweier Potis. Funktioniert. Die spätere Batteriespannung fällt ja langsam. Problem ist nur, wenn ich den Arduino im Code komplett stehen lasse, dann macht er selbst nicht weiter wenn Ub wieder voll da ist. Jetzt bin ich mir noch nicht sicher ob ich selbst reseten möchte oder nicht. ;)

Wenn er sich selbst reseten soll, wäre "BrownOutDetection" hilfreich oder man müßte eine Überwachungsschaltung anbauen. Aber das verbraucht wieder unnötig wertvolle Energie von der Batterie.

Ub überwache ich mittels AD Wandler

Und wie hängt die Batteriespannung mit Vcc zusammen? Ist da noch ein DC-DC Wandler dazwischen ?

Lt. Fuse Calculator sollte beim Uno mit uno.bootloader.extended_fuses=0x05 (falls das noch die Original boards.txt ist) der BODLevel auf Vcc = 2.7V gesetzt sein.

Hallo,

okay, hab mal bei mir nachgeschaut.
Bei meinem Mega2560 steht drin: bootloader.extended_fuses=0xFD, wären auch 2,7V, wenn die letzten 3 Bits zählen. Das wären für 16Mhz zu wenig. Da müßte ich den Arduino mit 8Mhz laufen lassen. Dient die Board.txt nur als Info zum lesen oder kann man das einstellen wenn man möchte?

Wegen der Frage "Batteriespannung vs. Vcc ". Die Frage ist wirklich gut und berechtigt. Das deckt ein Problem auf. Ich könnte den externen AD Wandler mit vom DC-DC Wandler dauerhaft versorgen lassen. Die Verbindung wollte ich eigentlich trennen, wenn die Pufferbatterie wieder geladen ist. Muß ich mir mal überlegen wie ich das jetzt verschalte … ist noch nichts festgelegt nur die Ideen spuken im Kopf rum. :wink:

Der Prozessor kann seine eigene Betriebsspannung messen: http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/ https://code.google.com/p/tinkerit/wiki/SecretVoltmeter

Funktioniert so: Der Prozessor hat eine Bandabstandsreferenz von 1,1V. Dann setzt man die Referenzspannung des ADCs auf die Betriebsspannung und misst die 1,1V Referenz. Davon kann man dann auf die Betriebsspannung zurückrechnen.

Hallo,

dann muß man Ub runterteilen bis auf max. 1,1V. Ganz schön wenig. Im externen AD Wandler ist eine Ref. von 2,048V drin. MCP3428. Damit kann man +/- 2,048V messen gegenüber den Kanal "Minus" Eingang. Das ist ein Differenzmesser. Den Minuseingang lege ich auf 2,5V Ref und kann dann am Plus Kanaleingang Spannungen zwischen 0,452V und 4,548V messen. Der Haken ist, der AD Wandler benötigt eine gute 5V Versorgung.

Ich guck mir den Link mal an ...

Erm, nein. Da muss man nichts teilen. Das geschieht alles intern (man kann den MUX des ADCs auf die Bandabstandsreferenz legen). Der Sinn ist ja, dass man eine bekannte Spannung mit einer variablen Referenz misst. Und dann die Referenzspannung ausrechnet. Also eigentlich genau anders herum wie normal.

Serenifly: Der Prozessor kann seine eigene Betriebsspannung messen: http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/ https://code.google.com/p/tinkerit/wiki/SecretVoltmeter

Funktioniert so: Der Prozessor hat eine Bandabstandsreferenz von 1,1V. Dann setzt man die Referenzspannung des ADCs auf die Betriebsspannung und misst die 1,1V Referenz. Davon kann man dann auf die Betriebsspannung zurückrechnen.

Es ist umgekehrt. Mit der Betriebsspannung als Referenz wird die interne 1,1V Referenz gemessen und aus dem gemessenen Wert die Betriebsspannung errechnet.

Grüße Uwe

Ich glaube das ist genau das was ich geschrieben habe :~

Man könnte auch auf die Idee kommen den ADC beim unterschreiten der Spannungsschwelle (also wenn die Referenz die Referenzschwelle überschreitet) einen Interrupt auslösen zu lassen.

Erste Maßnahme wäre dann wohl die Taktfrequenz sofort auf 1 MHz runter zu teilen um beim Spannungsabfall die SOA nicht zu verlassen. Und dann SCHNELL alles abräumen.

Uwe/Serenifly's Ansatz dient dazu, Vcc zu messen. Wenn die Batteriespannung erst interessant wird, wenn der Spannungsregler keine 5V mehr liefern kann, reicht das. Ansonsten bräuchte Doc doch einen zusätzlich etwas Strom fressenden Spannungsteiler über Ub, fürchte ich, wenn er einen StepDown Regler verwendet.

Ausserdem gehe ich mal davon aus, dass die BOD beim Arduino auf 2.7V eingestellt ist, weil's bis dahin vermutlich grade noch geht mit 16MHz. BOD auf 4.3V setzen (extended = 0x04 oder 0xFC) schaltet evtl. etwas früh ab ;) Die Alternative wäre, noch weiter runter zu gehen oder BOD ganz zu disablen.

Kann man im laufenden Betrieb von 16 MHz extern auf 8 oder 1 MHz intern umschalten ???

Hallo,

Uwe und Serenifly. Ihr meint bestimmt beide das gleiche nur jeder hat es etwas anders formuliert. Ich muß das Prinzip erstmal in der Birne gedanklich sortieren. Dauert etwas ... ;)

Kann man wirklich im laufenden Betrieb den Takt ändern?

Grob umrissen, wird die Pufferbatterie immer mal wieder nachgeladen. Wenn das aus irgendwelchen Gründen mal nicht passiert, kann es sein das die Pufferbatterie leer gesaugt wird. Deshalb muß ich die Spannung der Pufferbatterie überwachen. Wenn diese zu stark sinkt müssen Sicherheitsmaßnahmen greifen. Das wichtigste ist die Zugriffssperre auf die SD-Karte. Alles andere wie Sensoren und Display sind erstmal egal. Ob das Display überhaupt zum Einsatz kommt ist nicht sicher. Ich wollte im Endstadium alles über BT auf's Handy liefern lassen.

Wegen der BOD. Da alles mit 5V laufen muß, wären 2,7V zu wenig für 16MHz. Laut Datenblatt vom Mega2560 sind für 16MHz mindestens 4,5V notwendig für einen sicheren Betrieb. Für 8MHz sind dann die 2,7V mindestens notwendig. Okay, ich könnte den Arduino mit 8MHz laufen lassen, wäre kein Problem. Nur funktionieren dann die angeschlossenen Sensoren usw. eh nicht mehr wenn weit unter 5V vorhanden sind. Die müßten, wenn der µC weiterlaufen könnte, dann doch bestimmt irgendwie resetet werden.

Gibt es einen Software Reset? Oder ist das der Watchdog Timer? Ich hab da eine Idee. Wäre das machbar? Wenn ich den Arduino bei Unterschreitung der Ub in einer while Schleife verharren lasse und in dieser die serielle abfrage, dann könnte ich per Handy einen Befehl abschicken für einen Reset. Vielleicht so, dass ein Pin einen Transistor ansteuert der einen Reset auslöst. Parallel zum Resettaster. Die Frage wäre auch hier ob dann das BT Modul noch funktioniert, wenn Ub zu weit sinkt. Ansonsten wäre es wohl das sicherste ihn einfach in while verharren zu lassen bis ich manuell resete. Oder?

Doc_Arduino: Gibt es einen Software Reset? Oder ist das der Watchdog Timer?

Kann man über den Watchdog Timer machen und das wird auch in der avr libc empfohlen: http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_softreset

Da wird der WDT gestartet und danach eine endlos-Schleife gemacht. Dadurch wird der Timer nicht zurückgesetzt und er löst einen Reset aus.

Ich habe aber auch schon Code gesehen wo einfach per inline Assembler an absoluter Sprung in den Reset-Vektor gemacht wird (jmp 0)

Hallo,

ich glaube ich lass das erstmal mit dem Watchdog-Timer. Wenn man das so liest, kann das auch schief gehen. Ich konzentriere mich erstmal auf die Messung der Ub. :) Danke für die vielen Hinweise!

Hallo,

hab das versucht zu verstehen mit der internen Ref. messen. Verstehe es aber noch nicht. Die AREF liegt doch standardmäßig auf Ub. Zumindestens beim Arduino. Und die interne Ref. soll doch immer stabil seinen Wert behalten egal was Ub macht. Jetzt verstehe ich nicht, warum sich der Meßwert von der internen Ref ändern soll, wenn Ub schwankt. Mir fehlen Zwischendetails zum Verständnis. Ich meine, eine Referenzspannungsquelle ist doch auch nichts weiter wie ein Spannungsregler nur mit sehr hoher Präzision, die solange funktioniert wie Ub größer wie Uref ist.

Du mißt 1,1 V mit 5V Referenz. Du bekommst die Zahl 225 als ADC.

Verhältnisrechnung: 1,1V : 5V = X : 1023 X = (1,1V*1023) /5V = 225 .

Wenn nun die Referenzspanung kleiner als 5V ist dann ist der gemessene Analogwert für 1,1V größer.

Wenn Du jetzt zB 281 als ADC mißt, dann heißt das, daß die Versorgungsspannung auf 4V heruntergegangen ist:

1,1V : x = 281 : 1023

Grüße Uwe

Die Bandabstandsreferenz ist auch konstant, obwohl es da fertigungsbedingt +/- 10% Toleranz gibt und sie sich eventuell abhängig von der Temperatur leicht ändert. In meinem ersten Link steht wie man den Fertigungsfehler kompensieren kann, aber man kann sie in der Tat als konstant annehmen.

Der ADC spuckt aber einen Wert abhängig von der Referenzspannung aus! Und die ändert sich. Mal angenommen wir messen 1,1V und die Referenzspannung wäre auch 1,1V. Dann ist das Ergebnis 1023. Wenn sich jetzt aber die Referenzspannung auf 1,2V erhöht, entspricht 1023 dann 1,2V und bei 1,1V ist das Ergebnis nur noch 1023 /1,2V * 1,1V ~ 938.

In diesem Fall wo die Referenzspannung idealerweise 5V ist, erhöht sich so der gemessene Wert je weiter die Betriebsspannung sinkt. Bei 5V misst man 225, da 5V / 1023 * 225 = 1,1V Bei 4,5V misst man 250, da 4,5V / 1023 * 250 = 1,1V

EDIT: Wenn du einen Mega hast nimmt den Code von hier: http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/

Der andere Link geht nur mit dem UNO da die MUX Bits im ADMUX Register auf dem Mega etwas anders funktionieren (durch die höhere Anzahl an Kanälen und weil der Atmega2560 differentielle Messungen macht).

Die AREF liegt doch standardmäßig auf Ub.

Die AREF liegt standardmässig auf Vcc. Wenn bei dir ein Unterschied zwischen Vcc (wird bei Arduino gern 5V genannt) und Ub (Batteriespannung) ist...

Hallo,

bei mir ist Vcc und Ub gleichbedeutend, weil Ub bei mir Betriebsspannung bedeutet. :grin: Ich weis aber was Du meinst, mit dem Unterschied, wenn dann ... ;)

Die Messung von Ub mit Ref 1,1V funktioniert. Die 1,1V weichen in ihrer Toleranz auch nicht so weit ab

Habe ein regelbares Netzteil direkt an den 5V Pin gelegt. Dabei kein USB angesteckt, sonst geht das in die Hose. Voltmeter VC940 µC Display 4324mV 4361mV 4756mV 4808mV 4850mV 4913mV 4994mV 5068mV 5016mV 5091mV

Unter 4,3V macht das Display nicht mehr mit.

Wegen dem Messprinzip. Ehrlich gesagt, so richtig habe ich das immer noch nicht verstanden, weil ja die 1,1V Ref. für mich konstant ist, die ich dann wiederum messe ? und dann komme ich noch nicht über den Punkt hinweg, warum man in dem Fall die 1,1V Ref. auf 5V legen darf. Ich dachte wenn die 1,1V Ref aktiviert ist, darf nicht mehr als 1,1V angelegt werden sonst geht was kaputt. Hab da immer noch einen Knoten im Hirn.