27. Lektion: ADC

Aus Attraktor Wiki

Wechseln zu: Navigation, Suche


Der ADC des Pico

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

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

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

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

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

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

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

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

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

Hierzu habe ich eine eigene Seite gemacht: Pico ADC untersuchen


Navigation

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

Diese Seite wurde zuletzt am 23. Januar 2024 um 19:36 Uhr geändert. Diese Seite wurde bisher 1.919 mal abgerufen.