Raspberry Pi Pico: Experimente mit ADC

ADC bedeutet Analog-Digital-Converter bzw. Analog-Digital-Wandler. GPIOs, die über einen ADC verfügen, können analoge Signale in digitale Daten umzuwandeln. Im Prinzip wird hier eine Spannung am ADC-Eingang gemessen, die zwischen 0 und 3,3 Volt liegen darf (Raspberry Pi Pico).

Um die Möglichkeiten der ADCs vom Raspberry Pi Pico auszuprobieren, zu testen und festzustellen wie diese verwendet werden können, empfiehlt es sich ein paar einfache Experimente durchzuführen.

Schaltung

Raspberry Pi Pico: Experimente mit ADC

Um einen Spannungsabfall zu erzeugen, verwenden wir ein Potentiometer. Mit dem Potentiometer können wir den Widerstandswert stufenlos einstellen. Statt des Potentiometers können auch unterschiedliche Widerstände verwendet werden. Wenn man nicht so viele unterschiedliche Widerstände hat, kann man diese beliebig in Reihe oder auch parallelschalten.

Hinweis: Beim Verwenden der ADC-Kanäle wird man in der Regel gegen Ground (GND) messen. Um Einstreuungen von Störsignalen und digitalen Signalen zu minimieren, sollte man nicht irgendeinen GND-Pin verwenden, sondern den AGND-Pin an Pin 33, zwischen GPIO 27 und GPIO 28.

Aufbau und Bauteile

Raspberry Pi Pico: Experimente mit ADC

  • Potentiometer, 10K (103)

Hinweis: In diesem Aufbau wird ein Potentiometer verwendet, um den Widerstandswert und damit den Spannungsabfall stufenlos einzustellen. Wenn man kein Potentiometer hat, dann kann man stattdessen auch unterschiedliche Widerstände verwenden. Denkbar wäre, dass man sich mit diesem Aufbau ein Ohmmeter baut.

Programmcode für MicroPython

Der Programmcode fragt alle 2 Sekunden den ADC0 ab und ermittelt die abfallende Spannung in Form einer Ganzzahl und gibt sie auf der Kommandozeile/Shell aus. Was genau die Ganzzahl repräsentiert ist abhängig von dem Bauteil an dem gemessen wird. Das kann eine Temperatur sein oder die Helligkeit, oder irgendetwas anderes. Es ist die Aufgabe des Programmierers diesen Wert richtig zu interpretieren.

# Bibliotheken laden
import machine
import time

# Initialisierung des ADC0 (GPIO26)
adc0 = machine.ADC(26)
time.sleep(.1) # Wartezeit

# Initialisierung des ADC1 (GPIO27)
adc1 = machine.ADC(26)
time.sleep(.1) # Wartezeit

# Wiederholung
while True:
    # ADC0 und ADC1 als Dezimalzahl lesen
    read0 = adc0.read_u16()
    read1 = adc1.read_u16()
    
    # Ausgabe in der Kommandozeile/Shell
    print('ADC0:', read0, '/', read0 * 3.3 / 65536, 'V')
    print('ADC1:', read1, '/', read1 * 3.3 / 65536, 'V')
    print()
    
    # Warten
    time.sleep(2)

Programmcode für CircuitPython

# Bibliotheken laden
import board, analogio
import time

# Initialisierung des ADC0 (GPIO26)
adc0 = analogio.AnalogIn(board.GP26)
time.sleep(.1) # Wartezeit

# Initialisierung des ADC1 (GPIO27)
adc1 = analogio.AnalogIn(board.GP27)
time.sleep(.1) # Wartezeit

# Wiederholung
while True:
    # ADC0 und ADC1 als Dezimalzahl lesen
    read0 = adc0.value
    read1 = adc1.value
    
    # Ausgabe in der Kommandozeile/Shell
    print('ADC0:', read0, '/', read0 * 3.3 / 65536, 'V')
    print('ADC1:', read1, '/', read1 * 3.3 / 65536, 'V')
    print()
    
    # Warten
    time.sleep(2)

Experiment 1: Beschalteter ADC-Eingang (ADC0)

Drehe den Regler vom Potentiometer hin und her und beobachte den Wert von ADC0. Du wirst feststellen, dass die dezimalen Werte vergleichsweise hoch sein werden. Das hängt vom verwendeten Festwiderstand ab.

  • Welcher Wert wird ermittelt, wenn sich das Potentiometer in Mittelstellung befindet.
  • Welcher Wert wird ermittelt, wenn sich das Potentiometer in einer Endstellung befindet und in welche Richtung hast Du es gedreht?
  • Welcher Wert wird ermittelt, wenn sich das Potentiometer in der entgegengesetzten Endstellung befindet und in welche Richtung hast Du es gedreht?

Experiment 2: Unbeschalteter ADC-Eingang (ADC1)

Wie verhält sich eigentlich ein unbeschalteter ADC-Eingang?

Drehe den Regler vom Potentiometer hin und her und beobachte den Wert von ADC1. Obwohl das Potentiometer gar nicht mit dem ADC1 beschaltet ist und mechanisch auch keine Verbindung zu diesem ADC besteht, verändert sich der Wert vom ADC1 trotzdem. Nur wenig, aber trotzdem steht die Änderung wohl in Zusammenhang mit dem Potentiometer.

Man kann diesen Wert noch weiter beeinflussen, wenn man mit dem Finger in die Nähe des Pins fasst, mit dem der ADC verbunden ist. Der Wert lässt sich noch mehr beeinflussen, wenn man ein Verbindungskabel mit dem Pin verbindet und mit den Fingern das offene Kabelende berührt. Der Wert ändert sich dabei so signifikant, dass sich ein Berührungsschalter damit bauen lässt.

Programmcode für MicroPython mit picozero

„picozero“ ist eine Einsteiger-freundliche MicroPython-Bibliothek, um elektronische Bauteile, wie LEDs, Taster und Sensoren einfacher zu programmieren und zu steuern.

Das Potentiometer muss zwischen 3,3 Volt und GND angeschlossen werden. Der mittlere Anschluss (Schleifer) muss mit dem ADC0, verbunden werden.

from picozero import Pot
from time import sleep
pot = Pot(0)
while True:
    print('Wert: ' + str(pot.value) + ' / Spannung: ' + str(pot.voltage) + ' Volt')
    sleep(1)

Verbesserung der ADC-Genauigkeit mit einer externen Spannungsreferenz

Das Messen mit einem ADC bedeutet, dass man eine bekannte Größe mit einer unbekannten Größe ins Verhältnis setzt und über einen Dreisatz die unbekannte Größe berechnet. Dazu muss man sich darauf verlassen können, dass die bekannte Größe physikalisch korrekt und stabil ist. Dabei handelt es sich um eine Referenzspannung die beim Raspberry Pi Pico 3,3 Volt beträgt. Standardmäßig wird diese Referenzspannung von der internen 3,3-V-SMPS (Switching Mode Power Supply) geliefert. Aber, diese Spannung kann leicht von den angenommenen 3,3 V abweichen (z.B. 3,25 V), wenn der Spannungsregler unter Last gerät. Zum Beispiel beim Schalten von GPIOs oder bei der Kommunikation auf Schnittstellen-Leitungen. Die ADC-Referenzspannung hängt also von der Stromquelle ab, was zu Messfehlern bei der ADC-Messung führt.
Im Datenblatt des Raspberry Pi Pico wird zur Verbesserung der ADC-Genauigkeit eine externe Referenzspannung mit dem LM4040 für 3,0 Volt empfohlen.

Die Frage ist, ist es wirklich notwendig, eine Spannungsreferenz in Form eines LM4040 zu verwenden?

Wie immer muss man sagen, es kommt darauf an. Tatsächlich ist es nicht von der Hand zu weisen, dass die Stabilität des Spannungswandlers auf dem Board Einfluss auf die interne ADC-Referenzspannung hat.
Aber, wenn man einen ADC abfragt und sonst keine anderen GPIOs genutzt werden, dann ist die Spannung vom Spannungswandler recht stabil und damit die ADC-Genauigkeit vollkommen ausreichend und damit die Verwendung eines LM4040 unnötig. Er verbessert die Messergebnisse nur minimal.
Notwendig ist diese Spannungsreferenz nur dann, wenn über die Zeit und unter wechselnden Bedingungen, die Messwerte vergleichbar sein sollen, und man interne (z. B. durch einen Timer) oder externe Einflüsse (z. B. durch einen Interrupt) auf die Last des Spannungsreglers nicht ausschließen kann.

Beispiele und Anwendungen mit ADC

In der Regel wird man digitale Sensoren bevorzugen. Aber auch hier wird ein analoger Wert gemessen, der von der Sensor-Schaltung in einen digitalen Wert umgewandelt wird. Ein zusätzlicher Controller überträgt die Daten.

Es folgen ein paar Anwendungen, bei denen ein ADC-Eingang vom Raspberry Pi Pico verwendet und der analoge Wert in einen digitalen Wert umgewandelt wird. Hierbei wird in der Regel eine Umrechnung durchgeführt oder der ermittelte Wert interpretiert.

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