Frage:
ESP32: Wie kann man im Tiefschlaf einen Stift hoch halten (RTC GPIO-Klimmzüge sind zu schwach)?
anrieff
2018-01-15 22:50:37 UTC
view on stackexchange narkive permalink

Ich verwende einen ESP32 in einem batteriebetriebenen Gerät. Das ESP verbringt die meiste Zeit im Tiefschlaf, um Strom zu sparen. Das Gerät verfügt außerdem über einige 5-V-Sensoren, die ich von einem MCP1640-Aufwärtswandler speise, der während des kurzen aktiven Teils eingeschaltet ist und im Tiefschlaf über seinen "ENABLE" -Pin ausgeschaltet wird. Der relevante Teil des Schaltplans ist:

schematic

simulieren diese Schaltung - Schema erstellt mit CircuitLab sup>

Also muss ich Pin 4 im Schlaf hoch halten. Aufgrund schlampiger Tests dieses Teils wusste ich nicht, dass der ESP32 seine GPIOs im Tiefschlaf herunterfährt, sodass Pin 4 nicht hoch gehalten wird und die Sensoren aktiv bleiben. Dadurch wird der Akku viel schneller als erwartet entladen.

Ich frage mich, ob es möglich ist, diesen Fehler durch einen Software-Patch zu umgehen (natürlich ist es einfach, Pin 4 einfach einen externen Pull-up-Widerstand hinzuzufügen - aber ich habe ein paar Geräte auf dem Feld, die ich würde Ich hasse es, ein paar hundert Kilometer zurücklegen zu müssen, nur um einen Widerstand anzulöten! Und die Leute in der Umgebung sind nicht technisch versiert, dies selbst zu tun; im Gegenteil, das Patchen von Remote-Software ist einfach und gut getestet.

Zum Beispiel habe ich die Pull-up-Widerstände der RTC ausprobiert:

  gpio_num_t pin = (gpio_num_t) PIN_DISABLE_5V;
rtc_gpio_set_direction (Pin, RTC_GPIO_MODE_INPUT_OUTUT);
rtc_gpio_pulldown_dis (Pin);
rtc_gpio_pullup_en (Pin); // Setze den Pin als Pull-Up
esp_sleep_pd_config (ESP_PD_DOMAIN_RTC_PERIPH,
                    ESP_PD_OPTION_ON); // die RTC-E / A-Domäne mit Strom versorgen
 

Dies kurz vor dem Eintritt in den Tiefschlaf auszuführen hat fast funktioniert, aber es stellt sich heraus, dass der schwache Pull-up zu schwach ist : wahrscheinlich ~ 38k, wenn es sich um einen Widerstand handelt, oder90µA wenn es sich um eine Stromquelle handelt.Dies reicht nicht aus, um den Pin des ULN2003 anzusteuern.Ich habe auch RTC_GPIO_MODE_OUTPUT_ONLY + rtc_gpio_set_level () ausprobiert, aber dies schien die Laufwerksfähigkeit nicht zu erhöhen.Eine andere Möglichkeit ist leichter Schlaf, den ich vermeiden würde, da er vor einiger Zeit fehlerhaft war und ich nicht möchte, dass meine Geräte zugemauert werden.

Meine Frage really lautet also: Habe ich alle Softwareoptionen ausgeschöpft (da für die Hardware auch ein Tank voll Benzin verbrannt werden muss)?

Was sind die Energiesparfunktionen der Sensoren selbst?Können die Sensoren auf einen niedrigen Stromverbrauch eingestellt werden und wird dadurch der Strombedarf verringert?
Das war meine erste Idee, aber sie erwies sich als unhaltbar - einer der Sensoren war an einen Pin nur für den Eingang angeschlossen (da ich ihn nur lesen wollte), und die anderen sind analoge 3-Pin-Wandler ...
Was ist die Reichweite von Vbatt?Min. Spannung bis Max. Spannung?
Li-Ion, also 2,7 bis 4,2 V.
Fünf antworten:
#1
+5
Andy aka
2018-01-15 23:32:33 UTC
view on stackexchange narkive permalink

Es ist nicht klar, ob die von Ihnen vorgeschlagene Widerstandsänderung zur Lösung Ihres Problems wirksam ist.

Der MCP160 erfordert, dass der Freigabeeingang unter 20% von Vin liegt, um das Gerät effektiv auszuschalten.Wenn Vin (sagen wir) 5 Volt ist, dann sind 20% 1,0 Volt und da der ULN2003 ein Darlington ist, schaltet er diesen Wert möglicherweise nicht zuverlässig niedrig.Unter der Annahme, dass es unter 1 Volt schaltet, besteht jedoch immer noch die Möglichkeit, dass meine Vermutung über den Wert von Vbatt von 5 Volt nicht das untere Ende des Bereichs abdeckt.

Wenn beispielsweise erwartet wird, dass Vbatt auf 2 Volt herunterarbeitet, können Sie den MCP160 nur ausschalten, wenn der Freigabepin auf weniger als 0,4 Volt eingestellt ist.Das klingt alles nach meinem Geschmack und ich würde Ihnen empfehlen, etwas mehr über das Problem nachzudenken.

Das gesamte Setup dort ist ein Fehler, der durch einen übereifrigen Versuch verursacht wurde, die Anzahl der Teile zu reduzieren.Da der ULN2003 jedoch ein sehr eigenartiger Chip ist, funktioniert die gezeigte Konfiguration tatsächlich mit einem Pull-up.Wenn Sie beispielsweise das Kabel zwischen ESP32 und ULN2003 durch einen Widerstand ersetzen, nimmt die Sättigungsspannung mit zunehmendem Widerstand ab (480 mV bei 10 kΩ, 350 mV bei 20 kΩ).Der niedrigste Vin ist 3,0 V, so dass das Design funktioniert, wenn auch nicht mit großem Abstand.
Ich mache mir auch Sorgen, dass sich das Gerät nicht auch einschalten lässt.Der ULN2003-Leckstrom (wenn ausgeschaltet) ist ziemlich hoch, vielleicht 50 uA, so dass es ein bisschen chaotisch aussieht.Mein Rat.Nageln Sie alle Probleme und treffen Sie die Kunden mit einem Schlag, um alle Probleme zu beheben.Wenn Sie mehr als zwei Besuche bei einem Kunden machen müssen, werden Sie als unzuverlässig angesehen.
Natürlich wird bei der nächsten Überarbeitung dieses (und andere) Problem zuverlässig behoben.Aber das wird mehr als einen Monat in der Zukunft sein und ich wollte eine Notlösung, da die gesammelten Daten wichtig sind (die Anzahl der Besuche ist nicht wichtig).
Du scheinst ein netter Kerl zu sein, der unter dem Druck steht, dies richtig zu machen, und es tut mir leid, dass meine Antwort und meine Kommentare düster und düster erscheinen.Aber Sie sind es Ihrem Unternehmen schuldig, Störungen für Ihre Kunden so gering wie möglich zu halten, denn das sollte offensichtlich sein.Ich habe kaum ein Blockdiagramm eines Schnappschusses Ihrer Schaltung gesehen, daher würde ich Ihnen wärmstens empfehlen, Ihre Design-Hardware professionell überprüfen zu lassen.Ich bin übrigens nicht in diesem Geschäft, aber Sie werden vielleicht feststellen, dass es sich auszahlt.
"Kundeneindruck" ist hier unwichtig - es ist eher ein Forschungsprojekt und nicht wirklich für einen Kunden.Schließlich möchte ich ein EE-Profi werden und dieses Projekt ist eine perfekte Lernmöglichkeit.
#2
+4
anrieff
2019-03-25 21:13:08 UTC
view on stackexchange narkive permalink

Tut mir leid, dass ich die Antwort von Harry Svensson wieder akzeptiert habe! Und ich sollte nicht wirklich zu einer Frage hinzufügen, die mittlerweile 14 Monate alt ist.

Allerdings habe ich gerade die perfekte Softwarelösung gefunden, die den Tank voll Benzin gespart hätte, den ich schließlich verbrannt habe (sorry, Natur!).

Anstatt den Stift so einzustellen, dass er im Tiefschlaf hochgezogen wird, können Sie die Stifthaltefunktion verwenden, um den Stift in dem Zustand zu halten, in dem er sich vor dem Schlaf befand:

  #include "soc / rtc_cntl_reg.h"
#include "soc / rtc.h"
#include "driver / rtc_io.h"
...
digitalWrite (Pin, HIGH);
gpio_hold_en (Pin);
...
 

Das ist alles was Sie brauchen! Der Pin wird als CMOS-Ausgang beibehalten und je nach Bedarf stark auf HIGH oder LOW gesetzt.

Ich habe es mit folgendem Schema überprüft:

schematic

simulieren diese Schaltung - Schema erstellt mit CircuitLab sup>

Während des Betriebs beträgt der gemessene Strom ca. 110 µA (wie erwartet). Während des Tiefschlafens fällt der Strom mit dem alten Code (in der Frage, der einen schwachen Pull-up erzeugt) auf ~ 50 µA (der Pull-up-Widerstandswert liegt also im Bereich von 30 k). Mit dem hier vorgeschlagenen Code bleibt er bei 110 µA.

Das Ziehen von 110 µA im Ruhezustand eines batteriebetriebenen Geräts ist keine gute Sache.Es ist vielleicht besser als die Alternative, die Last einschalten zu lassen, aber es weist auf ein ziemlich unglückliches Schaltungsdesign hin.
Genau.Die Tatsache, dass ein schwacher Pull-up nicht ausreicht, ist ein sehr starker Indikator dafür, dass "etwas nicht stimmt, Kumpel" :)
#3
+3
Harry Svensson
2018-01-15 23:13:49 UTC
view on stackexchange narkive permalink

Hier sind zwei weitere Links von Personen, die es versucht haben. scheitern, wahrscheinlich scheitern.

Es sieht also nicht vielversprechend aus, es in Software zu lösen, wie Sie es versucht haben. Im Moment gibt es also 3 Fehler, Sie und die 2 Links.

Lösungsvorschläge:

  • A) Verbrenne einen Tank voll Benzin
    • Pro: Jedes Gerät, das Sie reparieren, funktioniert ordnungsgemäß.
    • Con: Ein Großteil Ihrer Zeit und Ihres Geldes wird für Benzin und Fahren verschwendet.

  • B) Reparieren Sie 1 Gerät in der Nähe und erstellen Sie ein kleines Tutorial für diejenigen, die Ihre Geräte erhalten haben. pay them, um einen Pull-up-Widerstand zu löten, z. Folgen Sie dem Tutorial. Ja, zahlen Sie sie, weil sie einige Arbeiten ausführen, die Sie in der Testphase Ihres Produkts nicht ausgeführt haben.

    • Pro: Dies ist billiger, und wer auch immer über die Geräte verfügt, könnte beruflich weniger an Sie denken, aber in Bezug auf das Vertrauen höher an Sie.
  • Con: Einige Leute ... scheitern einfach an einfachen Dingen, einschließlich Löten. Es besteht also die Möglichkeit, dass jemand sein Gerät ruiniert und ein anderes von Ihnen kaufen muss, das Sie kostenlos verschenken, was einen großen Verlust bedeuten kann.

  • C) Machen Sie dasselbe wie B , aber anstatt zu sagen, wer auch immer Ihre Geräte dazu gebracht hat, die Arbeit zu erledigen, stellen Sie einige zufällige Personen ein, die in der Nähe wohnen und dies für Sie tun können.

    • Pro: Wer auch immer über die Geräte verfügt, wird sich professionell fühlen.
    • Con: Welche zufällige Person auch immer, die Ihr Problem löst, weiß jetzt, wie man richtig mit Ihrem Instrument herumspielt.

  • D) Machen Sie dasselbe wie C , aber verwenden Sie Freunde (die möglicherweise in der Nähe wohnen) oder einige Kollegen anstelle einiger Zufälligkeiten.

    • Pro: Wer auch immer über die Geräte verfügt, wird sich professionell fühlen.
    • Con: Ihre Freunde werden denken, dass Sie unprofessionell sind.

  • E) Tun Sie, was der Benutzer DoxyLover vorschlägt: " Reparieren Sie einige Einheiten lokal und versenden Sie sie zusammen mit vorausbezahlten Rücksendeetiketten an Ihre Benutzer, damit diese die versenden könnenOriginale zurück an Sie. "


  • Wenn ich Sie wäre, würde ich rückwärts gehen und mit E beginnen.Wenn dies keine Option ist, fahren Sie mit D fort. Wenn Sie nicht mit C fortfahren können, wenn Sie nicht mit B em fortfahren können> und zuletzt mit A .

    Noch eine Option.Reparieren Sie einige Einheiten lokal und versenden Sie sie zusammen mit vorausbezahlten Rücksendeetiketten an Ihre Benutzer, damit diese die Originale an Sie zurücksenden können.
    @DoxyLover Wahrscheinlich die beste Lösung.
    Fühlen Sie sich frei, es in Ihre Antwort zu bearbeiten.
    Vielen Dank, mein allgemeines Gefühl war, dass ich mich in einer Situation gefangen habe, in der die Software das Hardware-Chaos nicht wirklich beheben kann.Ihre Antwort bestätigt dies.Wie bereits mit @Andy aka besprochen, handelt es sich eher um ein Forschungsprojekt und der "Kundeneindruck" ist unwichtig.Andere Einschränkungen eliminieren die Optionen E, D, C. Ich werde mehr darüber nachdenken, aber ich neige stark zu A.
    #4
    +2
    Dwayne Reid
    2018-12-20 06:00:16 UTC
    view on stackexchange narkive permalink

    Das Problem, das allen fehlt, ist, dass der Eingangsstrom, der benötigt wird, um den ULN2003 aktiv zu halten, jeden Versuch, Energie zu sparen, verhindert, indem der Mikrocontroller in den Tiefschlaf versetzt wird.

    Die richtige Lösung besteht darin, diesen Abschnitt von ULN2003 durch etwas zu ersetzen, das keinen Strom verbraucht, wie z. B. einen MOSFET.

    Ich frage mich jedoch, warum der ULN2003 überhaupt an dieser Stelle in der Schaltung ist.Warum kann der Mikrocontroller den EN-Pin am DC-DC-Wandler nicht direkt ansteuern?

    Möglicherweise müssen Sie höchstens einen hochwertigen Pulldown-Widerstand von EN nach Masse hinzufügen.

    "Warum kann der Mikrocontroller den EN-Pin am DC-DC-Wandler nicht direkt ansteuern?"- Da die Logik 1 des EN-Pins Vbatt ist, während der MCU-Ausgang 3,3 V beträgt, ist eine Pegelverschiebung erforderlich.
    #5
    +1
    Lewen
    2019-11-11 23:30:18 UTC
    view on stackexchange narkive permalink

    Es scheint, dass sich die Bibliothek aus der Antwort von @ anrieff am 25. März entwickelt hat.

    Ich habe diese Funktion eher mit den RTC-APIs von ESP32 implementiert. Natürlich ist diese Funktionalität immer noch für Anwendungen mit geringem Stromverbrauch vorgesehen, daher verwende ich einen MOSFET & ESP32, um eine andere Stromquelle zu steuern.

    Die offiziellen Beispiele sind sehr nützlich: https://github.com/espressif/esp-iot-solution/tree/master/examples

    Kommentare zum Code &:

      #include <driver / rtc_io.h>
    #define SWITCH_PIN GPIO_NUM_4
    #define uS_TO_S_FACTOR 1000000ULL / * Umrechnungsfaktor für Mikrosekunden in Sekunden * /
    #define TIME_TO_SLEEP 5 / * Zeit, in der ESP32 in den Ruhezustand wechselt (in Sekunden) * /
    
    RTC_DATA_ATTR int pinState = 0;
    
    void setup () {
        Serial.begin (115200);
    
        pinState = (pinState + 1)% 2; // zwischen & ausblättern
    
        rtc_gpio_init (SWITCH_PIN); // Initialisiere den RTC GPIO Port
        rtc_gpio_set_direction (SWITCH_PIN, RTC_GPIO_MODE_OUTPUT_ONLY); // setze den Port auf Nur-Ausgabe-Modus
        rtc_gpio_hold_dis (SWITCH_PIN); // Halte deaktivieren, bevor der Pegel eingestellt wird
    
        rtc_gpio_set_level (SWITCH_PIN, pinState); // hoch / niedrig setzen
    
        esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR);
    
        // gpio_deep_sleep_hold_en ();
        rtc_gpio_hold_en (SWITCH_PIN); // Hold für den RTC GPIO Port aktivieren
    
        Serial.println ("Jetzt schlafen gehen");
        Serial.flush ();
    
        esp_deep_sleep_start (); //Schlaf
    }}
     


    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...