Raspberry Pi Pico: Überwachen der Versorgungsspannung an VSYS

Beim Mikrocontroller-Board Raspberry Pi Pico ist der ADC 3 (GPIO 29) intern über einen Spannungsteiler mit VSYS (Pin 39) verbunden. Da bietet es sich regelrecht an, die Versorgungsspannung an VSYS zu überwachen. Aber, ein korrektes Ergebnis zu bekommen ist nicht so ganz einfach, wie man sich das vielleicht denkt.
Bei der Messung von VSYS sind unterschiedliche Vorgehensweise beim Raspberry Pi Pico und Pico W notwendig, weil der GPIO 29 (ADC 3) beim Pico W (mit WLAN-Chip) eine doppelte Funktion hat.

Was können wir damit alles machen?

  • Überwachen der Versorgungsspannung: VSYS ist der Pin (39), an dem immer eine Versorgungsspannung anliegt. Egal, ob über den USB oder eine andere Spannungsquelle direkt per VSYS. Indem man die dort anliegende Spannung über ADC3 misst, kann man ermitteln, wie stabil die Stromversorgung ist.
  • Batteriebetrieb erkennen: Wird der Raspberry Pi Pico über den USB gespeist, kann man an VSYS 4,7 bis 4,9 Volt messen. Erst im Batteriebetrieb ist es weniger. Denkbar wäre es, dass man den Ladezustand, auch über die Laufzeit, ermittelt und vorab erkennt, dass der Ladezustand der Batterie zu gering wird, um einen stabilen Betrieb zu gewährleisten. Alternativ kann der Programmcode im Batterie-Betrieb sich anders verhalten und zum Beispiel versuchen in einen energiesparenden Modus zu wechseln.

Aufbau

Messaufbau mit Raspberry Pi Pico und Mini-Voltmeter zum Messen von VSYS

Der Messaufbau befindet sich auf einem Steckbrett, auf dem sich ein Raspberry Pi Pico und ein Mini-Voltmeter befinden. Mit dem Mini-Voltmeter misst man die Spannung der Spannungsquelle.

  • Steckbrett
  • Raspberry Pi Pico oder Pico W (RP2040) / Raspberry Pi Pico 2 W (RP2350)
  • Optional: Messgerät oder Mini-Voltmeter

Dieser Aufbau dient zur Messung von VSYS:

  • per ADC
  • mit Multimeter

Aber, schauen wir lieber ganz genau hin und messen mit einem Messgerät direkt an VSYS nach und vergleichen das Ergebnis vom Messgerät und des folgenden Programmcodes.

Programmcode

Das Messen der Spannung an VSYS mit dem ADC 3 ist denkbar einfach. Tatsächlich ist das mit wenigen Zeilen Programmcode erledigt. Und Fehler beim Aufbau kann man keine machen, weil VSYS auf dem Board bereits mit dem ADC 3 verbunden ist.

Zu beachten ist, dass intern nicht direkt an VSYS gemessen wird, sondern an einem Widerstand von einem Spannungsteiler. Erschwerend kommt hinzu, dass der GPIO 29 einen internen Pulldown-Widerstand hat, der abgeschaltet werden muss, sonst verfälscht er das Messergebnis. Beide Probleme werden im Programmcode berücksichtigt.
Außerdem wird berücksichtigt, wenn der Programmcode auf einem Pico mit WLAN-Chip läuft.

# Bibliotheken laden
import machine
import time

# WLAN-Konfiguration
WLAN_SSID = 'wlan_name'
WLAN_PW = 'wlan_passwort'
WLAN_CC = 'DE'

# Funktion: WLAN-Verbindung
def wlanConnect():
    # Status-LED
    led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0)
    # WLAN-Verbindung herstellen
    network.country(WLAN_CC)
    wlan = network.WLAN(network.STA_IF)
    if not wlan.isconnected():
        print('WLAN-Verbindung wird hergestellt:', WLAN_SSID)
        wlan.active(True)
        wlan.connect(WLAN_SSID, WLAN_PW)
        for i in range(10):
            if wlan.status() < 0 or wlan.status() >= 3: break
            led_onboard.toggle()
            print('.', end="\r")
            time.sleep(1)
    if wlan.isconnected():
        print()
        print('WLAN-Verbindung hergestellt')
        led_onboard.on()
        time.sleep(3)
        netConfig = wlan.ifconfig()
        print('WLAN-Status:', wlan.status(), 'IPv4-Adresse:', netConfig[0], '/', netConfig[1], 'Standard-Gateway:', netConfig[2], 'DNS-Server:', netConfig[3])
    else:
        print("\n", 'Keine WLAN-Verbindung')
        led_onboard.off()
        print('WLAN-Status:', wlan.status())
    print()
    return wlan

# Funktion: VSYS messen (mit und ohne WLAN-Chip)
def get_vsys_voltage():
    try:
        import network
    except ImportError:
        machine.Pin(29, machine.Pin.IN, pull=None) # Pulldown-Widerstand abschalten!
        time.sleep(.1) # kurze Wartezeit
        adc_raw = machine.ADC(3).read_u16()
    else:
        # Konfiguration: GPIO 25 und 29
        machine.Pin(25, machine.Pin.OUT, pull=machine.Pin.PULL_DOWN, value=1)
        machine.Pin(29, machine.Pin.IN, pull=None)
        time.sleep(.1) # kurze Wartezeit
        # Messung: VSYS
        adc_raw = machine.ADC(3).read_u16()
        # Konfiguration: GPIO 25 und GPIO 29
        machine.Pin(25, machine.Pin.OUT, pull=machine.Pin.PULL_DOWN, value=0)
        # GPIO wiederherstellen und WLAN aktivieren
        machine.Pin(29, machine.Pin.ALT, pull=machine.Pin.PULL_DOWN, alt=7)
    # Spannung in Volt umrechnen
    return adc_raw * 3.3 / 65536 * 3

# WLAN-Verbindung herstellen, wenn verfügbar
try:
    import network
except ImportError:
    pass
else:
    wlan = wlanConnect()

# VSYS messen
vsys_voltage = get_vsys_voltage()

# Ausgeben
print('Spannung an VSYS (Pico-Pin 39):', "{:.2f}".format(vsys_voltage), 'V')

Hinweis: Die vom Programmcode ermittelte VSYS-Spannung sollte ungefähr der Spannung am Messgerät entsprechen.

Erweiterung

Der Raspberry Pi Pico ermöglicht die Überwachung des Batterie-Ladezustands über den ADC 3 (GPIO 29), der mit VSYS verbunden ist. Der Programmcode zur Messung berücksichtigt Unterschiede zwischen dem Pico und Pico W. Nutzer müssen Spannungsgrenzen für volle und leere Batterien festlegen.

Alternative

Wenn die Überwachung der Stromversorgung besonders kritisch ist, dann sollte man ein externes Modul mit einem INA226 verwenden. Der Chip ist sehr präzise und unterstützt über I2C auch die Kommunikation mit einem Raspberry Pi Pico und MicroPython.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren