27. Lektion: ADC
Der ADC des Pico[Bearbeiten | Quelltext bearbeiten]
Der Pico verfügt über einen 12-bit ADC der durch einen Multiplexer (MUX) auf 5 Eingänge umgeschaltet werden kann.
- ADC0 - GPIO26
- ADC1 - GPIO27
- ADC2 - GPIO28
- ADC3 - Vbus - auf dem Pico-Board
- ADC4 - interner Temperatur Sensor
Der ADC hat eine Auflösung von 12-bit. Allerdings ist die Kennline des ADC recht unlinear. Im Datenblatt wird eine nutzbare Genauigkeit von 8,7 bit angegeben.
Die maximale Messrate liegt bei 500kHz. Im Micropython für den Pico ist die Einstellung der Messrate nicht vorgesehen.
Eine Instanz von ADC erstellen[Bearbeiten | Quelltext bearbeiten]
Eine Instanz von ADS zu erstellen ist ganz einfach. Außer der ID oder des GPIO muss und kann nichts weter angegeben werden:
from machine import ADC adc_0 = ADC(0) # mit ID adc_1 = ADC(27) # mit GPIO
Die Methoden von ADC[Bearbeiten | Quelltext bearbeiten]
Die Methoden von ADC sind sehr übersichtlich. Es ist nur eine implementiert.
wert = adc.read_u16()
Der ADC misst nur mit 12-bit Auflösung, also werten von 0 ... 4095. Der Rückgabewert ist aber 16-bit groß. Demnach wird der Wert des ADC mit 16 multipliziert zurück gegeben.
Die in der Doku von Micropython angeführt Methode adc.read_uv(), die einen Spannungswert zurückgeben soll gibt es nicht.
Ein simples Script[Bearbeiten | Quelltext bearbeiten]
Hier ein kleines Script, das die Spannung am Poti misst und den binären Wert (x16) zurück gibt:
import machine import utime potentiometer = machine.ADC(26) while True: print(potentiometer.read_u16()) utime.sleep(1)
Ausgabe:
65535 # oberer Anschlag 53501 41050 4193 320 # unterer Anschlag 320 336
Der ADC hat eine Auflösung von 12-bit, der Rückgabewert wird aber als 16-bit Wert ausgegeben. Also um 4-bit nach links verschoben.
Hier ist zu sehen, das beim Poti am oberen Anschlag auch der maximale Wert auf 16-bit umgerechnet (65535) gemessen wird.
Am unteren Anschlag wird ein Wert von 320/336 gemessen. Das entspricht auf 12-bit umgerechnet 20/21.
Das entspricht 0.01611328 Volt. Bezogen auf die maximale Spannung von 3,3 Volt ist das ist ein Verhältnis von 208,4:1.
Messwert in Spannung umrechnen[Bearbeiten | Quelltext bearbeiten]
Um den Messwert (0 ... 65535) in Volt umzurechnen benötigen wir einen Umrechnungsfaktor. Ich habe ihn zu_volt genannt.
zu_volt = 3.3 / 65535 messwert = 32578 spannung = messwert * zu_volt 1.640458
Vbus messen[Bearbeiten | Quelltext bearbeiten]
Häufig findet man in Internet die Angabe, dass ADC(3) mit Vsys verbunden wäre. Das ist nicht richtig. Gemäß Datenblatt und Schaltplan ist er über einen Spannungsteiler mit Vbus verbunden. Wie der Ausschnitt aus dem Schaltplan des Pico zeigt wird Vbus durch einen Spannungsteiler auf einen für den ADC brauchbaren Wert geteilt.
Leider ist bei meinem Exemplar des Pico auch Vbus nich angeschlossen.
Vbus Messung
Der Spannungsteiler erzeugt ein Teilverhältnis von Messspannung = Vbus / (5,6 + 10) * 10 => 0.641. aus den 5 Volt werden demnach 3.20 Volt.
Daraus errechnet sich
Vbus = Messwert[V] / 0,641 mit dem Messwert in Volt
oder
Vbus = Messwert / 0,641 * 5.035476e-05 mit dem Messwert als binäre Zahl und dem Umrechnungsfaktor zu_volt (3.3/65535).
Temperatur messen[Bearbeiten | Quelltext bearbeiten]
Der 5. ADC-Kanal misst die Chiptemperatur. Hier ein Beispiel zur Messung der Chiptemperatur:
from machine import ADC from time import sleep temp = ADC(4) zu_volt = 3.3 / 65535 while True: messwert = temp.read_u16() spannung = messwert * zu_volt temperatur = 27 - (spannung - 0.706) / 0.001721 print("Temperatur (°C): ", temperatur) sleep(1)
Die Informationen hierzu habe von https://www.elektronik-kompendium.de/sites/raspberry-pi/2612121.htm.
Probleme beim ADC[Bearbeiten | Quelltext bearbeiten]
Die Spannungsmessung mit dem ADC ist generell nicht unproblematisch. Die digitalen Signale im MC lassen sich nicht ganz vom ADC fernhalten, so das es immer zu springen messwerten kommt. Beim Pico kommt noch hinzu, das er einen Schaltwandler auf der Platine hat. Um die Störungen zu reduzieren, kann man diesen in einen anderen Modus schalten. Aber auch dann bleibt noch ein nicht unerhebliches Rauschen übrig.
Problematisch können auch unsaubere Verbindungen sein. Das kann insbesondere bei Steckbrett Aufbauten zu unangenehmen Problemen führen.
Weiterhin fangen die ADC meist nicht bei 0 Volt an zu arbeiten oder haben bei 0 Volt schon einen Offestt. Häufig ist die Kennlinie nicht linear (ESP32). Beim Pico gibt es einige Messwerte die total falsch sind.
So einfach die Softwareseite des ADC ist, so komliziert ist die Hardwareseite.
Alternative zum internen ADC[Bearbeiten | Quelltext bearbeiten]
Wenn genauere Werte erforderlich sind bietet sich Breakout Board mit dem ADS1115 an. Dieses wird über den I2C-Bus mit dem Microcontroller verbunden.
Der ADS1115 hat einen 16-bit ADC und ein MUX für 4 Kanäle. Gemäß Datenblatt ist sowohl die INL (Integral nonlinearity) als auch die DNL (differential nonlinearity) < 1 LSB. Der Preis liegt (12/2023) ab € 7.-
Weitere Informationen dazu findet man problemlos in Internet. Module für den ADS1115 gibt es ebenfalls im Internet.
ADC untersuchen[Bearbeiten | Quelltext bearbeiten]
Hierzu habe ich eine eigene Seite gemacht: Pico ADC untersuchen
[Bearbeiten | Quelltext bearbeiten]
Zurück zur "Micropython Kurs 2023 Teil 2" Startseite
Zurück zur "Micropython Kurs 2023" Startseite
Zurück zur Programmieren Startseite
Zurück zur Wiki Startseite