Zum Inhalt springen

Analoge Signale messen

Mit einem Analog Digital Wandler (ADC) können wir analoge Signale messen. Ein ADC wandelt eine analoge Spannung in einen digitalen Wert um, den wir in unserem Programm weiterverarbeiten können. Dies ist besonders nützlich, wenn wir Sensoren verwenden, die analoge Signale ausgeben, wie zum Beispiel ein Potentiometer oder analoger Distanzsensor.

Zuerst müssen wir die Klasse ADC aus dem Modul machine importieren.

main.py
from machine import ADC

Der Konstruktor benötigt nur die Pin nummer.

main.py
from machine import ADC
adc = ADC(32)

Der ADC bietet uns zwei verschieden Methoden um den aktuellen Wert am Pin zu lesen.

main.py
from machine import ADC
adc = ADC(32)
value = adc.read_u16()

read_u16() gibt einen Wert zwischen 0 und 65535 zurück, welcher die gemessene Spannung repräsentiert. 0 entspricht dabei 0V und 65535 entspricht der Referenzspannung (typischerweise 1,1V).

Ein Potentiometer wirkt wie ein verstellbarer Spannungsteiler, der die Spannung zwischen GND und VCC in Abhängigkeit von der Position des Schleifkontakts teilt. Durch Drehen des Potentiometers kann die Ausgangsspannung stufenlos verändert und an verschiedene Anforderungen angepasst werden

  1. Bauen Sie folgende Schaltung auf. (R=220Ω) Aufbau Button Hinweis: Aufbau in Wokwi oder Hardware möglich.

    Start Lab in Wokwi

  2. Drehen Sie am Potentiometer und beobachten Sie die Werte welche über die serielle Konsole ausgegeben werden.

    • Alle Werte liegen zwischen 0 und 65535.
  3. Verändern Sie das Program so, dass die LED über den Poti ein und aus geschaltet werden kann. Die Grenze soll genau in der Mitte des Wertebereichs liegen.

    • Scheint zu funktionieren.
    Mögliche Lösung
    main.py
    from machine import ADC, Pin
    poti = ADC(32)
    led = Pin(27, Pin.OUT)
    while True:
    value = poti.read_u16()
    # Hälfte von 2¹⁶ = 32768
    if value > 32768:
    led.on()
    else:
    led.off()

Ein häufiges Problem im Zusammenhang mit dem Einlesen analoger Werte ist das Umrechnen dieser Werte in einen anderen Wertebereich. Als Beispiel soll mit einem Potentiometer eine LED gedimmt werden. Wir haben nun gesehen, dass wir Werte zwischen 0 und einlesen können. Zum Dimmen der LED benötigen wir nun einen Wertebereich zwischen 0 und 255.

Der gewünschte Wertebereich hat also 256 Schritte. Wir müssen nun also den ursprünglichen Bereich in 256 Schritte unterteilen.

UrsprungsbereichZielbereich
0 - 2550
256 - 5121
513 - 7682
65024 - 65279254
65280 - 65535255

Foglende Formel kann für die Umrechnung genutzt werden:

Dabei ist der Ursprungsbereich und der Zielwertebereich. rehy

Folgende Implementierung der Funktion map setzt die oben beschriebene Formel um:

def map(value, min_in, max_in, min_out, max_out):
if min_in == max_in:
raise ValueError("Der Eingabebereich darf nicht null sein.")
return (value - min_in)/(max_in - min_in) * (max_out - min_out) + min_out
  • Habe die Implementierung der Funktion map ausprobiert.
  1. Welchen maximalen Wert kann read_u16() zurückgeben?
  1. Welchen Wert gibt map(32768, 0, 65535, 0, 255) zurück?
  1. Ein analoger Sensor liefert Werte zwischen 1V und 3V. Welcher minimale Wert wird von read_u16() zurückgegeben, wenn die Referenzspannung 3.3V beträgt?