Prolog
Auf einem Arduino Mega muss ich bei einem Stromausfall Daten im EEPROM (ca. 40 Byte) speichern. Die Daten ändern sich ständig (Schrittposition, Geschwindigkeit usw.), aber da das EEPROM begrenzte Schreibzyklen hat, müssen die Daten nur geschrieben werden, wenn ein Leistungsabfall erkannt wird, sodass periodische Schreibvorgänge in der Hauptschleife oder auf einem Timer unterbrochen werden der Frage.
Das Setup
- Arduino Mega 2560 Board
- PC-Versorgung (von einem Dell) unter Verwendung seiner 12-V-Schiene
Arduino-Eingänge:
- Viele Tasten / Mikroschalter (jeweils mit 10K Pulldown-Widerstände)
- IR-Empfänger
Arduino-Ausgänge:
- 2 Schritttreiberausgänge
- 3 LEDs
- serielle Verbindung zum Grafik-LCD (extern versorgt)
Andere Komponenten werden über dieselbe 12-V-Netzteilschiene (außer dem Arduino) mit Strom versorgt Platine):
- 6 V (max. ~ 220 mA) Grafik-LCD (über einen L7806-Regler gespeist)
- 12 V (0,65 A) ) 120-mm-Lüfter
Mögliche Lösung
Ich weiß nicht viel über Elektronik, ich habe gerade etwas über wh gelernt an einem Spannungsteiler ist, also bitte nackt mit dem, was ich sagen werde.
Normalerweise wird ein Superkondensator als Backup benötigt, wenn der Strom ausfällt, aber ich bin es Ich denke, es wird nicht benötigt, da das Netzteil sie bereits hat und es dauert 1-2 Sekunden, bis es entladen ist, wenn es ausgeschaltet ist, selbst wenn ein 12-V-Lüfter vom Netzteil ausgeht. Wir gehen von einem Maximum von 2 Sekunden aus, was bedeutet, dass das Netzteil mindestens einige Minuten lang eingeschaltet ist, damit die Kappen vollständig aufgeladen sind.
Als Mechanismus zur Erkennung von Spannungsabfällen dachte ich an einen Spannungsteiler mit 2 Widerständen parallel zur Arduino-VIN-Versorgung (dh eine völlig separate, nicht abhängige Schaltung), bei dem der Teilerausgang läuft an einen analogen Arduino-Pin. Da der Eingang vom Netzteil Vin = 12 V ist, würde ich die 2 Widerstandswerte R1 = 10 K und R2 = 5 K wählen. Das würde maximal 0,4 mA für den Pin bedeuten und würde deutlich unter dem empfohlenen 20 mA sinkenden Strom liegen, den ein Arduino-Pin unterstützt. Ein 1: 2-Verhältnis für die Widerstände würde dann ein Vin / Vout = 1/3-Verhältnis ergeben, und das bedeutet, dass ein Vout = 4 V-Maximum zum analogen Pin geht. Beim Lesen des Pin-Werts mit der Arduino-Spannungsreferenz auf den Standardwert von 5 V würde der "normale" Wert bei etwa 819 liegen (auf der Analogskala 0-1023).
Der akzeptierte Wert Die Spannung für den VIN-Pin am Arduino Mega beträgt 7-12 V, wie in den technischen Daten empfohlen. Wie in den -Foren angegeben, beträgt die tatsächliche Mindestspannung für die Mega-VIN jedoch etwa 6 V. Der Mega hat einen niedrigeren Spannungsabfall-5-V-Spannungsregler als andere Platinen mit einem Spannungsabfall von etwa 1 V. Bei einem Stromausfall würde die Spannung vom Netzteil langsam (in 1-2 Sekunden) von 12 V auf 6 V abfallen, wenn das Arduino nicht versorgt würde und es abschaltet. Divider Vout = 6V / 3 = 2V, daher sollte ich die Daten speichern, wenn der gelesene Analogwert irgendwo zwischen 819 und 410 liegt, aber genug über 410, so dass genügend Zeit zum Speichern von etwa 40 Byte Daten bleibt (EEPROM-Schreibvorgänge sind) langsam - Ich sollte mir die genauen Zeiten ansehen, aber ich denke, das vollständige Schreiben würde nicht länger als 100 ms dauern.
[UPDATE] Es dauert 3,3 ms / Schreiben. Um die Lebensdauer des EEPROM zu verlängern, schreibe ich nicht den gesamten Block auf einmal, sondern aktualisiere Byte für Byte und schreibe nur, wenn der Bytewert unterschiedlich ist. Für das Schreiben von 40 Byte wären es also maximal ~ 130 ms (wenn alle 40 tatsächlich geändert), plus die Zeit, die zum Lesen benötigt wird.
Um die Dinge schnell und schnell zu erledigen, sollte der analoge Lesevorgang Interrupt-gesteuert sein, anstatt ständig den analogen Pin abzufragen (da analoge Messwerte langsam sind und einen Overhead verursachen) CHANGE auslösen.
Fragen
- Sind die oben genannten Lösungen und Aussagen korrekt? Sind die Widerstandswerte für den Teiler richtig gewählt? Haben Sie Vorschläge?
- Würde die Stromversorgung des Arduino über USB a) zusammen mit der Fahrgestellnummer b) allein (nur USB) den Spannungsabfall am analogen Pin beeinträchtigen?
- An Eine noch bessere Lösung wäre ein durch FALLING ausgelöster Interrupt (HIGH to LOW), aber die externe Hardware sollte neben einem Spannungsteiler noch etwas anderes enthalten. Eine Diode vielleicht? Welche Art / Parameter? ol>
.
Hinweis: Ich weiß, dass ich den Arduino über den Stromanschluss und nicht über den VIN-Pin mit Strom versorgen sollte, da der Anschluss über Rückstromschutzdioden verfügt. Für dieses Projekt habe ich jedoch eine Abschirmung mit externen Anschlüssen gebaut und es war sinnvoll, die Platine auch mit dem VIN-Pin zu versorgen. Ich habe darauf geachtet, die Eingabe beim Testen nicht umzukehren, und der Stromanschluss ist nur eine Möglichkeit, um eventuelle Fehler zu vermeiden.
UPDATE
Vielen Dank für alle Vorschläge, aber ich möchte trotzdem den Weg des Spannungsteilers gehen. Ich mag diesen Ansatz besonders, weil er nicht aufdringlich ist - im Grunde ist es nur ein weiterer Sensor auf dem Arduino, der von derselben Stromversorgung gespeist wird, aber nicht zwischen dem Arduino und der Stromversorgung stört.