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.
Analog Digital Wandler
Abschnitt betitelt „Analog Digital Wandler“Zuerst müssen wir die Klasse ADC aus dem Modul machine importieren.
from machine import ADCDer Konstruktor benötigt nur die Pin nummer.
from machine import ADCadc = ADC(32)Der ADC bietet uns zwei verschieden Methoden um den aktuellen Wert am Pin zu lesen.
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).
Diese Variante funktioniert nur auf dem ESP32.
from machine import ADC adc = ADC(32) microvolts = adc.read_uv() # Wert in microvoltsread_uv() gibt den gemessenen Wert in Mikrovolt zurück. 1V entspricht also 1.000.000 Mikrovolt.
Aufgabe: Poti als analoger Sensor
Abschnitt betitelt „Aufgabe: Poti als analoger Sensor“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
-
Bauen Sie folgende Schaltung auf. (
R=220Ω)
Hinweis: Aufbau in Wokwi oder Hardware möglich.Start Lab in Wokwi
-
Drehen Sie am Potentiometer und beobachten Sie die Werte welche über die serielle Konsole ausgegeben werden.
- Alle Werte liegen zwischen 0 und 65535.
-
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, Pinpoti = ADC(32)led = Pin(27, Pin.OUT)while True:value = poti.read_u16()# Hälfte von 2¹⁶ = 32768if value > 32768:led.on()else:led.off()
Messbereich ➜ Steuerungsbereich
Abschnitt betitelt „Messbereich ➜ Steuerungsbereich“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
Der gewünschte Wertebereich hat also 256 Schritte. Wir müssen nun also den ursprünglichen Bereich in 256 Schritte unterteilen.
| Ursprungsbereich | Zielbereich |
|---|---|
| 0 - 255 | 0 |
| 256 - 512 | 1 |
| 513 - 768 | 2 |
| … | … |
| 65024 - 65279 | 254 |
| 65280 - 65535 | 255 |
Foglende Formel kann für die Umrechnung genutzt werden:
Dabei ist
Implementierung der Funktion map
Abschnitt betitelt „Implementierung der Funktion map“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
mapausprobiert.
Kontrollfragen
Abschnitt betitelt „Kontrollfragen“Teste dein Wissen:
Abschnitt betitelt „Teste dein Wissen:“- Welchen maximalen Wert kann
read_u16()zurückgeben?
- Welchen Wert gibt
map(32768, 0, 65535, 0, 255)zurück?
- 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?
Ressources
Abschnitt betitelt „Ressources“machine.ADC