Kalibriert hast Du den vorher?
In meinen längst nebulösen Erinnerungen liegen Factory Werte für
Nullpunkt und Steigung im Speicher die man dem ADC übergeben muss.
Ist aber alles lange her.
1. VREF darf AVCC-0,6V nicht überschreiten. Speist du AVCC mit 3,3V,
dann ist eine VREF von 3,3V nicht erlaubt (Datenblatt von 2018, Tabelle
37.2.6)
2. Errata beachten:
"ADC is non-functional in SE unsigned mode with VREF below 1.8V"
"14. ADC is non-functional in SE unsigned mode with VREF below 1.8V
When the ADC is used on single ended unsigned mode and VREF is below
1.8V, INL and DNL error is increased above
+/- 10LSB, i.e. the ADC have missing codes under this condition."
DB von 2018, Seite 215.
Der ADC hat noch ein paar andere Problemchen, die aber hauptsächlich den
Betrieb bei tiefen Temperaturen betreffen. Kurz - für brauchbare
Ergebnisse nimmst du besser einen externen ADC. Mich hat schon der 128A1
(ohne U) zum Zweifeln gebracht. Als ich die Nase voll hatte, bin ich auf
STM32 umgestiegen.
Danke für die Antworten.
Auch mit 2,5V an Aref sind die Werte komplett daneben:
1
Referenz: 2,5 V an Aref
2
Eingang: Bandgap
3
Ergebnis: 2072 (erwartet ist 1638)
4
5
Referenz: 2,5 V an Aref
6
Eingang: Scaled VCC (0,33 V)
7
Ergebnis: 743 (erwartet ist 540)
Komisch ist eben auch das hier, da nur interne Werte als Eingang bzw.
Referenz verwendet werden:
1
Referenz: Vcc / 1,6 (ca. 2,1 V)
2
Eingang: Scaled VCC (0,33 V)
3
Ergebnis: 843 (erwartet ist 655=4095*1,6/10)
... ah, ich glaub, ich habs :-):
das delta V war verwirrend. Zum einen sagt das XMEGA A MANUAL:
ΔV = VREF × 0.05
und das Datenblatt vom ATxmega128A1U:
ΔV Fixed offset voltage 190 LSB
Sogar die Temperatur wird damit einigermaßen richtig geschätzt.
Der Code, vielleicht hilft er ja dem ein oder anderen: