27. Lektion: ADC: Difference between revisions
| Line 51: | Line 51: | ||
== Vbus messen== | == Vbus messen== | ||
Wie der Ausschnitt aus dem Schaltplan | Wie der Ausschnitt aus dem Schaltplan des Pico zeigt wird Vbus durch einen Spannungsteiler auf einen für den ADC brauchbaren Wert geteilt. | ||
<br> | <br> | ||
[[file:Vbus_messung.png|Vbus Messung]] | [[file:Vbus_messung.png|Vbus Messung]] | ||
Revision as of 17:53, 17 December 2023
Der DAC des Pico
Der Pico verfügt über einen ADC der durch einen Multiplexer (MUX) über 4 Eingänge verfügt.
- 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.
Ein simples Script
Der Klasse ADC kann der gewünschte ADC-Kanal mit der Kanalnummer (0 ...4) oder der GPIO-Nummer (26, 27, 28) mitgeteilt werden.
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 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 gemessen. Das direkte Kurzschließen von GPIO26 und GND brachte keine Veränderung. Demnach ist das Wert, den der ADC bei 0 Volt liefert.
Umgerechnet entspricht das 0.01611328 Volt. 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 zu_volt genannt.
zu_volt = 3.3 / 65535 messwert = 32578 spannung = messwert * zu_volt 1.640458
Vbus messen
Wie der Ausschnitt aus dem Schaltplan des Pico zeigt wird Vbus durch einen Spannungsteiler auf einen für den ADC brauchbaren Wert geteilt.
Der Spannungsteiler erzeugt ein Teilverhältnis von Messspannung = Vbus / (5,6 + 10) * 10 => 0.641. aus den 5 Volt werden demnach 3.20 Volt.
Daraud 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
Leider wurde diese Option nicht realisiert. Der Messwert war nur 528. Das entspricht 0,044 Volt.
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(2)
Die Informationen hierzu habe von https://www.elektronik-kompendium.de/sites/raspberry-pi/2612121.htm.
Probleme beim ADC
ADC untersuchen
Hierzu habe ich eine eigene Seite gemacht: Pico ADC untersuchen
- Rauschen des Schaltreglers
- schlechte Kontaktgabe beim Breadboard
- https://randomnerdtutorials.com/raspberry-pi-pico-analog-inputs-micropython/
- ADC des Raspberry Pi Pico
- ADC des ESP32
- ADC ADS1115
- https://www.ti.com/lit/ds/symlink/ads1115.pdf?ts=1693292712477&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252Fde-de%252FADS1115
- https://www.az-delivery.de/products/analog-digitalwandler-ads1115-mit-i2c-interface?variant=19034185039968
- https://www.berrybase.de/ads1115-4-kanal-16-bit-ad-wandler-breakout-board
- https://github.com/wollewald/ADS1115_mpy
- https://github.com/robert-hh/ads1x15
- https://pypi.org/project/ADS1115-mic-py/
- https://www.grzesina.de/az/blog_robotcar/ads1115rc.py
- https://how2electronics.com/ads1115-16-bit-adc-module-with-raspberry-pi-pico/