Forum: Mikrocontroller und Digitale Elektronik ADC-Spannung korrekt berechnen?


von Schüler-AG (Gast)


Lesenswert?

Was ist richtig:

U = (Uref / 1023) * ADC_Wert    oder
U = (Uref / 1024) * ADC_Wert    ?

Danke von Tobi

von Jester (Gast)


Lesenswert?

Schüler-AG schrieb:
> Was ist richtig:
>
> U = (Uref / 1023) * ADC_Wert    oder
> U = (Uref / 1024) * ADC_Wert    ?
>
> Danke von Tobi

Das kommt drauf an. Es können leicht auch mal ganz andere Werte (statt 
1023, 1024) sein ...

von Kevin M. (arduinolover)


Lesenswert?

Jester schrieb:
> Das kommt drauf an. Es können leicht auch mal ganz andere Werte (statt
> 1023, 1024) sein ...

Offensichtlich geht es um einen 10-Bit ADC....
Wenn ich raten müsste würde ich Arduino sagen.

Schüler-AG schrieb:
> Was ist richtig:

Was ist denn die größte Zahl die man mit 10-Bit darstellen kann?

: Bearbeitet durch User
von Jester (Gast)


Lesenswert?

Kevin M. schrieb:
> Offensichtlich geht es um einen 8-Bit ADC....

Hier sind mir zu viele Spezialisten - bin dann mal raus ...

von Harald W. (wilhelms)


Lesenswert?

Schüler-AG schrieb:

> Was ist richtig:
>
> U = (Uref / 1023) * ADC_Wert    oder
> U = (Uref / 1024) * ADC_Wert    ?
>
> Danke von Tobi

Das ist das typische Zaunpfahlproblem:
https://de.wikipedia.org/wiki/Zaunpfahlfehler

von Andreas B. (bitverdreher)


Lesenswert?

Kevin M. schrieb:
> Offensichtlich geht es um einen 8-Bit ADC....

nein, es geht um einen 10-bit ADC. Da teilt man durch 1024.

von Kevin M. (arduinolover)


Lesenswert?

Andreas B. schrieb:
> nein, es geht um einen 10-bit ADC. Da teilt man durch 1024.

wer lesen kann ist klar im Vorteil und nein tut man nicht...

von Harald W. (wilhelms)


Lesenswert?

Kevin M. schrieb:

>> nein, es geht um einen 10-bit ADC. Da teilt man durch 1024.
>
> wer lesen kann ist klar im Vorteil und nein tut man nicht...

Bei dem typischen Fehler von Arduino-AD-Wandlern spielt der
Unterschied zwischen 1023 und 1024 praktisch keine Rolle.
https://www.mikrocontroller.net/articles/Aufl%C3%B6sung_und_Genauigkeit

von Εrnst B. (ernst)


Lesenswert?

Kevin M. schrieb:
> wer lesen kann ist klar im Vorteil und nein tut man nicht...

Natürlich tut man das.
Versuchs dir selber herzuleiten, von einem 1-Bit-ADC über 2 Bit, 3 
Bit... bis 10 Bit.
Tipp dazu: Jeder Digitalwert aus dem ADC entspricht einem Bereich von 
Analogwerten.

von EAF (Gast)


Lesenswert?

Kevin M. schrieb:
> und nein tut man nicht...

Tipp:
Du musst uns nicht glauben, wenn du schlauer als das Datenblatt bist.

AVR Datenblatt!
Dort findet sich eine Beispielrechnung.

von Corrector (Gast)


Lesenswert?

Kevin M. schrieb:
> Offensichtlich geht es um einen 10-Bit ADC....
> Wenn ich raten müsste würde ich Arduino sagen.
Dann sage ich mal 11-Bit DAC, weil wegen +/-.

Harald W. schrieb:
> ei dem typischen Fehler von Arduino-AD-Wandlern spielt der
> Unterschied zwischen 1023 und 1024 praktisch keine Rolle.
Dann würde ich durch 1024 teilen und einkalkulieren, niemals die 1 zu 
sehen.

------------------------------------------------------------
So, jetzt mal zum Abschreiben:

Ein ADC hat einen maximalen Aussteuerungsbereich und einen Bereich mit 
einer definierten Linearität. Im Normalfall wird man einen Wandler 
NIEMALS voll aussteuern, weil man dann die Übersteuerung nicht sehen 
kann.

Das Schlaueste wäre in einem Fall eines Bereiches von 0..1V Eingang, 
genau mit 1.024 zu kalibieren und durch 1024 zu teilen. Allerdings hat 
man dann das Problem, dass man die ß nicht sauber messen kann, weil man 
keine negativen Zahlen bekommt. Es klappt das Entrauschen nicht.

Also: zugeführte Spannung mit z.B. 0,1V beaufschlagen und verstärken, 
dass sich der Bereich von 10% bis 90% erstreckt. Dort ist der Wandler am 
Linearsten und man kann überabtasten. z.B. Faktor 4 und Werte zwischen 
typisch 16 und 3600 zusammenbekommen. Dann einfach den Offset weg und 
umskalieren.

von Semmel (Gast)


Lesenswert?

Beitrag "1023 oder 1024"

Na dann viel Spass.

von Charles Montgomery Burns (Gast)


Lesenswert?

Praxis ist das Kritetrium der Wahrheit -> also frag nicht dumm rum 
sondern miß einfach nach.

von Uwe (Gast)


Lesenswert?

Hi,
War eigentlich auch laut Datenblatt immer auf 1024 aus, aber dann kam 
das:
>Versuchs dir selber herzuleiten, von einem 1-Bit-ADC über 2 Bit, 3 Bit
mach mal, wir nehmen 3 Bit und 7V Ref
/7 wäre 1V LSB
/8 wäre 0,875V LSB
bei ADC_max = 7 sind wir bei Variante 1 bei 7V Vin
Variante 2 zeigt aber 6,125V.. Hmm
Datenblatt Mega8
>ADC = VIN ⋅ 1024
>         VREF
>and 0x3FF represents the selected reference voltage minus one LSB
oha, also ADC(7) * LSB(0,875) + 0,875 sollte Uin sein.
6,125 + 0,875 = 7V, Stimmt.
0 * 0,875V + 0,875V = 0,875V, Falsch

bin verwirrt oder überhitzt, klärt mich mal jemand auf ?

schönen Tag noch, Uwe

von S. Landolt (Gast)


Lesenswert?

> 0 * 0,875V + 0,875V = 0,875V, Falsch
> bin verwirrt oder überhitzt

Überhitzt? Es steht im ATmega8-Datenblatt '0x000 represents ground, and 
0x3FF represents the selected reference voltage minus one LSB'.

von Achim H. (pluto25)


Lesenswert?

Uwe schrieb:
> Variante 2 zeigt aber 6,125V.. Hmm
> Datenblatt Mega8
>>ADC = VIN ⋅ 1024
>>         VREF
>>and 0x3FF represents the selected reference voltage minus one LSB
 ADC(7) * LSB(0,875) = 6,125 = 7 - 0,875 Stimmt.

Der Max Wert wird bei Uref - Lsb erreicht.
Bei Uref 1,024V zeigt er mV an bis 1,022V (3fe)
Bei 3ff ist der Wert höher, kann 1,023 V sein aber 3V sind ja auch "nur" 
3ff

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Εrnst B. schrieb im Beitrag #7150
> Versuchs dir selber herzuleiten, von einem 1-Bit-ADC
Nehmen wir mal den einfachsten "ADC" mit 1 Bit und einem Eingang von 
0..5V: wann soll der 0 und wann 1 liefern? Bei 0V soll er 0 liefern und 
bei 5V soll er 1 liefern, das war ja einfach. Aber was soll er bei 2V 
machen und was bei 3V? Wieviele "Stufen" hat eigentlich so ein 1-Bit 
ADC? Und ein 2-Bit ADC? Wie verteilen sich da die Spannung Bereiche? Von 
wo bis wo ist 00? Was sind die Grenzen für 01? Welcher Spannungsbereich 
ergibt 10? Und was ist der Bereich von 11?

S. Landolt schrieb:
> Es steht im ATmega8-Datenblatt '0x000 represents ground, and 0x3FF
> represents the selected reference voltage minus one LSB'.
Weil 1 LSB das 1024ste Teil von Vref ist, entspricht 0x3ff also
1
Vref - (1/1024)*Vref  =  Vref * 1023/1024.

Nur wenn ein Anfänger oder ein Spezialist gerne die Vref auf seiner 
Anzeige sehen möchte, dann kann er dem µC die Rechnung schwer machen, 
eine um 1024tel falsche Steigung der Wandlung (die berechnete Spannung 
ist immer um 1/1024tel zu hoch) nehmen und durch 1023 statt der fachlich 
und sachlich korrekten 1024 teilen.

Und der größte Vorteil der 1024er-Division: sie ist schneller als die 
1023er Division.


Kevin M. schrieb:
> Was ist denn die größte Zahl die man mit 10-Bit darstellen kann?
Man kann 1024 unterschiedliche Zahlen darstellen.

BTW: meistens braucht man aber gar keine Spannung berechnen, weil die 
Spannung auch nur ein Hilfswert ist. Wenn man z.B. einen Drucksensor 
angeschlossen hat, der bei 10 bar 5V bringt, dann interessiert mich die 
Spannung überhaupt nicht. Sondern meine Formel für den anliegenden Druck 
ist
1
 p = (ADC*10bar) / 1024;
Da taucht gar keine Spannung auf, wozu auch?

: Bearbeitet durch Moderator
von Toxic (Gast)


Lesenswert?


von Forist (Gast)


Lesenswert?


von A. S. (Gast)


Lesenswert?

Schüler-AG schrieb:
> U = (Uref / 1023) * ADC_Wert    oder
> U = (Uref / 1024) * ADC_Wert    ?

Das Problem hierbei ist nicht der Wert bei 0x3ff, sondern bei 0. Da 
hilft auch das zitierte Handbuch nicht, weil am Problem vorbei geht:

S. Landolt schrieb:
> '0x000 represents ground, and 0x3FF represents the selected reference voltage 
minus one LSB'.

Egal wie die Rechnung ist, am Ende steht jedes LSB für einen 
Spannungs-*Bereich* von grob 0,1% Uref. Eventuell mit Ausnahme von 0 und 
0x3ff. Und da wir alle schlecht im Kopfrechnen sind, zur Anschauung:

  * 0..1V
  * aufgeteilt auf 10LSB = 0..9

--> erste Frage an das Datenblatt: Wo genau sind die 9 
Umschaltschwellen? Vermutlich bei 0,1V, ... 0,9V. Dann ergibt sich:
  * 0 --> 0,0V .. 0,1V
  * 1 --> 0,1V .. 0,2V
  * ...
  * 9 --> 0,9V .. 1,0V

Es geht also nicht um Teiler 9 oder 10, sondern darum, dass ich 
eigentlich 0,05V addieren müsste.

  * 0 --> Anzeige 0,05V (0,0V..0,1V)
  * 1 --> Anzeige 0,15V (0,1V..0,2V)
  * ...
  * 9 --> Anzeige 0,95V (0,9V..1,0V)

Die genau Rechnung ist also U = 1V * ADC/10 + 1V/20 = Uref * 
(ADC+1/2)/10.

In Deinem Fall: (Uref/1024)*ADC + Uref/2048.

Das macht niemand. Jeder möchte 0 und die meisten auch Uref

Daher ist Uref/1023 im Mittel besser. In der Mitte (bei 511) ist es 
nahezu perfekt, an den Rändern (0 und VRef) ist es maximal ein halbes 
Bit daneben, während Uref/1024 überall ein halbes Bit daneben ist.

/1023 wäre sogar perfekt, wenn die Bereiche des ersten und letzten Bits 
nur halb so groß sind.

--> Nimm 1023 wo Du es erlauben kannst, 1024 wo Du auf Rechenleistung 
oder etwas anderes achten musst.

von Schüler-AG (Gast)


Lesenswert?

A. S. schrieb:
> --> Nimm 1023 wo Du es erlauben kannst, 1024 wo Du auf Rechenleistung
> oder etwas anderes achten musst.

Der ganze Beitrag von A. S. ist der beste, den ich hier im Forum gelesen 
habe.

Es bedankt sich meine Schüler-AG
Tobi

von Uwe (Gast)


Lesenswert?

Hi, es ist jetzt etwas kühler ;)
Ich glaube das Problem entsteht bei der Bereitstellung der Ref für die 
successive approximation im AVR, es kann nur eine Ref von Vref-1LSB
(siehe R2R) bereitgestellt werden bei der dann der Bitkomparator 
schalten soll.Entspricht auch genau der Angabe im DB
>0x3FF represents the selected reference voltage minus one LSB'

Bei 3FF als Resultat ist die anliegende Spannung also >= 1023 * 
Vref/1024
Für V Ref = 5V sind 3FF also >= 4,9951V
bei 3FE entsprechend >=4,9902V

Also  /1024 ist richtig.

Einen schönen Abend noch, Uwe

von Toxic (Gast)


Lesenswert?

Forist schrieb:
> komplizierter geht es nicht, oder?

Ich hatte gegoogelt und einen Link kopiert.Den Link getestet und 
festgestellt, dass die pdf gleich downgeloaded wird.
Der einzige Unterschied zwischen meinem und deinem Link:er sieht 
"komplizierter" aus.Fuer den User bedeuten aber beide Links, dass sie 
die gleiche akrobatische Mausbewegung durchfuehren muessen:Mit der Maus 
den Link anklicken...
Wo ist jetzt also das Problem?
Aber danke fuer dein Posting - damit geht mein Posting in der Versenkung 
unter.So ein Mist aber auch:umsonst gegoogelt🤬

von H. H. (Gast)


Lesenswert?

Toxic schrieb:
> Wo ist jetzt also das Problem?

Zu viel Futter für die Datenkrake.

von Toxic (Gast)


Lesenswert?

H. H. schrieb:
> Zu viel Futter für die Datenkrake.

Keine Ahnung inwiefern mein Link das "Alienmonster II" in Ekstase 
treibt.Dazu muesste ich aber wieder googeln um Infos darueber zu 
erhalten oder halt doch DuckDuckGo und Konsorten benutzen....
Aber ich geh mal davon aus,dass du recht hast.

von A. S. (Gast)


Lesenswert?

Uwe schrieb:
> Bei 3FF als Resultat ist die anliegende Spannung also >= 1023 *
> Vref/1024
Ja!

> Für V Ref = 5V sind 3FF also >= 4,9951V
Ja
> bei 3FE entsprechend >=4,9902V
Ja. 3 * Ja. Und dann sowas:

> Also  /1024 ist richtig.
Du hast doch genau dargelegt, dass 4,9951V für 0x3ff die unterste Grenze 
darstellt. Und Du somit bei allen Werten ein halbes Bit daneben liegst.

Eine Anzeige von 4,995 sollte doch nicht heißen "oder mehr", sondern 
"+-". Also entweder das halbe Bit addieren (~ 4,9975) oder wenigstens 
den Fehler so gering wie möglich machen über den Wertebereich (Teilen 
durch 1023, damit es im Mittel 1/4 Bit besser ist und nirgendwo 
schlechter. )

von mIstA (Gast)


Lesenswert?

Toxic schrieb:
> Fuer den User bedeuten aber beide Links, dass sie
> die gleiche akrobatische Mausbewegung durchfuehren
> muessen:Mit der Maus den Link anklicken...

Wobei Dein Link dabei einen entscheidenden Vorteil hat: man trifft ihn 
um vieles einfacher!

von A. S. (Gast)


Lesenswert?

Lothar M. schrieb:
> Sondern meine Formel für den anliegenden Druck
> ist p = (ADC*10bar) / 1024;
> Da taucht gar keine Spannung auf, wozu auch?

Das Problem mit 1023 und 1024 bleibt aber haargenau dasselbe.

von Εrnst B. (ernst)


Lesenswert?

Schüler-AG schrieb:
> A. S. schrieb:
>> --> Nimm 1023 wo Du es erlauben kannst, 1024 wo Du auf Rechenleistung
>> oder etwas anderes achten musst.
>
> Der ganze Beitrag von A. S. ist der beste, den ich hier im Forum gelesen
> habe.

Nimm 1024 wenn du es richtig & schnell machen willst. Nimm 1023, wenn du 
das Rechenergebnis absichtlich verfälschen willst, um "schönere" Zahlen 
angezeigt zu bekommen, dir eine Rundung aber zu kompliziert ist.

Dann sollte man aber einen deutlichen Kommentar dazu im Quelltext 
hinterlassen, sonst dient die 1023 im Source nur als 
"Copy&Paste-vom-Arduino-Forum"-Markierung.

A. S. schrieb:
> Das Problem mit 1023 und 1024

Das "Problem" existiert nur in den Köpfen derer, die die Funktionsweise 
des ADC nicht verstanden haben. Alle anderen rechnen korrekt mit 2¹⁰.

: Bearbeitet durch User
von LostInMusic (Gast)


Lesenswert?

>um "schönere" Zahlen angezeigt zu bekommen, dir eine Rundung aber zu >kompliziert 
ist.

OK. Ich will schönere Zahlen angezeigt bekommen und mir ist eine Rundung 
nicht zu kompliziert. Was muss ich dann rechnen?

>die Funktionsweise des ADC nicht verstanden haben.

Bitte setz dieses Verständnis bei mir als vorhanden voraus.

von Teo D. (teoderix)


Lesenswert?

LostInMusic schrieb:
> OK. Ich will schönere Zahlen angezeigt bekommen und mir ist eine Rundung
> nicht zu kompliziert. Was muss ich dann rechnen?

Gar nicht, du braucht nur eine grafikfähige Anzeige und ein Font der dir 
gefällt.

Wenn du allerdings das zappeln der Zahlen verhindern willst, "musst" du 
mit einer Stelle mehr rechnen, als du anzeigen willst. Dann beim Runden, 
noch ne kleine "Hysterese" einbauen.....


PS:
LostInMusic schrieb:
>>die Funktionsweise des ADC nicht verstanden haben.
>
> Bitte setz dieses Verständnis bei mir als vorhanden voraus.

Öhmmm, also dein NICHT Verständnis?! ;)

von A. S. (Gast)


Lesenswert?

Εrnst B. schrieb:
> Das "Problem" existiert nur in den Köpfen derer, die die Funktionsweise
> des ADC nicht verstanden haben. Alle anderen rechnen korrekt mit 2¹⁰.

Ja, es ist üblich, die Argumente anderer zu ignorieren und statt eigener 
Argumente lieber deren Verstand in Frage zu stellen. Schön ist es 
trotzdem nicht. Und konstruktiv auch nicht.

Konsens ist, dass 1/1024 den Bereich für ein LSB darstellt.

Unbegreiflich ist, warum das ein Argument sein sollte, die Skale um ein 
halbes Bit zu verschieben. Genauso unbegreiflich ist es, warum die 
Lösung mit 1023 verworfen oder niedergeredet werden soll.

Ja, sie ist mathematisch schlechter als /1024 + 1/2LSB, aber besser als 
das übliche, unreflektierte /1024 ohne Korrektur (und ohne Argument).

von hasič (kleiner Hase) (Gast)


Lesenswert?

A. S. schrieb:
> Unbegreiflich ist, warum das ein Argument sein sollte, die Skale um ein
> halbes Bit zu verschieben. Genauso unbegreiflich ist es, warum die
> Lösung mit 1023 verworfen oder niedergeredet werden soll.

Also sind wir wieder am Ausgangspunkt angekommen und jeder teilt, wie er 
es für vernünftig hält.

von STK500-Besitzer (Gast)


Lesenswert?

Nur, um weitere Verwirrung zu stiften:
Bei einem gleitenden Mittelwert über ein Array von 16 Werten wird doch 
die Summe auch duch 16 statt durch 15 geteilt.
Und von 0 - 1023 sind 1024 Werte.

von A. S. (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Nur, um weitere Verwirrung zu stiften:

Nein. Das ist Konsens und nicht Thema des Streites.

Eine Analogie ergibt sich nur, wenn man das Runden mit üblicher 
Integer-Arithmetik betrachtet

Wenn ich 16 8-Bit-Werte addiere und durch 16 Teile, dann runde ich immer 
ab.

  * Beispiel A: 15*2 + 1*1  = 31. 31/16 = 1, nicht 2
  * Beispiel B: 15 * 200 + 1^*199 = 3199. 3199 / 16 = 199,nicht 200

Darum addiert man vor der Division 8. Das wäre analog zu

  * U = Uref * ADC/1024 + Uref/2048

und wäre perfekt. Macht beim ADC aber niemand.

Der Workaround beim ADC ist nun, das ganze um 1 LSB zu spreizen, damit 
es in der Mitte besser, am Rand genauso schlecht bleibt.

Das analogon hierzu ist jedoch schwerer zu verstehen und betrifft auch 
nicht die 16, sondern die 8 Bit: Das Ergebnis (die Summe) mit 256/255 
multiplizieren (spreizen).

Aus 31/16 wird dann 31*256/(16*255) = 7936 / 4080 = 1.

Aus 3199 / 16 wird dann 3199*256/4080 = 200.

Ds ist aber alles lange nicht so anschaulich als wenn man sich direkt 
mit der 0 beim ADC (und deren Darstellung) beschäftigt.

von A. S. (Gast)


Lesenswert?

Mmh, vermutlich schalten viele ab, sobald 5V durch 1024 geteilt wird, 
weil die Werte krumm werden. Ich versuche es daher noch einmal noch 
einfacher als oben:

A. S. schrieb:
> * 0..1V aufgeteilt auf 10LSB = 0..9

Daher nun 10LSB und Eingangsspannung 0-10V

  * {0V..1V} --> ADC: 0 --> 0,5V ± ½V
  * {1V..2V} --> ADC: 1 --> 1,5V ± ½V
  * ...
  * {9..10V} --> ADC: 9 --> 9,5V ± ½V

Demnach ist die richtige Formel:
  * U = 10V*ADC/10 + 0,5V

mit maximalem Quantisierungsfehler von ½V und 0V Offset

Die einfache Formel:
 * U = 10V*ADC/10

mit maximalem Quantisierungsfehler von 1V und ½ V Offset

Die spreizende Formel:
  * U = 10V*ADC/9

ebenfalls mit maximalem Quantisierungsfehler 1V und ½ V Offset, aber nur 
am Ende. In der Mitte ist es so gut wie die richtige Formel.
1
Anzeigen der Reihe nach:
2
3
U      LSB     Anzeigen der Reihe nach
4
0V      0      0,5    0     0
5
0,9V    0      0,5    0     0
6
1,1V    1      1,5    1     1,1  
7
1,9V    1      1,5    1     1,1
8
...
9
8,1V    8      8,5    8     8,9
10
8,9V    8      8,5    8     8,9 
11
9,1V    9      9,5    9     10
12
10V     9      9,5    9     10

von Teo D. (teoderix)


Lesenswert?

A. S. schrieb:
> * U = Uref * ADC/1024 + Uref/2048
>
> und wäre perfekt. Macht beim ADC aber niemand.

Das produziert den selben Fehler, nur um ein halbes bit nach oben 
verschoben.
Wenn man schon am LSB rummäkelt, dann sollte man es mit Uref/2048 IMMER 
werten, egal ob gesetzt oder nicht.
Man muss ja nicht gleich den Kladderadatsch, durch den gesamten 
Wertebereich schleifen.
Also, ab in die Tonne mit dem ungeliebten Ding (LSB).

von STK500-Besitzer (Gast)


Lesenswert?

A. S. schrieb:
> Darum addiert man vor der Division 8. Das wäre analog zu
>
>   * U = Uref * ADC/1024 + Uref/2048
>
> und wäre perfekt. Macht beim ADC aber niemand.

Wäre mit Integer aber auch sinnfrei, da ADC/1024 bei einem 10Bit-ADC 
immer 0 ergibt.

von Achim H. (pluto25)


Lesenswert?

A. S. schrieb:
> * U = Uref * ADC/1024 + Uref/2048
> und wäre perfekt.

Für wen perfekt?
Ich für meinen Teil bevorzuge 0 = 0 bis 0.9 , 1 = 1.0 bis 1.9
nicht 1 = 0.6 bis 1.5

von A. S. (Gast)


Lesenswert?

A. H. schrieb:
> A. S. schrieb:
>> * U = Uref * ADC/1024 + Uref/2048
>> und wäre perfekt.
>
> Für wen perfekt?
> Ich für meinen Teil bevorzuge 0 = 0 bis 0.9 , 1 = 1.0 bis 1.9
> nicht 1 = 0.6 bis 1.5

OK, Du bringst eine vierte Variante rein, die Du für suboptimal hälst.

Wir sollten uns m.E. auf übliche oder richtige beschränken.

Wenn Du eine Frage hast, frage, wenn Du einen Fehler entdeckst oder 
vermutest, sage das. So könnte man es für einen Trollbeitrag halten, wie 
den davor von einem Gast.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

A. S. schrieb:
> Genauso unbegreiflich ist es, warum die Lösung mit 1023 verworfen oder
> niedergeredet werden soll.
Wird sie doch nicht. Wer mit der sich daraus ergebenden falschen 
Steigung der Rechnung mit 1023 kein Problem hat oder sogar Vorteile 
daraus ziehen kann, der soll die verwenden.

Wer mit den ADC-Werten Messtechnik betreibt und dafür die korrekte 
Gewichtung/Skalierung der Wandlungsdaten braucht, der sollte tunlichst 
die 1024 nehmen.

Und natürlich ist die Diskussion um "+1/2LSB" technisch unsinnig, weil 
das sowieso im Serienfehler des ADC untergeht.

von A. S. (Gast)


Lesenswert?

Lothar M. schrieb:
> Wer ... die korrekte Gewichtung/Skalierung braucht,
> der sollte tunlichst die 1024 nehmen.

> Und natürlich ist die Diskussion um "+1/2LSB" technisch unsinnig, weil
> das sowieso im Serienfehler des ADC untergeht.

Also wie es grade passt.

Wem die Zahlen bisher zu groß waren, hier auf 1 Bit (aka Komparator) 
reduziert:

Messbereich 1V, Umschaltschwelle 0,5V,
1
  0..0,5V --> 0 --> 0,25V  0  V   0V
2
  0,5..1V --> 1 --> 0,75V  0,5V   1V

von Jedzia D. (Firma: Rast und Ruh) (jedzia)


Lesenswert?

RTFM!

von Εrnst B. (ernst)


Lesenswert?

A. S. schrieb:
> Messbereich 1V, Umschaltschwelle 0,5V,

Du hast die Absurdität der "1023er-Metode" dabei noch nicht deutlich 
genug herausgearbeitet:

1024er-Methode (bei 1-Bit also also [ADC * Uref/2 … (ADC+1) * Uref/2[)
ADC=0 besagt: Spannung größer 0V kleiner 0.5V.
ADC=1 besagt: Spannung größer 0.5V

1023er-Methode (bei 1-Bit also also [ADC * Uref/(2-1) … (ADC+1) * 
Uref/(2-1)[)
ADC=0 besagt: Spannung größer 0V, kleiner 1V
ADC=1 besagt Spannung größer 1V

d.H. bei der 1024er-Methode entspricht das Rechenergebnis exakt dem 
Verhalten des Komparators auf 0.5V, bei der 1023er-Methode Stimmt's 
vorne und hinten nicht.

Dass der Fehler kleiner wird, je mehr Bits der ADC hat, stimmt zwar, der 
TE  ist "Schüler". Der soll erstmal den richtigen Rechenweg lernen.
Und wenn er dann irgendwann genug Erfahrung hat um zu Entscheiden, wann 
man absichtlich falsch rechnet, um irgendwelche geschönten Werte abseits 
der Realität zu erhalten: Dann kann er das immer noch so machen, und 
muss dazu dann auch nicht mehr im Forum hier fragen.

von A. S. (Gast)


Lesenswert?

Εrnst B. schrieb:
> besagt: Spannung größer

Das habe ich weder hier, noch in RL gesehen.

Ein Wert von 1 oder 4,5 bedeutet genau das.


Aber wenn Du ein DB postest, dass es so interpretiert werden soll, 
akzeptiere ich das gerne.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

A. S. schrieb:
> Messbereich 1V, Umschaltschwelle 0,5V,
Und bei 0,5V haben wir bei dieser Betrachtung dann den 
Schrödingers-Katze-Effekt: das sich ergebende Bit ist gleichzeitig 0 und 
1...

Und das ist der Witz an der Sache: es ist eine Grenzwertbetrachtung. Bei 
einer Referenz von 5V ist die Spannung 5,000punktpunktpunkt000V völlig 
singulär. Es gibt diese Spannung nur 1 einziges Mal. Aber ein LSB ist 
eben nicht singulär, denn es gibt unendlich viele Spannungen, die in das 
letzte LSB passen.

: Bearbeitet durch Moderator
von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

A. S. schrieb:
> Aber wenn Du ein DB postest, dass es so interpretiert werden soll,
> akzeptiere ich das gerne.

Gerne.
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf

Wenn dich interessiert was der technische Hintergrund zu dem "Größer 
gleich" ist, schau dir an wie ein successive-approximation ADC 
funktioniert. (so einer steckt im AVR)

Gif von Wikipedia 
https://en.wikipedia.org/wiki/Successive-approximation_ADC


Edit: Schade, leider ist die GIF-Animation beim Upload hier 
verlorengegangen...

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Εrnst B. schrieb:
> Gerne

Ich meinte schon ein DB von einem Multimeter oder einer Anzeige.

Dieser Thread dreht sich um den Wert, der ausgegeben wird.

Die Funktionsweise eine ADCs hab ich jetzt Mal vorausgesetzt und 
mehrfach beschrieben.

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

A. S. schrieb:
> Ich meinte schon ein DB von einem Multimeter oder einer Anzeige.

Was soll das bringen?

Die zeigen "Overflow", wenn der ADC-Wert am Anschlag ist.

Aber wenn's dich glücklich macht, sh. Anhang: Zeigt max 1999, obwohl der 
Messbereich bis 2000 angegeben ist.

: Bearbeitet durch User
von Georg (Gast)


Lesenswert?

Eigentlich ist die Grundlage ganz einfach: ein ADC mit einem 
Wertebereich von 0..3FF hex gibt 1024 mögliche Werte aus, aber die 
definieren 1023 gleiche Intervalle. Darüber nachzudenken ist schon sehr 
schwer, so muss sich Einstein mit der allgemeinen Relativitätstheorie 
abgeplagt haben.

Georg

von H. H. (Gast)


Lesenswert?

Georg schrieb:
> Eigentlich ist die Grundlage ganz einfach: ein ADC mit einem
> Wertebereich von 0..3FF hex gibt 1024 mögliche Werte aus, aber die
> definieren 1023 gleiche Intervalle.

Falsch.


> Darüber nachzudenken ist schon sehr
> schwer, so muss sich Einstein mit der allgemeinen Relativitätstheorie
> abgeplagt haben.

Du darfst nicht von dir ausgehen.

von H. Eggert (Gast)


Lesenswert?

Was spricht dagegen mit Division durch 1024 zu arbeiten und dann die 
Werte mitteln? Dann würden die statistischen Abweichungen durch 
verschiedene Einflüsse, einschließlich Rauschen, "geschmälert werden und 
eine bessere Annäherung erzielt werden. Eine Mittlung würde sozusagen 
mehr Auflösung schaffen. Bei genug Mittlung könnte man dann die 
Auflösung auf Kosten der Umsetzzeit um ein oder zwei Bits erhöht werden. 
Dann hat man also nicht mehr die +/- 0.5 Bit Unsicherheit, sondern 
Zwischenwerte die eine gewisse Wertigkeit der Umwandlung erkennen 
lassen. Oft kann man sich Mittlung zeitmässig erlauben. Mit bessere 
Genauigkeit hat das natürlich nichts zu tun. Aber man kann Trends somit 
besser erkennen.

von Teo D. (teoderix)


Lesenswert?

H. Eggert schrieb:
> Was spricht dagegen mit Division durch 1024 zu arbeiten und dann die
> Werte mitteln?

Weil das hier nicht Thema ist und gaaaanz weit oben, schon abgehakt 
wurde.

Beitrag #7153163 wurde von einem Moderator gelöscht.
von Kuno (Gast)


Lesenswert?

Oha! Das wird hier nicht nach Sachlage, sondern nach Mehrheit der Dummen 
entschieden.
So blöd ist nicht mal die Politik - die stimmt manchmal für's Falsche, 
aber nur, wenn es gut bezahlt wird...

von MaWin (Gast)


Lesenswert?

H. H. schrieb:
> Falsch.

Aha. Dann erkläre es doch mal.

Beitrag #7153892 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.