
Raspberry Pi Pico und ADC
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry
Der ADC im Raspberry Pi Pico hat eine Auflösung von 12 Bit
und drei externe Eingänge. Ein vierter Eingang misst die interne
Temperatur des Controllers. Der AD-Wandler liefert Werte zwischen 0 und
4095, die aber vom System mit 16 multipliziert werden, um als
16-Bit-Zahl bis rund 65000 weitergegeben zu werden.
Zur Überprüfung der Genauigkeit habe ich ein geglättetes PWM-Signal
langsam hochgefahren. Am Eingang liegt ein Elko mit 100 µF. Ein zweiter
Elko glättet die Referenzspannung.
#ADC und PWM
import time
from machine import Pin, PWM
ad_in = Pin(28, Pin.IN)
u = machine.ADC(2)
pwm0 = PWM(Pin(0))
pwm0.freq(20000)
pwm0.duty_u16(0)
time.sleep(1)
da=0
while (True):
pwm0.duty_u16(da)
time.sleep(0.5)
print(u.read_u16()//16)
da = da + 16
Bei der Messung teile ich den AD-Wert durch 16, um die gewohnte
12-Bit-Darstellung zu bekommen. Der PWM-Ausgang wird ebenfalls über
eine 16-Bit-Zahl gesteuert, Weil ich ihn in Schritten zu 16 erhöhe,
entspricht das genau einer Bit-Stufe des AD-Wandlers.
Das Ergebnis habe ich mit bis knapp unter 200 (das entspricht 165 mV)
angesehen und mit Excel dargestellt. Die grüne Kurve entspricht dem
erwarteten Verlauf, die rote wird tatsächlich gemessen. Die blaue Kurve
stammt aus einer zweiten Messung, bei der einfach die exponentielle
Entladung von 100 µF über 100 k gemessen wurde. Beide Messungen zeugen,
dass die Messung nicht ganz bis Null reicht. Dadurch entsteht eine
Unlinearität am unteren Ende. Außerdem gibt es immer wieder Ausreißer
um rund 10 Stufen. Die effektive Genauigkeit entspricht nur ungefähr
einem 8-Bit-Wandler. Das Datenblatt sagt dazu: Effective Number of
Bits: 9
Um zu überprüfen, ob die Ungenauigkeiten etwas mit dem Schaltregler auf
der Platine zu tun haben, wurde in einem zweiten Versuch der Port 23
hochgesetzt.
#Spannungswandler im PWM Mode sauberer:
p23 = Pin(23, Pin.OUT)
p23.value(1)
Das Ergebnis blieb aber im Wesentlichen gleich.
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry