Raspberry Pi Pico: ADC richtig initialisieren

In der Einsteiger-Dokumentation für den Raspberry Pi Pico mit MicroPython wird ein ADC mit dem ADC-Kanal initialisiert:

# Variante mit der ADC-Kanal-Nummer 0
adc = machine.ADC(0)

Es gibt noch eine zweite Variante, wie sich ein ADC initialisieren lässt:

# Variante mit der GPIO-Nummer 26
adc = machine.ADC(26)

Der Unterschied ob die ADC-Instanz mit der ADC-Kanal-Nummer oder der GPIO-Nummer initialisiert wird, ergibt sich aus den unterschiedlichen Messwerten. Die Frage ist, was ist falsch und was ist richtig, und warum ist das so.

Die kurze Antwort ist, die Initialisierung über die ADC-Kanal-Nummern 0, 1, 2 und 3 führen zu falschen Messwerten.

Initialisierung mit ADC-Kanalnummer oder GPIO-Nummer?

Beim Mikrocontroller RP2040 des Raspberry Pi Pico besitzen die GPIOs nach einem Reset zunächst einen internen Pull-Down-Widerstand. Dieser liegt typischerweise im Bereich von 50 bis 80 kOhm.

Bei einer ADC-Messung würde dieser Pull-Down-Widerstand parallel zur angeschlossenen Messschaltung liegen. Bei einer hochohmigen Signalquelle würde das den Messwert beeinflussen. Das gilt es zu vermeiden.

  • Bei der Initialisierung mit machine.ADC(0) wird die GPIO-Konfiguration unverändert übernommen und je nach vorheriger Konfiguration irgendein Ausgangszustand herrschen.
  • Bei der Initialisierung mit machine.ADC(machine.Pin(26)) wird der GPIO in den für die ADC-Messung geeigneten High-Z-Zustand versetzt. Der interne Pull-Down-Widerstand beeinflusst die Messung dadurch nicht.

Empfehlung: Die ADC-Initialisierung sollte mit der GPIO-Nummer erfolgen und nicht mit der ADC-Kanal-Nummer.

Hinweis: Es gibt in der Praxis eigentlich nur einen Fall, wo man einen ADC mit der ADC-Kanal-Nummer initialisieren muss. Das ist beim internen Temperatursensor, der die ADC-Kanal-Nummer 4 hat.

ADC richtig initialisieren

Im Prinzip ist es sinnvoll, immer die GPIO-Nummer beim Initialisieren zu verwenden, um grobfalsche Messwerte zu vermeiden.

Folgende Initialisierungen verhalten sich identisch:

adc = machine.ADC(26)
adc = machine.ADC(machine.Pin(26))
adc = machine.ADC("GP26")

Weil gute Programmierung immer eindeutig ist, empfiehlt sich folgende Initialisierung:

adc = machine.ADC(machine.Pin(26, machine.Pin.IN, pull=None))

Bei dieser Initialisierung sieht man auf einen Blick, dass der GPIO als Eingang und ohne Pull-Down- oder Pull-Up-Widerstand als ADC initialisiert wird. Diese Zeile ist sozusagen unmissverständlich. Auf diese Weise wird der GPIO so eingestellt, wie er für den ADC sein muss.

Programmcode zum Experimentieren

Wer das ausprobieren möchte kann folgenden Programmcode verwenden:

import machine
import time

# Variante mit der ADC-Kanal-Nummer 0 (falsch)
adc = machine.ADC(0)

# Variante mit der GPIO-Nummer 26 (richtig)
#adc = machine.ADC(26)
#adc = machine.ADC(machine.Pin(26))
#adc = machine.ADC("GP26")

# Vollständige Variante (Empfehlung)
#adc = machine.ADC(machine.Pin(26, machine.Pin.IN, pull=None))

# Wartezeit nach der ADC-Initialsierung (!)
time.sleep(.1)

# Messwert messen
value = adc.read_u16()

# Messwert ausgeben
print(value)

Warum ist nach der Initialisierung und damit vor der Messung eine Wartezeit?

Die Wartezeit hat nichts mit der Messung zu tun, sondern mit der ADC-Initialisierung. Die kann unter Umständen noch nicht vollständig abgeschlossen sein, wenn am ADC gemessen wird. Um falsche Werte zu vermeiden, ist nach der Initialsierung eine Wartezeit eingebaut, damit die vollständige abgeschlossen ist, wenn gemessen wird.

Weitere verwandte Themen:

Elektronik-Sets für das Hardware-nahe Programmieren

Der Elektronik-Kompendium Club ist ein Online-Treffpunkt für Hobby-Elektroniker und Maker.

Wir wollen:

  • Anregungen und Lösungen von echten Menschen bekommen
  • Menschen zusammenbringen und gemeinsam wachsen
  • Erfahrungen machen und teilen

Jetzt mehr erfahren und Mitglied werden

Elektronik-Kompendium Club Meeting

Elektronik-Sets für das Hardware-nahe Programmieren

Frag Elektronik-Kompendium.de