Frage:
Erkennen Sie einen Arduino-Stromausfall und speichern Sie Daten
binar
2014-03-20 05:24:58 UTC
view on stackexchange narkive permalink

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

  1. Sind die oben genannten Lösungen und Aussagen korrekt? Sind die Widerstandswerte für den Teiler richtig gewählt? Haben Sie Vorschläge?
  2. Würde die Stromversorgung des Arduino über USB a) zusammen mit der Fahrgestellnummer b) allein (nur USB) den Spannungsabfall am analogen Pin beeinträchtigen?
  3. 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?
  4. 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.

Haben Sie darüber nachgedacht, einen externen Regler mit einem "PGOOD" -Ausgang zu verwenden, damit Sie wissen, wann die Stromversorgung ausgefallen ist?
@IgnacioVazquez-Abrams Ich bin nicht sicher, ob ich verstehe, woraus der Regler mit Strom versorgt werden soll. Können Sie detaillieren?
Es wird von Ihrem 12-V-Netzteil mit Strom versorgt und in die 5-V-Verbindung des Arduino eingespeist.
Du meinst die Platine über 2 verschiedene Anschlüsse mit Strom versorgen (5V Pin und was ich jetzt benutze, die VIN 12V)? Oder verwenden Sie es an einem Eingangspin, um die Spannung zu "erfassen"? Ich dachte, ein Spannungsteiler ist in diesem Fall richtig, weil ich erwarte, dass die Eingangsleistung ziemlich konstant ist (12 V), der Arduino nur 5 V benötigt. Wenn also die 12 V auf einen niedrigeren Wert abfallen, würde der Arduino immer noch funktionieren, aber der Vout des Teilers wird fallen und ich kann das spüren. Im Gegensatz dazu liefert ein Regler unabhängig von seinem Eingang konstant 5 V, solange er über ~ 6 V liegt. Ich konnte das also nicht spüren, bis es zu spät wäre.
@IgnacioVazquez-Abrams Ein geeigneter Regler wäre ein Regler mit einem großen Spannungsabfall, beispielsweise würde er bei einem Eingang von über 11 V 5 V ausgeben (und diesen einem analogen Eingang zuführen) und unter 11 V, um den Ausgang zu verringern. Gibt es einen solchen Regler überhaupt?
@IgnacioVazquez-Abrams Ich habe nach "Power Good Regulator" gesucht und jetzt verstehe ich, was du meinst. Ich würde den Arduino also nicht über den Regler mit Strom versorgen, sondern nur den PGOOD-Pin mit einem digitalen Arduino-Pin verbinden und benachrichtigt werden, wenn der Strom ausfällt. Ich werde sehen, ob ich einen zum Kaufen finden kann, aber wie ich sehen kann, sind sie nicht sehr verbreitet. Ich finde meine obigen Kommentare jetzt ziemlich dumm :)
@IgnacioVazquez-Abrams Gefunden: `MCP1791T-5002E` (http://ww1.microchip.com/downloads/en/DeviceDoc/22075b.pdf). Breiter Eingangsbereich, perfekt für 12V. Und es ist sehr billig. Es heißt, es würde PGOOD bei einem Vout-Abfall unter 90% (4,5 V) auf LOW setzen. ABER dies zeigt einen * Vout * -Tropfen an, keinen * Vin * -Tropfen. Bei welchem ​​Vin-Wert würde der PGOOD-Pin auf LOW gehen? Soll ich nach einem anderen Regler mit PGOOD-Ausgang suchen? Sie können eine Antwort formulieren, ich werde auf jeden Fall positiv stimmen.
Sie erhalten, bis Vout 2,7 V erreicht, um in das EEPROM zu schreiben. In Kombination mit einem anständigen Kondensator sollte dies also kein Problem darstellen.
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/13734/discussion-between-talereader-and-ignacio-vazquez-abrams)
Zwei antworten:
Passerby
2014-03-20 08:18:31 UTC
view on stackexchange narkive permalink

Ein einfacher Batterie-Backup-IC macht, was Sie wollen.

enter image description here

Im Wesentlichen tastet ein Komparator zwei Spannungseingänge ab, die Hauptstromversorgung und eine Notstromversorgung ( Batterien). Basierend darauf versorgen zwei kaskadierende Wechselrichter, die mit zwei p-Kanal-Fets gepaart sind, die Schaltung bei Vo, während zwei n-Kanal-Fets als Open-Drain-Ausgänge verwendet werden. Ziehen Sie sie mit einem Widerstand nach oben, und sie sind die perfekte Interruptquelle für Ihr Arduino.

Die speziell gezeigte ist der ICL7673, aber der maximale Strom beträgt 38 mA. Es ist für RTC und RAM mit einer Übereinstimmung konzipiert, aber ein zusätzliches Paar P-Kanäle kann verwendet werden, um den Strom zu erhöhen.

Es gibt andere Batterie-Backup- oder Netzschalter, die einen höheren Strom einbauen.

Wenn ich mich nicht einwählen würde, ähm, ich meine beschissenes langsames Internet, hätte ich ein besseres gefunden.
Vielen Dank, ich werde mich mehr mit Batterie-Backup-ICs befassen. Sollte der IC parallel zur Netzstromversorgung des Arduino geschaltet werden oder sollte er der einzige Stromeingang für die Karte sein? Weil mir die 38-mA-Grenze nichts ausmacht, solange sie nur zum Speichern von Daten im Backup-Akku dient. Es könnte in diesem Moment auch für den normalen Gebrauch ausreichen, möchte aber zukünftige Addons für das Projekt nicht einschränken.
Wie funktionieren diese Arten von ICs? Ich vermute, dass der Arduino bei einem Stromausfall die Batterie entlädt, bis sie vollständig entladen ist, da dies als "Batterie-Backup" bezeichnet wird. Wenn dies der Fall ist, weil ich erwarte, dass das System ausgeschaltet wird, wenn es nicht verwendet wird, muss ich einen Abschaltschalter für den Backup-IC-Ausgang setzen (möglicherweise den DPST-Mikroschalter, der derzeit das Netzteil einschaltet, gegen einen DPDT austauschen).
Und es würde auch bedeuten, dass Sie nach dem Erkennen eines Schalters auf Batteriestrom die Daten speichern und den Arduino in einen Energiesparmodus / eine Endlosschleife versetzen, um die Pufferbatterie zu schonen.
Sie können wahrscheinlich damit durchkommen, einen großen Kondensator anstelle einer Batterie zu verwenden, und warten nach dem Schreiben nur, bis er leer ist.
@IgnacioVazquez-Abrams +1 Ich mag den Kondensatoransatz, da er die Wartung reduziert: Die Pufferbatterie muss nicht gewechselt werden.
Die Idee des Backup-IC (Batterie oder Kappe) ist zwar machbar, aber auch komplexer. Ich habe den Beitrag aktualisiert, in dem ich sagte, dass mir der Teileransatz besonders gefällt, weil er nicht aufdringlich und einfach ist (obwohl er nicht so energieeffizient ist und ihn als Wärme in Widerständen verschwendet, aber ich würde das nicht als Problem für dieses spezielle Projekt betrachten).
@talereader Dieser IC schaltet nur auf einen höheren Leistungseingang mit einem passenden Signalstift um. Sie würden den Arduino-Interrupt beim Umschalten auf Backup haben, in den EEPROM schreiben und dann in den Energiesparmodus, mit einem Interrupt, der aufwacht, wenn der Backup-Pin wieder hoch geht.
user137751
2017-02-01 20:47:56 UTC
view on stackexchange narkive permalink

Das Hinzufügen von zwei Dioden zum Koppeln von Widerständen und einer Elektrolytkappe ist alles, was Sie brauchen.Nehmen Sie einen Wandwürfel-Kraftwürfel an.Über eine Diode (Typ 1n4002) positiv auf den Eingangs-VCC (9-V-Eingang) auf der Platine setzen. Setzen Sie eine Kappe über den Eingangsanschluss auf der Platine.Dies sollte 1000-2000uF / 16V sein.Dann vom Positiv der Wandwarze eine weitere Diode (1n4002) anbringen.Diese Diode speist einen Spannungsteiler aus zwei Widerständen, so dass die Teilung einen analogen Eingang mit maximal 3-4 Volt versorgt.Die Spannung am Analogeingang fällt deutlich vor der Spannung am Eingang der Platine ab.

  int PowerGood = Digital.read (Axe);// Analogeingang auswählen
  if (PowerGood = 0) {ShutdownStore ();}
 

void ShutdownStore () // Routine zum Speichern von Daten und zum Verbleiben für (x == 0; x

Sie haben die Idee.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...