Raspberry Pi Pico als Gleichspannungsgenerator mit MCP4725

Der Raspberry Pi Pico ist ein leistungsfähiger Mikrocontroller mit vielen digitalen Ein- und Ausgängen. Allerdings besitzt er keinen analogen Ausgang. Er kann also keine echten analogen Spannungen erzeugen, sondern nur digitale Signale (z. B. PWM). Für die Ausgabe analoger Signale wird ein Digital-Analog-Wandler (DAC) benötigt. Ein solcher DAC kann im einfachsten Fall ein MCP4725-Modul sein, der vom Raspberry Pi Pico gesteuert wird.

Ein MCP4725-Modul kann dazu verwendet werden, um eine feste Spannung zu erzeugen. Diese Gleichspannung kann zwischen 0 und der DAC-Versorgungsspannung (z. B. 3,3 Volt) liegen. Damit lässt sich der Raspberry Pi Pico beispielsweise als einstellbarer Festspannungsgenerator oder Referenzspannungsquelle nutzen.

So entsteht ein steuerbarer Gleichspannungsgenerator auf Basis des Raspberry Pi Pico.

Aufbau und Bauteile

Raspberry Pi Pico: MCP4725 programmieren

Raspberry Pi Pico MCP4725-Modul
3V3 Pin 36 3V3
GND Pin 33 GND
GPIO0 I2C SDA Pin 1 I2C SDA
GPIO1 I2C SCL Pin 2 I2C SCL

Programmcode für die Messung mit einem Messgerät oder Mini-Voltmeter

Im folgenden Programmcode nutzt der Raspberry Pi Pico einen MCP4725 (Digital-Analog-Wandler, DAC), um eine Gleichspannung zu erzeugen.
Das Programm steuert über den I2C-Bus den MCP4725, der aus einem digitalen Wert (Ganzzahl von 0 bis 4.095) eine analoge Gleichspannung zwischen 0 V und VCC erzeugt.
Damit die Spannung direkt im Programmcode eingegeben werden kann dient die Funktion „set_voltage()“, die dann in eine Ganzzahl von 0 bis 4.095 umgerechnet wird.

# Bibliotheken laden
import machine
import time

# Konfiguration: Gleichspannung
V_REF = 3.3   # Referenzspannung in Volt
DELAY = 5     # Sekunden zwischen den Gleichspannungen

# Liste der Gleichspannungen in Volt
VOLTAGE_LIST = [0, 1.0, 2.0, 3.0, 3.3, 0]

# I2C-Initialisierung
DAC = machine.I2C(0, scl=machine.Pin(1), sda=machine.Pin(0), freq=400000)

# Funktion: Daten an den DAC senden
def write_dac(value):
    # Wert zwischen 0 und 4095
    value = max(0, min(4095, value))
    # Daten an den DAC senden (Fast Mode)
    DAC.writeto(0x60, bytes([(value >> 8) & 0x0F, value & 0xFF]))

# Spannung setzen
def set_voltage(voltage):
    if voltage > V_REF: voltage = V_REF
    # 0 entspricht 0 V, 4095 entspricht V_REF
    value = int((voltage / V_REF) * 4095)
    write_dac(value)

# Beispiel: Spannung einstellen
for voltage in VOLTAGE_LIST:
    print(f"Setze Ausgang auf {voltage:.2f} Volt")
    set_voltage(voltage)
    print()
    time.sleep(DELAY)

Programmcode für die Messung mit einem internen ADC

Der folgende Programmcode unterscheidet sich im wesentlichen nicht vom vorhergehenden. Der einzige Unterschied liegt im zusätzlich initialisierten ADC, der in der Schleife die erzeugte Gleichspannung misst und auf der Kommandozeile anzeigt.

# Bibliotheken laden
import machine
import time

# Konfiguration: Gleichspannung
V_REF = 3.3   # Referenzspannung in Volt
DELAY = 5     # Sekunden zwischen den Gleichspannungen

# Liste der Gleichspannungen in Volt
VOLTAGE_LIST = [0, 1.0, 2.0, 3.0, 3.3, 0]

# I2C-Initialisierung
DAC = machine.I2C(0, scl=machine.Pin(1), sda=machine.Pin(0), freq=400000)

# Initialisierung des ADC0 (GPIO26)
adc0 = machine.ADC(26)

# Daten an den DAC senden
def write_dac(value):
    # Wert zwischen 0 und 4095
    value = max(0, min(4095, value))
    # Daten an den DAC senden (Fast Mode)
    DAC.writeto(0x60, bytes([(value >> 8) & 0x0F, value & 0xFF]))

# Spannung setzen
def set_voltage(voltage):
    if voltage > V_REF: voltage = V_REF
    # 0 entspricht 0 V, 4095 entspricht V_REF
    value = int((voltage / V_REF) * 4095)
    write_dac(value)

# Beispiel: Spannung einstellen
for voltage in VOLTAGE_LIST:
    print(f"Setze Ausgang auf {voltage:.2f} Volt")
    set_voltage(voltage)
    time.sleep(0.1)
    # Spannung mit ADC messen
    adc0_value = adc0.read_u16()
    print(f"ADC: {adc0_value:5d} | Spannung: {adc0_value*V_REF/65536:.2f} Volt\n")
    time.sleep(DELAY)

Aufgabe: Wer misst genauer?

Eine einfache Aufgabe ist, herauszufinden, welches Messinstrument genauer misst, wenn man davon ausgeht, dass die Ausgabe des DAC ziemlich genau ist.

  • Mini-Voltmeter
  • Messgerät
  • ADC

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