Weil Deine Werte nicht stimmen.
Das Ergebnis einer AD-Wandlung gibt das Intervall zurück. Die Intervalle sitzen nicht zwischen den quantisierten Messwerten, sondern um die Messwerte herum. Insofern ist der Vergleich mit dem Zaunlattenprinzip hanebüchender Unsinn.
Bei der 2Bit-Wandlung ergibt sich:
0 U<1,25V
1 1,25V<=U<2,5V
2 2,5V<=U<3,75V
3 3,75V<=U
Genau das gibt der von Siro zitierte Satz aus dem DB wieder.
… and the maximum value represents the voltage on the AREF pin minus 1 LSB.
Sprich: 0x3FF sind beim AVR de facto nicht 5V. Nicht in der Theorie und auch nicht in der Praxis.
Eigentlich hatte ich gehofft, Dich durch die Rückführung auf das einfachst mögliche Beispiel noch einmal mit der Nase drauf zu stoßen.
Aber nein, HaWe weiß es besser!
Geändert von Holomino (07.02.2020 um 11:49 Uhr)
nein, es geht um die Abbildung des 0...1 ADC-Intervalls (edit: oder des entspr. höher auflösenden ADC-Bereichs) auf das Volt-Intervall 0...5V, und diese Funktion ist weder bijektiv noch umkehrbar noch stetig.
Es wird also der kleinste ADC-Wert auf den kleinsten Volt-Wert und der größte ADC-Wert auf den größten Volt-Wert abgebildet,
und gibt es ADC-Werte dazwischen, dann nach Dreisatz wie gezeigt
a/aMax=v/vMax
Es geht also insb. auch nicht um die Umkehrfunktion Volt -> ADC.
1bit => 2 hoch 1 mögliche Werte = 2,
max ADC Wert (2 hoch 1) -1 = 1
a/aMax=v/vMax
<=> v=(a/aMax)*vMax
a=0 => v=0*5=0
a=1 => v=1*5=5
0 -> 0V
1 -> 5V
es werden keine Intervalle zurückgegeben, sondern mathematisch linear korrelierte Werte.
Aber nein, Holomino weiß es besser!
Geändert von HaWe (07.02.2020 um 12:02 Uhr)
Vielleicht hilft es in der Klärung wenn man am Beispiel D/A Wandler mit PWM benennt, welcher der 2 hoch n Werte nicht erreicht wird.
Im Beispiel n = 8 sind grundsätzlich die Werte 0, 1, 2, ... 254, 255 erreichbar, das wären schon 256 Werte.
der höchste erreichbare Wert bei 8-bittern ist 255, und nur der geht in den Dreisatz mit ein, und der entspricht der Anzahl der Einzel-Mess-Schritte.
Es ist auch nicht eindeutig klar, was du jetzt eigentlich aussagen willst, wenn du dich auf "256 Werte" beziehst, das ist sehr unklar formuliert.
Ich denke nicht, dass du damit meinen könntest, man soll durch 256 teilen, denn das wäre mathematischer Unsinn, und auch bei pwm ist ja 255 der höchstmögliche Wert, wenn man diese Analogie bemühen möchte
Ich habe im Datenblatt vom 328P gelesen und tatsächlich noch etwas gefunden:
28.7. ADC Conversion Result
After the conversion is complete (ADCSRA.ADIF is set), the conversion result can be found in the ADC
Result Registers (ADCL, ADCH).
For single ended conversion, the result is
ADC = Vin x 1024 / Vref
where VIN is the voltage on the selected input pin, and VREF the selected voltage reference (see also
descriptions of ADMUX.REFSn and ADMUX.MUX). 0x000 represents analog ground, and 0x3FF
represents the selected reference voltage minus one LSB.
Und ich habe für mich nachgerechnet
Code:Schritt 1: ---------- geg: Vin = Vref = 5V 5V / 1024 = 0,0048828125V 5V - 0,0048828125 = 4,9951171875V Schritt 2: ---------- geg: Vin = 4,9951171875V Vref = 5V ADC = 4,9951171875V x 1024 / 5V ADC = 1023 Probe: 1023 x 5V / 1024 = 4,9951171875V Ergo ----- ADC x 5V / 1024 = Vin bzw. Vin = ADC x Vref / 1024
Nachtrag:
Datenblatt unter: ADC Conversion Result (Abschnitt 28.7 - ATmega328P, 26.7 - ATmega640-1280-1281-2560-2561).
Beim ATmega640 ... gibt es noch eine Tabelle "Correlation Between Input Voltage and Output Codes".
Geändert von Moppi (09.02.2020 um 05:12 Uhr)
wer das so tut und partout falsch rechnen will, soll es meinetwegen tun.
Wer genug Verstand besitzt, sollte hingegen inzwischen wissen, wie und warum man es richtig machen kann und soll, indem man durch (n-1) dividiert.
Es wurde aber inzwischen von mir alles gesagt und gezeigt, was nötig war, und ich muss auch niemanden überzeugen, der sich logischen Argumenten verschließt - daher bin ich jetzt hier raus.
Lesezeichen