Um der Sache aus dem Weg zu gehen, einem Irrtum zu unterliegen, kann man auch mit dem Maximalwert des ADC rechnen. Der ist bei 8 Bit 0xFF. Wenn man durch 0xFF teilt und mit 0xFF, zur Probe, multipliziert geht die Rechnung auf. Datentyp muss nur Fließkomma sein. 0xFF entspricht einem Dezimalwert von 255, bei 256 darstellbaren Werten im Hexadezimalsystem (weil die "0" mitgezählt wird).
MfG
Nachtrag: hier gab es dieselbe Diskussion: https://forum.arduino.cc/index.php?topic=215673.0
Geändert von Moppi (06.02.2020 um 11:11 Uhr) Grund: komma
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Weg zu einigen meiner Konstruktionen
Da fällt mir noch etwa sein:
Die Frage ist, wie der ADC die Werte aufteilt.
So wie Searcher meint, liegen alle Bereiche innerhalb des zu messenden Spannungsbereichs.
Wenn dem so ist, erhältst Du natürlich bei 0xFF diese 4,98046874V.
Denn jedem Digitalwert ist ein Offset und ein Bereich zuzuordnen, der abgedeckt wird.
Während der abgedeckte Bereich eines Wertes immer gleich ist, ist der Offset jedesmal ein anderer.
Der Offset für den letzten Wert ist also 4,98046874V, der abgedeckte Bereich beträgt 0,01953125V.
Macht zusammen 4.99999V. Da hast Du (Rundungsfehler) die 5V Obergrenze.
Der letzte Wert 0xFF reicht also von 4,98046874V bis 5,0V.
Da der Fehler, bezogen auf einen absoluten Spannungswert, bei insgesamt 0,01953125V liegt,
musst Du eigentlich den errechneten Wert runden. Beispielsweise auf 1 Stelle nach dem Komma.
Dann kommst Du bei den errechneten 4,98046874V auf 5,0V.
Und noch etwas, was vielleicht irgendwie interessant ist:
Ein Wert vom ADC entspricht einem analogen Schwellenwert. Bei langsam fallender Spannung liegt die Schwellenspannung theoretisch höher,
bei langsam steigender Spannung liegt die Schwellenspannung niedriger. Weil ein Wert vom ADC einen Spannungsbereich abdeckt.
MfG
Köstlich. Da teilen wir 5 V durch 256 - oder 255 Teile und erhalten ne Zahl auf ein paar Billionstel genau. Noch dazu, wo im Datenblatt (zumindest in Atmel-42735B-ATmega328/P_Datasheet_Complete-11/2016) steht: ±2 LSB Absolute Accuracy . . . Schön, gut - es geht hier um die Theorie. Aber ich finde so wunderbare Stellenvermehrung einfach - wunderbar - köstlich... Der Offset für den letzten Wert ist also 4,98046874V, der abgedeckte Bereich beträgt 0,01953125V ..
Ich will ja nicht päpstlicher sein als der Papst, aber die Strecke von Hamburg nach Südschwaben (wo ich wohne) auf Milliardstel aufzuteilen hieße die Entfernung auf etliche Zentimeter (wenige Dezimeter) genau anzugeben. Und wenn man das Ganze auf 256 Teile aufteilt . . . gut , sind immerhin gut 300 Zentimeter.
Also in meinen 8Bittern (siehe z.B. Datenblatt oben) können die ADCs nicht nur 8 Bit sondern üblicherweise auch 10 Bit auflösen. Die Daten stehen dann halt in zwei Registern: ADCL und ADCH. Dies nur der Vollständigkeit halber. Die verringerte Auflösung von 8 Bit ist eher ein Sonderfall, der entprechend programmiert werden kann... Bei einem 8 Bit ADC habe ich 256 Stufen ..
Ciao sagt der JoeamBerg
richtig, es geht um die Theorie.
Zäumen wir das Pferd von hinten auf, am Beispiel eines sehr "kleinen" 2-bit ADCs, weil das Prinzip deutlicher hervortritt:
wie schon angemerkt, hat ein 2bit ADC 2² mögliche ADC-Werte (0,1,2,3) mit 3 Messintervallen.
Daher wären die 5V Messspannung durch 3 zu teilen (entsprechend dem höchsten ADC-Wert), in Schritten zu 5/3=1,666
0 -> 0 V
1 -> 1,67 V
2 -> 3,33 V
3 -> 5 V
Würde man hingegen mit 4 Intervallen rechnen, ergäbe sich, in Schritten zu 5/4=1,25:
0 -> 0 V
1 -> 1,25 V
2- > 2,50 V
3 -> (...5 V)
Hier wird deutlich, dass dann der letzte Schritt (das letzte Intervall) zu groß wäre im Vergleich zum Messbereich und zu den anderen Intervallen.
Bei einem 8-bit ADC mit 256 Messwerten in 255 Stufen/Intervallen (entsprechend dem höchsten ADC-Wert) ist dieses Verhalten "analog":
5V durch 255 geteilt ergäbe gleich große Intervalle (steps), durch 256 geteilt entstünde der gleiche Fehler wie oben beim 2-bitter gezeigt.
Daher ist mein schon im 2. Post gezeigter Vorschlag mit 255er Teiler IMO der korrekte, und nicht der mit 256.
Falsch!
Extrem könnte man auch einen als Input konfigurierten I/O Pin als einen 1-Bit ADC betrachten mit zwei möglichen Ausgabewerten. Die zu digitalisierende Eingangsspannung am Pin liegt zwischen GND (0 Volt) und Vcc (zB 5V). Der Ausgabe Wert ist 0 oder 1.
Nun die Preisfrage: Es gibt zwei mögliche Ausgabewerte (entweder die 0 oder 1). Gibt es einen oder zwei Bereiche (Quantisierungsintervalle) der Eingangsspannung am Input Pin, die den Ausgabewerten zugeordnet sind? Wie sehen diese aus mit Angabe der von- bis-Werten und zugehörigen Ausgabewerte?
@oberallgeier: Hier nur die Theorie. Die Fehler eines realen ADC sind auch in der App.-Note erwähnt, die ich oben schon mal verlinkt hatte:
http://ww1.microchip.com/downloads/e...ote_avr120.pdf
Dort wird findet man auch den Begriff "perfect ADC", der hier diskutiert wird.
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Weg zu einigen meiner Konstruktionen
Falsch!
es geht um die Abbildung von ADC-Messwerten auf zugehörige Spannungen im gesamten Messintervall!
Dabei wäre auch sowohl die niedrigste als auch die höchstmögliche Spannung abzubilden (zu repräsentieren).
ein 1-bit ADC aus deinem Beispiel hat 2 mögliche Messwerte bzw. Zustände (0,1) mit 1 Intervall dazwischen (5/1 = 5):
0 -> 0V
1 -> 5V
Es gibt keine Zwischenschritte oder "fließende Bereiche", da 0 und 1 Integerwerte (Natürliche Zahlen) sind, keine rationalen oder reellen Zahlen: sondern nur feste Schritte in nicht stetigen festen Stufen.
Da die Schrittgröße beim ADC 1 ist, ist die statistische Genauigkeit beim ADC immer ±1, das gleiche gilt für das zugeordnete Spannungswert-Intervall (das hatte oberallgeier bereits angedeutet).
Geändert von HaWe (06.02.2020 um 17:57 Uhr) Grund: typo
Ersteinmal Danke an alle, für die Anteilnahme,
wie erwartet, gibt es hier unterschiedlichen Ansichten.
Was ist richtig, was ist falsch, ich weis es auch nicht,
hatte aber grade folgendes Gedankenspiel:
Warum gibt es Spannungsreferenzen zu kaufen die so krumm sind:
2,048V oder 4,096V
Weil sie genau 2^11 bzw. 2^12 entsprechen
Somit hat man bei der entsprechenden Bitbreite pro ADU Schritt exakt 1 mV.
Man erspart sich damit umständliche Berechnungen und ich
vermute mal das war der Sinn dieser krummen Referenzen.
Wenn dem so ist, dann ergibt ein maximaler Aducount beim 11 Bitter
Wertebereich 0..0x7FF (2047 dez) einen Spannungsbereich von 0..2047 Millivolt
Die volle Referenzspannung wird dann nie erreicht, es fehlt ein LSB
so wie zum Beispiel bei Atmel beschrieben.
Dies entspräche der Berechnung Vref/(2^n)
auf den 8 Bitter bezogen wäre es also einem Divisor von 256 = Vref/n
Die Diskussion kann man vermutlich ewig weiterführen,
ich finde aber die Standpunkte/Erläuterungen von euch auch recht interessant.
Wie ja schon Eingangs erwähnt geht es mir nicht darum ob meine Werte aufs letzte Bit stehen,
sondern um die Festlegung, sofern es eine gibt, wie die korrekte Berechnung aussehen müsste.
Es gibt hier z.B. einen Calculator:
https://www.electronicdeveloper.de/A...Converter.aspx
Dieser basiert meiner Meinung nach auf (n-1)
Bei einem 2 Bit Wandler würde ich es wie folgt interpretieren.
Ref/n 5V/4 Schritte = 1,25V Schrittweite
ADC
0 -> 0,00 V 0..1,24
1 -> 1,25 V 1,25..2,49
2 -> 2,50 V 2,50..3,74
3 -> 3,75 V 3,75.....auch bis über Vref
----
@Klebwax:
Im Prinzip ist mir das auch egal wie die Berechnung erfolgt, da ich es auch völlig anders berechne.
Beim Kalibrieren lege ich eine möglichst konstante Spannung an den Messeingang und merke mir den
aktuellen Aducount. Dann weis ich, dass bei dieser Spannung mein Aducount xxx beträgt.
Den Rest kann ich dann berechnen und verlasse mich darauf, dass sich die Messkette linear verhält.
Zudem ist die Bitbreite des ADU damit völlig eagl, wobei "mein Code" hier auf maximal 16 Bit beschränkt ist.
Weiter Diskussionenn habe ich unter anderem auch hier gefunden:Code:U16 CalAtmV = 5000; // Kalibriert wird bei exakt 5,000 Volt U16 CalCount; // gemessener Aduwert bei der Kalibrierspannung /*----------------------------------------------------------------------------*/ // Die Umrechnung ADU Count in Millivolt findet dann hier statt: U16 Calculate_mV(U16 adc_count) { S32 value; // we need < 32 Bit value for calculation value = adc_count; // convert 16 bit value to 32 Bit value *= CalAtmV; // multiply with Calibration Point Voltage value /= CalCount; // divide with ADC Calibration count at Calibration Voltage return (U16)value; // return with 16 Bit result in mV } /*----------------------------------------------------------------------------*/
https://www.mikrocontroller.net/topic/261692
Bei Maxim habe ich folgendes gefunden:
Siro
Nein. Es ging um die Frage die Siro gestellt hatte:
Ich bin der Meinung, daß es bei einem 8-Bit ADC VRef/256 sind, wie es aus der Application Note des Herstellers zu verstehen ist.
Das bestreitst du und behauptest daß es VRef/255 sind.
Lies dir also nochmal meine Frage durch und versuche von dem 1-Bit ADC auf einen 8-Bit ADC zurückzuschließen. Oder muß ich dazu multiple choice Antworten formulieren.
In jedem Fall verstehe ich nicht, was die Pfeile in
0 -> 0V
1 -> 5V
bedeuten sollen.
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Weg zu einigen meiner Konstruktionen
@Siro:
ich würde die Volt-Bereiche beim 2-bitter völlig anders interpretieren, wobei diese natürlich willkürlich numerisch gesetzt sind und nicht statistisch oder stochastisch verifiziert (was der bessere Weg wäre, über statistische Messreihen mit einem berechenbaren Signifikanzniveau):
0 -> 0 V (0...0,83)
1 -> 1,67 V (0,84...2,50)
2 -> 3,33 V (2,51...4,16)
3 -> 5 V (4,17...5,0)
Diese basieren dann nach wie vor auf dem Intervall-Teiler 5/3, nicht 5/4, denn es sind nach wie vor 3 Intervalle und nicht 4 !
Analog gilt das dann bem 8-bitter für 5/255.
das Zeichen
->
kennzeichnet eine mathematische Abbildung ("Funktionswert") von einem Wert auf einen anderen.
Geändert von HaWe (06.02.2020 um 18:54 Uhr)
Lesezeichen