Bislang habe ich auf all meinen ESPuino-PCBs eine nicht-invertierende Mosfet-Schaltung eingesetzt, um die Peripherie im Deepsleep des ESP32 spannungslos zu schalten. De facto reden wir nicht von 0 V (sondern eher knapp 1 V), da durch anderweitige Verdrahtung noch Querströme fließen, aber es bringt auf jeden Fall was .
Die eigentliche Last (SD-Modul, MAX98357a, RFID-Reader und Neopixel) wird dabei durch einen P-Mosfet geschaltet. Der ihm vorgeschaltete N-Mosfet invertiert das Signal lediglich. Warum habe ich das so gemacht? Weil es gedanklich dann so ist, wie man sich einen Schalter vorstellt: Steuert man den N-Mosfet positiv an, dann steuert der P-Moset durch und Neopixel & Co werden mit Strom versorgt. Nachteil: Man benötigt zwei Mosfets.
Man kann das Ganze auch nur mit einem einzigen P-Mosfet machen, muss dann jedoch die Ansteuerungslogik invertieren. Heißt: Schaltet man LOW auf den P-Mosfet, dann steuert dieser durch und umgekehrt. Sparen tut man sich dabei wie gesagt den N-Mosfet und dazu noch dessen Gate-Pulldown-Widerstand. Der Widerstand zum Ansteuern des Gate (1 k) wird weiterhin gebraucht, hängt nun jedoch am P-Mosfet. Er begrenzt den kurzeitigen Strom beim Umladen des Gates. Dem Mosfet ist es egal, wenn ihr den Vorwiderstand weglasst, aber ggf. wird der Strom zu groß, den der GPIO dann kurzzeitig liefern muss (und geht kaputt). Literatur: Schalten mit Transistoren.
Mittels INVERT_POWER
kann man ESPuino nun „sagen“, dass die Ansteuerung invertiert geschehen soll. Damit eine invertierende Mosfet-Schaltung nun offiziell unterstützt und wird z.B. hier auch eingesetzt: ESPuino-miniD32(pro): Lolin D32/D32 pro mit SD_MMC und Port-Expander (SMD). Die Vorarbeiten dazu gehen auf einen Teil eines PRs von @SZenglein zurück. Ich habe das Ganze noch erweitert, so dass man auch per Port-Expander einen Mosfet ansteuern kann. D.h. unter POWER
können nun auch Port-Expander-Pins (100 bis 115) eingetragen werden. Vorteil: Man spart sich einen GPIO. Das Ganze geht natürlich wahlweise invertiert oder nicht-invertiert, in dem man es halt per INVERT_POWER
steuert.
Die Direktive INVERT_POWER
ist nun in den Files für die boardspezifische Konfiguration enthalten. Aktiviert ihr das fälschlicherweise oder vergesst es zu aktivieren, wenn ihr es tatsächlich aber benötigt, dann ist das Ergebnis das gleiche: ESPuino wird nicht ordentlich starten, da das SD-Modul nicht mit Spannung versorgt wird.
An die Programmierer unter euch:
- Als Begleiteffekt des PRs existiert nun eine Power.cpp, in der die Mosfet-Steuerung gekapselt ist.
- Die main.cpp musste ich hinsichtlich der Reihenfolge in setup() etwas reorganisieren. Weil wenn man mit einen Port-Expander etwas ansteuern möchte, dann muss man natürlich zuerst i2c instanzieren und dann den Port-Expander initialisieren.
- Die Initialisierung von Audio passiert nun vor dem Zuschalten der Versorgsspannung. Das sollte das Plöppgeräusch auf dem Lautsprecher beim Einschalten eliminieren (Danke an dieser Stelle an @SZenglein).