Möchte mit meinem Atmega16 Spannungen von 0-5V messen, hierbei muss ich auf 8mV genau messen. Geht das? Steht dann der Wert in binär in einem Register? Rinaldo
Im Dateblatt mal das Kapitel zum ADC lesen. Das ist genau, was du suchst. Sollte bei 10bit auf 5mV genau sein (theoretisch)
Hi AVRs haben 10Bit AD-Wandler. D.h bei 5V Referenzspannung ergibt sich eine theoretische Auflösung vo 4,88mV. Theoretisch heisst,daß noch systembedingte Fehler wie Nichtlinearitäten,Bitfehler,Rauschen u.ä das Ergenis verfälschen. Der Wert steht binär in den Ergebnisregistern. Für deine Anforderungen wäre ein externer 12Bit Wandler wahrscheinlich günstiger. MfG HG
Hi Rinaldo, du hast bei 10Bit (ATMega) eine Auflösung von 5V / 1024 = 4,88mV. Das Messergebnis befindet sich nach der Messung in 2 Registern (ok eigentlich ports). Willst du es genauer haben, brauchst einen externen AD-Wandler. lg Ralf
Ja 1024 Werte it unbestritten aber du rechnest die 0 mit ein und das ist nicht korrekt auch wenn es bei 10 Bit nicht auffällt. Rechne mal mit 2 oder 3 Bit Auflösungdann merkst du den Rechenfehler '-)
Ergänzung: Ich gehe natürlich davon aus das mit dem untersten Wert auch die Masse (also 0V) und mit dem obersten Wert die Referenz (also hier 5V) dargestellt werden sollen unabhängig davon ob der Wandler die jetzt wirklich messen kann (Unterer/oberer Schwellwert aufgrund schaltungstechnischer Einschränkungen usw.)
@Ratber na dann rechne doch mal selbst: bei einem Bit Auflösung (2 Werte) wäre der Divisor dann 1? Ne, ne - die Null wird in der Digital-/Binärarithmetik schon mitgezählt :-). Henrik
> bei einem Bit Auflösung (2 Werte) wäre der Divisor dann 1?
Was denn sonst? 0 entspricht 0V und 1 entspricht 5V. Es gibt zwei
Werte, aber der Wert 1 entspricht schon dem Maximum. Die Schrittweite
ist also 5V/1, und nicht 5V/2. Bei 10bit hat man 1024 Werte. 0
entspricht 0V, 1023 dem Maximum, also ist die Schrittweite 5V/1023.
Test: Mal sehen ob es dargestellt wird. Die Formel für die Auflösung ist einfach Uaufl = U/2^n-1
Hi Laut Datenblatt -> ADC Conversation Result ist ADC=(Vin*1024)/Vref Mfg HG
Rechne mal für Vref 5V ,für Vin 2,5V und für die Auflösung 2 Bit. Also ADC=(2.5V*4)/5V Und nu geh die 4 Werte durch. Merkste was ? '-) Der Schreiberling der das Dokument verfasst hat hat nicht eingerechnet das in der Binärten Technik von 0 an gezählt wird und nicht erst mit der 1. Typischer Fehler. Auch bei Atmel schreiben angelernte die Dokumente und nicht die Experten denn die sind ganz anders beschäftigt. '-) Setz bei der Auflösung "U/2^n-1" statt "/U2^n" ein dann isses korrekt.
Hi Okay,nach reiflicher Überleung schliesse ich mich dem an. Unabhängig davon möchte ich auf die AppNotes AVR120 und 121 hinweisen. Letztere beschreibt Möglichkeiten zur Erhöhung der Auflösung der AVR-ADCs.Habe ich allerdings eben erst heruntergeladen und nur kurz überflogen. MfG HG
Ja die Methode ist einfach indem man die Aref extra moduliert und den Schaltpunkt der Bits veschiebt. Damit kann man die Auflösung um 1-2 Bits heraufsetzen. Hab ich mal vor 15 jahren für einen 6 Bit Wandler gemacht da mit nen 8 Bit noch zu teuer war. Ging einigermaßen. Is aber in der Praxis mit 10 auf 11 oder 12 Bit ne Knifflige Sache. Es erfordert sehr eng tollerierte Bauteile verwenden und die Aref muß wirklich stabil seinsonst hast du von den 1-2 Bit extra nichts da sie "flattern2 wie Laub im herbst.
Eigentlich ist das ja kein Grund zum "Streiten", aber wenn es der "Diskussion" hilft, dann äußere ich auch mal meine Meinung zu diesem immer wieder aufkommenden Thema... > Rechne mal für Vref 5V ,für Vin 2,5V und für die Auflösung 2 Bit. > > Also ADC=(2.5V*4)/5V > > Und nu geh die 4 Werte durch. > Merkste was ? '-) 00 0 0,00V...<1,25V 01 1 1,25V...<2,50V 10 2 2,50V...<3,75V 11 3 3,75V...<5,00V Das sind 4 verschiedene Ergebnisse, aber nur 3 "Grenzen" bzw. "Schritte" (Schwellwerte zwischen 2 benachbarten Ergebnissen). Bei 10 Bit sind es demnach 1024 verschiedene Werte, aber nur 1023 "Grenzen". Beim Dezimalsystem (10 Ziffern) sind es auch 10 Werte (je Stelle) aber nur 9 Schritte. Trotzdem reden wir vom Dezimalsystem und nicht vom "Nonimalsystem". Wenn man mit H-Byte und L-Byte eines 16-Bit-Wertes arbeitet, dann teilt man den Wert, um das H-Byte zu erhalten, auch durch 256 und nicht durch 255. Daher halte ich ADC=(Vin*1024)/Vref schon für korrekt. Denn jeder mögliche Wert (0...1023) repräsentiert ja nicht einen Spannungswert (mit vielen Nachkommastellen), sondern einen Spannungsbereich. Der erste (0) die Spannung von 0 (0/1024) bis 1/1024, der letzte (1023) die Spannung von 1023/1024 bis Maximum (1024/1024). Bit- & Bytebruch... ...HanneS... (Duck & wech...)
Hi Hannes :-) Allerdings kommt ein ADC-Wert von 1024 nie und niemals in den Registern ADCH:L vor. Rechnet man nun V = 5V / 1024 * 1023 kommt man bei der Rechnung niemals auf 5V. Man könnte natürlich den ausgelesenen ADC-Wert vorher um 1 erhöhen damit das wieder passt, aber bei ADC = 0 kommt dann auch nicht 0 raus. Wie dem auch sei, Mehrfachmessung für eine Messung ist eigentlich am besten wenn es genauer sein darf. Durch Verzehnfachung oder Verhundertfachung und Addition der Messwerte für eine Messung kann man die Auflösung erhöhen. Beispiel Temperaturmessung: Z. B. mit einem linearisierten NTC bekomme ich Werte in Schritte von 0.1°. Da mir das nicht genügt und ich gerne in Schritten von 0.01° messen will, wird die Messung Verzehnfacht. Um Messschwankungen vorzubeugen und in ASM dann einfacher zu teilen, wird eine Messung dann noch mal auf den Faktor 32 erhöht. Im Endeffekt werden dann für eine Temperaturmessung 320 Messwerte addiert, durch 32 geteilt, von einer festen Konstante subtrahiert und die Temperatur ist in 0.01°-Schritte ermittelt. MfG Andi
Ja nur verwechselst du die Zahl der möglichen Werte mit dem Ergebnis was du bekommst. Mit 10 Bit kann ich nur die Werte 0 bis 1023 abbilden und nicht den Wert 1024. Die Formel berücksichtigt das aber nicht und spuckt die Werte 1-1024 aus wobei 1 für 0V steht und 1024 für die Referenz. Nunn starte mal deinen ADC und schau was er dir ausspuckt. '-) Die Formel gibt nur "1." bis "1024." Wert aus womit ich aber in der Schaltung und beim Rechnen nichts anfangen kann es sei denn ich mache den umständlichen Weg immer eins höher zu zählen nur um die null nicht als Wert nehmen zu müssen. Also Sorry aber das ist sowas von Praxisfremd das es in einemDatenblatt nichts zu suchen hat. Ich kann es nur immerwieder empfehlen es mal mit einer überschaubaren 2 Bit Auflösung zu verifizieren. >Wenn man mit H-Byte und L-Byte eines 16-Bit-Wertes arbeitet, dann >teilt man den Wert, um das H-Byte zu erhalten, auch durch 256 und >nicht durch 255. Ja mit dem 9. Bit und nicht mit dem 8. Merkste nicht das du hier den gleichen Rechenfehler machst ? Rechne nochmal nach.
@Andi >Durch Verzehnfachung oder Verhundertfachung und Addition der >Messwerte für eine Messung kann man die Auflösung erhöhen. >Beispiel Temperaturmessung: >Z. B. mit einem linearisierten NTC bekomme ich Werte in Schritte von >0.1°. >Da mir das nicht genügt und ich gerne in Schritten von 0.01° messen >will, wird die Messung Verzehnfacht. >Um Messschwankungen vorzubeugen und in ASM dann einfacher zu teilen, >wird eine Messung dann noch mal auf den Faktor 32 erhöht. >Im Endeffekt werden dann für eine Temperaturmessung 320 Messwerte >addiert, durch 32 geteilt, von einer festen Konstante subtrahiert und >die Temperatur ist in 0.01°-Schritte ermittelt. ?????????....... Wenn ich davon ausgehe das die Messwerte nicht durch Störungen verfälscht werden dann messe ich mit einem zb. 10-Bit Wandler immer nur 10-Bittig egal wie oft ich messe. Im Gegenteil,ich mittle mit der Methode um Störungen auszugleichen. Nimm mal den einfachsten AD-Wandler,den Koparator.Also 1 Bit. die Grenze liegt bei 5V Referenz genau bei 2.5V Ich lege zb. 3V an also wird mir eine 1 angezeigt und damit 5V. Wenn die Versorgung und das Signal stabil ist bekomme ich immer eine 1. Da kann ich eine Milliardemal messen und am Ende durch eine Milliarde teilen,es ist immernoch eine 1 und die Auflösung beträgt immernoch 1 Bit. Sorry aber Auflösungserhöhung ist wenn ich den Referenz-Messbereich von 0-5V auf 1.25-6.25V (Also allgemein um die Hälfte der Auflösung) erhöhe um den Schaltpunkt von 2.5 auf 3.75V zu erhöhen. Damit kan ich die 3V zwischen 2.5 und 3.75V eingrenzen und habe die Auflösung auf 2 Bit erhöht. Oder hast du dich nur etwas unverständlich ausgedrückt ?
Ich denke, wir sind uns über diese Tabelle, die HanneS gepostet hat, einig: > 00 0 0,00V...<1,25V > 01 1 1,25V...<2,50V > 10 2 2,50V...<3,75V > 11 3 3,75V...<5,00V Hier sieht man doch schon eindeutig, dass die Schrittweite genau 1/4 Vref beträgt, also allgemein ADC = floor(Vin/Vref * 2^n) (floor = abrunden) Um nun von einem ADC-Wert wieder zurück zu einer Spannung zu kommen, gibt es mehrere mögliche Aussagen: a) Vin ist größer als Vin = ADC * Vref / 1024 b) Vin ist kleiner als Vin = (ADC+1) * Vref / 1024 c) Vin ist ungefähr Vin = (ADC+.5) * Vref / 1024 Hiermit ist dann die Frage, warum man nun bei 1 anfangen würde zu zählen geklärt: Es kommt auf die Betrachtungsweise an. Jede andere Definition wäre in meinen Augen reichlich unsinnig (oder habe ich irgendwas übersehen?).
@Ratber: Vielleicht habe ich mich tatsächlich unverständlich ausgedrückt, aber es war so gemeint. Um Zwischenwerte zu ermitteln die der ADC eigentlich nicht messen kann, verfielfache ich die Anzahl der Messungen für ein Messergebnis. Es ist anscheinend so, das der ADC z. B. eine Spannung von 2,345V mal als 2,34V und mal als 2,35V misst (nur als Beispiel). Verdopple ich nun die Messungen und teile sie durch 2 nach dem ich 2,340V und 2,350V gemesse habe, komme ich nun auf 2,345V. Zumindest klappt das mit den 320 Messungen für einen Temperaturwert ganz gut um in Schritten von 0.01° zu Messen. Zeigt mir das LCD z. B. eine Temperatur von 24,23° an dann bleibt es auch einige Zeit so (Messrate der Temp. ca. 8 mal/Sekunde). Genau so bei 23.24, 23.25° etc. Immerhin ergeben sich von einem Messbereich von -20.00° bis 80.00° 10000 Stufen. Das ganze ist auch ein Software-Trick der davon ausgeht, das Zwischenwerte z. B. mal mit ADC = 500 oder ADC = 501 gemessen werden. MfG Andi PS: Ich hoffe, ich habe mich dieses mal verständlicher ausgedrückt.
@Andi: Du erhöhst damit aber nicht die Auflösung der ADC. Du nutzt nur das vorhandene Rauschen aus, in dem du annimmst, dass du ein um den tatsächlichen Wert symmetrisch verteiltes rauschen hast. Hättest du ein ideal stabiles Signal, würde das nicht funktionieren!
@Jan Ja die Tabelle ist soweit ok. Es geht nur darum wie ich den Wert ermittle. Mit "ADC=(Vin*1024)/Vref" bekommt man immer einen stetigen Fehler von 1. Ich versuch es mal als Fragen zu definieren. Welche Spannungswerte schreibt man jeweils den ADC-Werten 0 und 1023 zu und wie kommt man dahin ? Als Beispiel meinentwegen 12V für Messbereich und 2 Bit für die auflösung um es einfacher zu machen.(die 12 läst sich ja auch im Kopf glatt durch 3 und 4 Teilen). @Andi Was du da machst ist keine Auflösungserhöhung sondern nur eine Mittlewertbildung. Weil dein Messsignal vermutlich Zyklisch wandert bekommst du eine scheinbare Auflösungserhöhung die vieleicht sogar in die nähe des Realen mittelwertes kommt. Nur ist das absolut keine Garantie für korrete Werte. Nimm mal an du wandelst 10x die Sekunde und in genau dem gleichen Rytmus gibt es Spannungsspitzen gleibleibender höhe von sagen wir mal 1.5x Messspannung. Liegen die Spitzen ausserhalb der Messzeiten dann nimmst du sie nie war. Liegen se genau auf dem Messzeitpunkt dann misst du ständig die Spitze und eine Messspannung die 1.5x über der eighentlichen Spannung liegt. Also alles sehr Wackelig. Geh mal davon aus daß das Messignal Genau und Konstant ist dann liefert dir dein AD-Wandler immer den gleichen wert dessen Mittlewert ebenfalls diesem Wert entspricht. Nimm doch einfach mein Beispiel oben mit dem 1-Bit Wandler. Das sollte es doch klar machen. So,sollte ich jetzt was durcheinander gebracht haben dann bitte ich das zu entschuldigen weil ich mich normalerweise nicht gleich 2 Intensiven diskussionen in einem Topic widme. Da kommt man schnell durcheinander.
Klar, es ist eine Erhöhung der Auflösung des Messergebnisses, nicht des ADC. Übrigens hatte ich vorher nicht ca. 8 einzelne ADC-Messungen gemeint, sondern 8 mal 320 Messungen je Sekunde und Auswertung. Es könnten 32 Vollmessungen sein, aber wegen 4-Kanal sind es je Kanal nur 8 was aber völlig ausreicht. Es wäre mal interessant, ob man eine stabile Spannung aus einem Labornetzteil mit einem Spannungswert zwischen 2 ADC-Werten mit Mehrfachmessung ermitteln kann. Leider habe ich solch ein Labornetzteil nicht. Jetzt muss ich mir auch mal die AppNotes AVR120 und 121 ansehen. MfG Andi
Das kommt darauf an, welche Aussage du treffen willst. Willst du einen Messwert für die Spannung erhalten, solltest du Variante c) wählen, also: Vin = (ADC+.5) * Vref / 2^n Für 12V und 2bit: > 00 0 1,5V > 01 1 4,5V > 10 2 7,5V > 11 3 10,5V Der Messwert 01 entspricht mit gleicher Wahrscheinlichkeit jeder beliebigen Spannung zwischen 1,5V und 3V, deswegen ist es am sinnvollsten, den Mittelwert des Intervalls als Messwert anzugeben. Der absolute Fehler beträgt dann +-1,5V bzw. +- Vref / 2^(n+1)
@Andi Dafür brauchst du kein besonders Labornetzteil. Dazu brauchste nur die auflösung an deinem Controller runtersetzen. Der AD hat 10 Bit also Teilst du den Ergebniswert einfach durch 256 oder Shiftest den Wert einfach um 8 bit nach Rechts. Jetzt hast du einen AD-Wandler mit 2 Bit Auflösung. Die zu messende Spannung stellst du auf einen Wert ein der eben nicht im Grenzbereich liegt um Fluktuationen zu eliminieren. Wenn du jetzt beliebige Dauermessungen machst dann wirst du merken das du mit deiner Methode nie eine Auflösungserhöhung erzielen wirst weil sich die Schaltschwellen ja nie ändern. Nur wenn du das Messfenster (Aref und Masse gleichzeitig) um einen halben Schwellwert verschiebst dann erhöhst du die Auflösung um ein Bit. Man kann auch mit einer Spannungslupe arbeiten (Ok,Einen Absatz höher hab ich das ja schon faktisch angesprochen) aber da erfordert es einen guten Abgleich sonst bekommt man nur Müll als Ergebnis. >Klar, es ist eine Erhöhung der Auflösung des Messergebnisses, nicht >des ADC. Nein ,da drückste dich immernoch misverständlich aus. Du Stabilierst nur deinen Messwert durch Aret. Mittlewertbildung um Störungen auszufiltern. Das ist das Digitale Gegenstück zum RC-Glied am AD-Eingang. Oder auf 80er Neudeutsch "Oversampling" :D Wäre deine Messpannung ideal ohne Störungen dann wäre diese Behandlung ja nicht nötig. @Jan Die Verscheibung des Schwellwertes um den Fakto 0.5 wollten wir doch ertmal rauslassen um klarer Arbeiten zu können. Ich möchte gerne zur deiner Formel "ADC=(Vin*4)/12V" (ich habs auf 2 Bit reduziert) gerne die Werte haben.
Habe mir gerade die AppNote 121 angeschaut und genau das, was da steht, habe ich gemacht, nur vielleicht etwas dumm erklärt. Oversampling heißt das Zauberwort um die Auflösung des Messergebnisses zu erhöhen. Siehe hier: http://www.atmel.com/dyn/resources/prod_documents/doc8003.pdf MfG Andi
>Oversampling heißt das Zauberwort um die Auflösung des Messergebnisses >zu erhöhen. Nein du drückstdich leider sehr verkehrt aus. Du kannst die Drehzahl eines 8 Zylindermotors verdoppeln und denoch bleibt es ein 8-Zylinder. Oversamlping ist nur eine Störunterdrückung bzw. Fehlerkorrektur. Genau das machst du ja die ganze Zeit. Auflösung ist die erhöhung der Messtufen und das geht so nicht.
Ergänzung: Mein letzter Satz war unvollständig. Sollte heissen das du die Auflösung nicht mit mehrfacher messung erhöhen kannst. Es wäre natürlich ein Traum denn man könnte sich die Auflösung bzw. die Geschwindigkeit beliebig aussuchen aber es funktioniert so nicht.
Ich verschiebe den Schwellwert doch gar nicht. Ich interpretiere nur die Messdaten des ADC, ohne an der Messung des ADC irgendwas zu verändern. Meine Werte für 12V / 2bit sind verschieden, je nach dem, welche Aussage ich treffen will: 00: Der Messwert ist größer als 0V. Der Messwert ist kleiner als 3V Der Messwert ist ungefähr 1,5V 01: Der Messwert ist größer als 3V. Der Messwert ist kleiner als 6V Der Messwert ist ungefähr 4,5V 10: Der Messwert ist größer als 6V. Der Messwert ist kleiner als 9V Der Messwert ist ungefähr 7,5V 11: Der Messwert ist größer als 9V. Der Messwert ist kleiner als 12V Der Messwert ist ungefähr 10,5V Diese Aussagen kann man treffen. Die Werte zur Formel ADC=(Vin*4)/12V sind jeweils die "ist größer als"-Werte
@Ratber: In meinem obigen Beispiel habe ich 320 Messungen für ein Messergebnis. Also, Messung mal 32 als Störunterdrückung (auch nachher einfacher in ASM durch 32 zu teilen) und dann noch 10 für Messstufen 10. So bekomme ich einen um Faktor 10 höhere Stufung mit Störfilterung hin. Oder Spannungsmessung: 4 mal ADC auslesen als Entstörer und dann noch mal 10 für eine 10 mal höhere Auflösung, also für einen Messwert 40 mal den ADC-Wert addieren, als Ergebnis in Schritten von 0.5mV. Ich meine, wenn man schon mit Oversampling misst, dann kann man gleich per Software die errechnete Auflösung erhöhen, ob das nun wegen Rauschen ist oder eine Besonderheit des ADC ist wurscht. Die Temp.-Messung in 0.01° Schritten (-20° - +80°) und die Spannungsmessung in 1mV Schritten läuft hier einwandfrei. Probiere einfach mal selbst aus per Oversampling zu messen und dann nicht durch die Anzahl der Messungen zu teilen, sondern nur durch 2 oder 4. Bei Spannungsmessung z. B. 40 ADC-Werte addieren (max 40 * 1023 = 40920). Teilst Du das durch 4 erhälst Du Werte in Schritten von 0.488mV bei max. 5V und Vref = 5V. Wie schon gesagt, es ist eine Erhöhung der Auflösung des Messergebnisses in einer Variablen per Software, nicht des ADC. MfG Andi
@Jan Also dann muß ich mich selber mal Zitieren: >Ich möchte gerne zur deiner Formel "ADC=(Vin*4)/12V" (ich habs auf 2 >Bit reduziert) gerne die Werte haben. Warum weichst du aus ? Nimm doch einfach 1V Schritte dann ist es übersichtlicher und wir sind gleich an dem Punkt wo ich drauf hinaus will. 0V ( 0V*4)/12V = 0 1V ( 1V*4)/12V = 0 2V ( 2V*4)/12V = 0 3V ( 3V*4)/12V = 1 4V ( 4V*4)/12V = 1 5V ( 5V*4)/12V = 1 6V ( 6V*4)/12V = 2 7V ( 7V*4)/12V = 2 8V ( 8V*4)/12V = 2 9V ( 9V*4)/12V = 3 10V (10V*4)/12V = 3 11V (11V*4)/12V = 3 12V (12V*4)/12V = 4 Allein der Wert 4 Zeigt doch schon das die Formel Blödsinn ist denn wie kann ein Ergebnis 3-Bittig sein wenn der Wandler nurt 2-Bittig ist ? Bei der Originalformel "ADC=(Vin*1024)/Vref" komme ich bei voller Spannung auf 1024 und auch das ist ein Wert der nicht 10 sondern mindestens 11-Bittig ist. Das macht keinen Sinn. Der Author des Textes Rechnet mit dem "Ersten" und "Tausendvieundzwanzigsten" wert aber das ist in meinen augen völlig unsinnig da ich in jedem Falle auf 0-1023 umrechnen muß damit ich Praktisch damit arbeiten kann. Ich kann es mir nur so erklären das Leute die häufig mit Tabellen arbeiten nur schwer damit zurechtkommen das ein Index bei 0 beginnt und nicht bei 1. Vieleicht sollte man es mal auf unser Dezimales System übertragen. Die erste Ziffer im Dezimalsystem ist nicht die 1 sondern die 0 und die Zehnte ist nicht die 10 sondern die 9. Ist also kein Unterschied und rechnet sich auch nicht anders. @Andi Du machst es ja schon wieder ? Dann erklär mir mal was du unter Auflösung verstehst denn ich verstehe darunter in diesem Zusammenhang "Abstufung". Was du machst ist ein Mittel zu bilden (Volksmund:Durchschnitt) . Beide Begriffe sind für meine auffassung gänntlich verschiedene Sachen die man nicht in einen Topf werfen kann. Oder hat man in den letzten Jahren die Bedeutungen einiger Wörter so komplett umngestellt das ich nicht mehr mitkomme ?
@Andi Mir läst deine aussage keine Ruhe. Kann es sein das du von einer ganz anderen Signalerfassung sprichst wie ich ? Erfasst du vieleich eine Periodische Signalform wärend ich hier von einer Gleichspannung rede ?
@Ratber: Ich bin dir nicht ausgewichen, ich wusste nur nicht, auf was du hinauswolltest. Ich muss zugeben, die Formel ist so gesehen nicht ganz vollständig. Aber es ist auch klar, dass der ADC nicht zwischen 11,9V und 12V unterscheiden kann. Deswegen liefert er bei 12V genauso eine 11 wie bei 11V. @Andi: Die tatsächliche Auflösung wird so natürlich nicht erhöht. Die effektive Auflösung aber unter Umständen schon. Und zwar genau dann, wenn das zu messende Signal mit einem normalverteilten Rauschen überlagert ist.
@Ratber: Ich meine schon Messung auf einem Mega16 (ist hier auch vorhanden) aber nicht EINE ADC-Messung, sondern viele, in meinem Fall 320, Messungen für EIN Messergebnis welche auf eine 24 Bit-Variable aufaddiert und dann umgerechnet werden. Das tolle ist ja, das ich gerade 24.50°C angezeigt bekomme (ohne Wackeln) und nun 24.49° (auch ohne hektisches hin und her). Kann das dann ein "normalverteilten" Rauschen sein, wenn ein durch Einzelmessung nicht messbarer Wert durch Oversampling konstant gemessen wird? Die AppNote 121 beschreibt ja gerade, wie man mit Oversampling die Auflösung einer SOFTWARE-Messung, welche aus vielen Einzelmessungen besteht, die MESSAUFLÖSUNG erhöht. Habe eigentlich nur dank Hartmut damit angefangen der meines erachtens auf den richtigen Weg ist. MfG Andi
>Ich muss zugeben, die Formel ist so gesehen nicht ganz vollständig. >Aber es ist auch klar, dass der ADC nicht zwischen 11,9V und 12V >unterscheiden kann. Deswegen liefert er bei 12V genauso eine 11 wie bei >11V. Eben,Der Fehler mag bei 10 Bit nur Marginal sein aber er ist da. Ich hab mir mal den Spaß geleistet eben eine Einfache Temperaturerfassung auf Basis Kty-81-210 als Spannungsteiler mal mit 1023 und mal mit 1024 zu rechnen (In bezug auf den Widerstand im Teiler und damit den zu erwartenden Spannungen). Also eins weniger vom AD-Wert berücksichtigt. Zum normnalen Fehler von 2° (Ich erwähnte ja das es eine sehr Simple Schaltung ist) kommen gleich weitere 0,86° hinzu was ja nicht unbedingt sein muß. Geht also auch bei 10-bit recht Fix.
Es scheint mir so, dass ich hier für euch ein sehr interessantes Thema für euch aufgegriffen habe. Habe den ganzen Nachmittag an einem kleinen Programm herumgetüftelt, um über den PC über die RS232 meine Messschaltung und den ADC zu testen. Das hat bisher aber alles nicht so ganz funktioniert, wie ich mir das vorgestellt habe. Habe auch schon ein Programm aus der Codesammlung ausprobiert, funktioniert auch nicht (so ein Makro in Excel um die Spannung zwischen 0 bis 5V zu messen). Hat von euch einer ein einfaches Programm für den Atmega16 um das Messeneiner Spannung (0-5V) zu testen, wäre echt ganz große Klasse. Rinaldo
Hi Hat sich jemand schon mal Gedanken gemacht, wie er Rinaldo helfen kann? MfG HG
@Ratber: Das ist aber kein Fehler, den man irgendwie per Rechnen berücksichtigen muss. Es ist einfach so, das ein ADC nur Spannungen messen kann, die kleiner als Vref sind. Deswegen wird dir ein ADC bei Vref=12V auch für Vin = 12,3V nur den gleichen Wert liefern wie für 11V, obwohl dieser Spannung theoretisch 100 entsprechen würde.
Ich hätte schon was, aber ist nur zur Ausgabe auf ein GLCD als Zahl und Temp.-Kurve und in ASM, ohne serieller Übertragung. MfG Andi
@Andi >Die AppNote 121 beschreibt ja gerade, wie man mit Oversampling die >Auflösung einer SOFTWARE-Messung, welche aus vielen Einzelmessungen >besteht, die MESSAUFLÖSUNG erhöht. >Habe eigentlich nur dank Hartmut damit angefangen der meines erachtens >auf den richtigen Weg ist. Was du das in der 2. Stelle hinterm Komma misst ist nur das Rauschen am AD und keine Temperatur. Nimm stastt des Fühlers mal einen ordinären Widerstand und beobachte die Schaltung. Da wirsste dann auch Zehntelgrade messen. Wenn du die Schaltung in die nähe einese Fernsehers legst dann bekommste vieleicht noch mehr "Temperatur" mit der Zeit. Sorry aber Wenn ich mit einem 3.5-Stelligen Multimeter 100 mal messer und dann durch 100 Teile dann bekomme ich zwar einen wunderbar gemittelten Wert aber dein Multimeter bleibt immernoch ein 3.5-Stelliges. Was in den Appnotes beschrieben wird ist wie man die volle auflösung bekommen kann indem man den Ganzen Messkreis Kalibriert und Stabilisiert. Anschließend möchte man das immer vorhandene Rauschen des Signals ausnutzen indem man es gezielt erhöhrt um ein weiteres Bit zu simulieren. Zitat: ============================== Normally there will be some noise present during a conversion. The noise can be thermal noise, noise from the CPU core, switching of I/O-ports, variations in the power supply and others. This noise will in most cases be enough to make this method work. In specific cases though, it might be necessary to add some artificial noise to the input signal. This method is refereed to as Dithering. Figure 3-1 (a) shows the problem of measuring a signal with a voltage value that is between two quantization steps. Averaging four samples would not help, since the same low value would be the result. It may only help to attenuate signal fluctuation. Figure 3-1 (b) shows that by adding some artificial noise to the input signal, the LSB of the conversion result will toggle. Adding four of these samples halves the quantization steps, producing results that gives better representations of the input value, as shown in Figure 3-1 (c). The ADCs virtual resolution has increased from 10 to 11-bit. This method is refereed to as Decimation and will be explained further in section 3-3. ======================== Also an der tatsächlichen Auflösung des ADCs wird da nicht gerüttelt. @Jan Mir ist sehr wohl bewust das der AD an beiden Enden nicht richtig arbeitet. Entweder wir bleiben erstmal beim Prinzip oder wir tauchen voll in die "Realität" ein . Dann kann ich das Chaos perfekt machen und anführen das die Messungen mit 10 Bit eh Kappes sind weil Temperaturdrift und eine Leichte Nichtlinearität des AD das Ergebnis verfälschen so das man höchstens 9 Bit davon nutzen kann und das auch nur innerhalb gewisser Bedingungen. Damit wäre die Formel absolut egal. Also Theorie oder Praxis ? @Rinaldo Sorry aber woher sollte ich wissen wie sich das entwickelt ?
Kann auch direkt ein LCD anstecken, jdoch kein graphisches, das LCD (40x2) funktioniert, wäre somit eine einfachere Lösung erst einmal, um die Funktion an sich zu testen. Kann man das auf ein normales LCD leicht umschreiben? Meine Assembler-fähigkeiten sind jedoch auch im absoluten Anfangsstadium. Gruss, Rinaldo
@Ratber: Das mit den 24,40° und dann, 2 Sekunden später, 24,49°, kommt eher durch die Thermik im Raum die sich ständig (minimalst) bewegt und sollte eigentlich nur die Abstufungsmöglichkeiten bei Oversampling-Messung darstellen. Immerhin war jeder der beiden Werte 2 bis 3 Sekunden lang konstannt, also bei über 15 bis 20 Oversamplingmessungen immer der selbe Wert ermittelt. Ich habe ja nie behauptet, das was am ADC gedreht wird, es ist eine reine Software-Technische Erweiterung der Auflösung. Aber irgend wie verstehst Du nicht, was ich wie meine. MfG Andi
Ich verstehe schon sehr gut aber was du da misst ist nur das Samplingrauschen an einem Übergang plus Widerstandsrauschen plus sonstiges Rauschen. Auf welche Genauigkeit ist deine Schaltung übrigens ausgelegt ? (Ohne Extramaßnahmen)
@Ratber Alles was ich geschriebn habe war Theorie. Eine 2bit-12V-ADC kann nun mal nur Werte unter 12V messen. Ist der ADC dann so aufgebaut, wie die in den AVRs, so gibt er für alle Werte, die größer sind als (2^n-1)/(2^n)*Vref den Maximalwert 11...1 aus. Vielleicht sollten wir das aber nicht hier in diesem Thread ausdiskutieren, sondern entweder einen neuen aufmachen, per Mail kss-abi@onlinehome.de oder ICQ 239641155
Hoppla,fehlt was. Was du da ausnutzen willst ist das Rauschen des Fühlers was sich je je nach Temperatur in die eine oder andere Richtung verschiebt aber wenn der Fühler derart Rauscht dann muß ich ihn gleich ganz in Frage stellen was die Genauigkeit angeht. Sorry aber die Methode ist für mich immernoch ein Taschenspielertrick
@Jan Es geht hier nicht um die Praktischenb Grenzen sondern ums Rechnerische. Wie ich schon sagte können wir gwerne gleich voll in die Reale Welt gehen aber dann kann ich den ADCs im AVR nur echte 8 Bit Atestieren und die Formel verbrennen. In der Theorie gehe ich immer vom Ideal aus um die Grundlagen zu klären bevor ich ins Detail gehe. Schließlich Entwickelt man erst den Rumpf bevor man den Motor einbaut '-)
@Ratber: Ein idealer ADC hat aber auch eine unendliche Auflösung und keine maximal messbare Spannung. Gehen wir davon aus, dass ein 2bit-12V-ADC auch Spannungen höher 12V messen kann. Dann gibt es zwei Möglichkeiten: Er "klaut" sich einfach ein drittes Bit und stellt 100 da, oder es kommt einfach zu einem Überlauf und das Messergebnis lautet 00. Alles andere ist völlig unmöglich, sowohl theoretisch als auch praktisch.
Für "Anfängerstadium" ist diese Aufgabe sicherlich etwas zuviel. Zerlege doch mal die Aufgabe in kleinere Teile, die (jedes für sich gesehen) realisierbar sind. - ADC einschalten und in zeitlichen Abständen messen. (Das Datenblatt zeigt, wie das geht) - Den gemessenen Wert (Binärzahl 0...1023, in 2 Registern liegend), auf die gewünschte Größe skalieren, aus 0...1023 soll z.B. 0...5000 werden (0,000...4,999 oder 5,000). Dazu ist eine Konstante zu ermitteln, mit der der eingelesene Wert multipliziert wird. Dabei kommt (vorerst) nur Ganzzahl-Arithmetik in Betracht. - Den skalierten Wert (binär in 2 Registern vorliegend) in ASCII-Text (4 Ziffern, evtl. mit Führungsnullen) umwandeln, die man als Mensch auch interpretieren kann. - Vom ASCII-Text die erste Ziffer an das gewünschte Textdarstellungs- Gerät ausgeben. - Ein Dezimaltrennzeichen an das Gerät ausgeben (Punkt oder Komma). - Die restlichen 3 Ziffern an das Gerät ausgeben. - Ein Leerzeichen an das Gerät ausgeben. - Den ASCII-Text für die Maßeinheit an das Gerät ausgeben ("V" oder "Volt") - Ein Unterprogramm (oder eine ganze Sammlung von Routinen) schreiben, welche(s) Zugriff auf das Ausgabegerät ermöglicht. Dies kann das Aktivieren des USART (siehe Datenblatt) und die zeichenweise Ausgabe an den PC (mit Terminalprogramm) sein, oder eine Routinensammlung für das LCD (siehe AVR-Tutorial). Ich nehme mal an, dass es dir nicht um ein "Messgerät" geht, sondern um das Verstehen der Zusammenhänge. Denn ein Digitalmultimeter, das bedeutend mehr kann, bekommt man für unter 5 Euro (Bei ALDI gabs die mal für 3,50 Euro). Wenn es dir also ums Versztehen der Zusammenhänge geht, dann würde es dir auch nix nützen, wenn dir Andi oder ich ein passendes Programm in ASM schreiben würden, denn das wäre einfach zuviel auf einmal, das würdest du nicht auf die Schnelle "verdauen". Sicherlich könnte dir Ratber auch ein Programm in BASCOM schreiben, das wären nur wenige Zeilen, also viel bequemer als in ASM, aber ob du damit das Innenleben und die Funktionsweise eines AVRs kennen lernst, steht auf einem anderen Blatt. Aua, jetzt habe ich (leider) wieder eine Lawine ins Rollen gebracht, nämlich den Glaubenskrieg zwischen den Programmiersprachen. Dies war nicht meine Absicht, daher: "Duck und schnell wech..." Übrigens: - Ich habe nicht behauptet, dass der ADC den Wert 1024 ermitteln kann. - Ich habe keine Lust, darüber zu diskutieren, ob der ADC 1024 oder 1023 verschiedene Werte ermitteln kann. Es ist nämlich alles eine Frage der Betrachtungsweise. - Ich habe nicht die Absicht, die (mir inzwischen bekannte) Fachkompetenz der an dieser Diskussion beteiligten Leute anzuzweifeln. Und nun: Bit- & Bytebruch... ...HanneS... (Duck und ganz schnell wech...)
@Jan Es geht nicht um die Spannung sondern um die Auflösung und die ist immer Bauartbedingt. Ein Flashwandler defineirt sich durch die Zahl der Komparatoren und der Anzahl der Stufen um die ich sie verstellen kann. Oder ein Sukzessive-Aproximations-Wandler der ebenfalls durch die Breite seines SA-Registers begrenzt ist. Es gibt noch mehr möglichkeiten aber das Spielt keine Rolle. Der Wandler im AVR ist nunmal bauartbedingt auf 10 Bit begrenzt und da du ihn ja kaum öffnen und schaltungselemente hinzufügen kannst wird es auch bei den 10 bit bleiben. Das einizge was ich an einem AVR noch verändern kann ist das Messignal um ein halbes Digit zu verschieben um noch weitere Bits zu bekommen. Demnach kann ich die Auflösung beliebig und unendlich erhöhen. Aber nur durch häufiges Messen nicht. Mimm doch einfach den 1-Bit Wandler und versuche dort nur mit messen einen zwischenwert zu ermitteln. Das geht nur wenn das Messignal stark genug rauscht und damit ist es nicht mehr als ausreichend genau einzuordnen. Ich kann der Methode so oder so keinen ernsthaften Reiz abgewinnen. @Hannes Die verwendete Sprache ist doch egal solange richtig umgesetzt wird. Meinentwegen in Turtlebasic oder Lisp. Speilt kein Rolle denn die Hardware ist ja immer die gleiche. >(Duck und ganz schnell wech...) Warum ? Ich beiß doch nicht :D
Das Ermitteln eines Mittelwertes erhöht zwar nicht die physikalische Auflösung des ADC, filtert aber das Rauschen aus, welches bei nicht optimal layouteten Platinen die unteren 2 Bits "klappern" lässt. In meinem Fall war die Auflösung von 8 Bits ausreichend. In folgendem Beispiel geht es aber um die Bildung des Mittelwertes. Mittelwert über 10, 100 oder auch 32 Messungen halte ich für recht aufwändig (Rechenzeit). Ich nutze daher gerne die Mittelwertbildung über 256 Messungen. Warum? - Weil man den 256ten Teil subtrahieren muss (das muss man nicht errechnen, da das ja bereits das "untere" Byte ist) und ein 256tel des Neuwertes addieren muss (man addiert ihn einfach "ein Byte tiefer" und spart sich alle Schieberei. Es kostet ganze 13 Takte, wenn man davon ausgeht, dass die Werte im SRAM liegen. Kann man die Werte in Registern halten, dann geht es noch schneller. Zum Beispiel: Das Bit ADCLAR in ADMUX sei gesetzt, um linksbündige Ausgabe zu erzwingen. Das Auslesen des ADC erfolgt innerhalb einer Timer-ISR, in der noch andere Aufgaben erledigt werden... lds r0,batt1 ;Mittelwert aus SRAM holen lds wh,batt0 ;Nachkommastellen auch sub wh,r0 ;1/256 subtrahieren sbc r0,null ;Übertrag auch in wl,adch ;linksbündiges High-Byte des ADC lesen add wh,wl ;Neuwert/256 addieren adc r0,null ;Übertrag auch sts batt1,r0 ;zurück sts batt0,wh ;ins SRAM ... (ganz tief duck und ganz langsam weg...) ;-)
Ja oder "Shift x right 8" :D PS: Wenn de dich noch tiefer Duckst dann is aber bald nichts mehr mit laufen '-)
> Ich beiß doch nicht :D
Ich weiß...
Inzwischen kenne ich auch deine Art von Humor...
Und ich amüsiere mich köstlich (ohne mich über dich lustig zu machen).
Gruß...
...HanneS...
(langsam und aufrecht verschwindend...)
yo,jux muß auch mal sein. So,ich verabschiede mich mal für Heute. Morgen hab ich leider mal wieder die bucklige Verwandshaft am Hals und keine Hanfkekse im Haus. :D
Na das wurde ja höchste Zeit, dass sich die Erbsenzähler wieder auf dieses Thema stürzen (1023/1024 äh oder doch 1025???) Also für alle Praktiker hab ich mal nachgerechnet: 5V / 1024 = 4,882812... mV 5V / 1023 = 4,887585... mV Differenz: 0,004773032 mV Fehler: 0,09775... % Die Werte habe ich mit meinem Taschenrechner ermittelt und ich erhebe keine Gewähr, oder doch? Also bitte zukünftig in AD-Messungen diesen Fehler mitberücksichtigen, da ja zum Glück die vom AVR gemessenen Spannungen zu 100% genau sind, das nenn ich HighTech :-) Unter 0,5V misst der AVR sogar noch genauer, daher unbedingt den Rechenfehler mitberücksichtigen, sonst messt ihr was total Falsches. Ich werde auch alle meine Programme in dieser Richtung umschreiben, da ich leider irrtümlich (aus Fachliteratur etc.) den Wert 1024 übernahm. Wer jetzt denkt das Thema sei damit erledigt, den muß ich enttäuschen: es wird spätestens in Wochen wieder irgendwo hier auftauchen... und es ist mir SCHEISSEGAL :-) lg Ralf ps.: hab jetzt Besseres zu tun :-)
Mahlzeit Dachte schon die gehen nie.... :D @Togger Ja meinentwegen rechne nach "ADC=(Vin*1024)/Vref" mit Ergebnissen von 0 bis 1024 denn 10-bit sind ja 1025 Werte wie sich jeder normale Mensch an seinen Elf Fingern abzählen kann. :D :D :D
@Ratber Ja, ich werde weiterhin mit ADC=(Vin*1024)/Vref mit Ergebnissen von 0 bis 1023 für Vin < Vref rechnen. Alles andere ist nicht praxistauglich und unsinnig. Wer mir etwas anderes beweisen will und kann, möge das tun. Das war jedenfalls mein letzter Beitrag zu diesem Thema.
>Alles andere ist nicht praxistauglich und unsinnig. Wer mir etwas >anderes beweisen will und kann, möge das tun. Das war jedenfalls mein >letzter Beitrag zu diesem Thema. Setz doch einfach mal für Vin die kleinste und die größte Spannung ein und schau welche Werte du bekommst. Wer so rechnet der Rechnet auch 1+1=3 ;) Aber Nur Ignoranten verschließen die Augen anstatt nur einmal nachzurechnen. '-)
Und ich rechne lieber mit Beispielsweise (64 * ADC addieren (ACHTUNG: OVERSAMPLING!!!) * (Vin * 1000) / 64468. Ist doch nun wirklich wurscht wie jeder rechnet solange der jenige den max. möglichen Wert berechnen kann ohne das es die niedrigeren Stufen total verfälscht. MfG Andi
Ja das es ein Tippfehler ist hab ich mir schon gedacht aber mit dieser Zahl kann ich auch noch nix anfangen egal wie ich rechne.
Es ist eine Art Verschönerung. Beispiel: VinMax = 5V und Vref = 5V. Liegen 5V an Vin, müßte mir der ADC IMMER den Wert 1023 liefern. Bei 64 * 1023 ist der maximale Oversampling-Wert 65472. Dann wäre folgende Berechnung korrekt: 65472 * 5000 / 65472 = 5000 (zur Anzeige dann 5.000). Ist aber nur einer von den 64 ADC-Werten 1 weniger (1022), z. B. wegen Rauschen, dann kommt raus: 65471 * 5000 / 65472 = 5000 (zur Anzeige dann 4.999) Also habe ich den Divisor einfach leicht verringert um diesen Misstand "Auszubügeln": 65471 * 5000 / 65472 = 5000 (.2291 fällt weg wegen integer) Dieses Ausbügeln geht in den µV-Bereich und stört kleinere Werte so gut wie überhaupt nicht. Es soll ja kein Labormessgerät sein. Hallo Hannes! Es tut mir leid, aber ein Oversampling von 64 ADC Werten (64 * 1023) kann immer noch nicht 65536 ergeben ;-) Diese Meinung muß ich mit Ratber wirklich teilen. MfG Andi
Copy->Paste-Fehler :( Sollte heißen: 65471 * 5000 / 65472 = 4999 (zur Anzeige dann 4.999) Ich gibs langsam auf! MfG Andi
Jetzt gib ichs wirklich auf! Die dritte Formel sollte heißen 65471 * 5000 / 65468 = 5000 (.2291 fällt weg wegen integer) Ich muß ja echt doof aussehen! MfG Andi
>Ist aber nur einer von den 64 ADC-Werten 1 weniger (1022), z. B. wegen >Rauschen, dann kommt raus: > > 65471 * 5000 / 65472 = 5000 (zur Anzeige dann 4.999) > >Also habe ich den Divisor einfach leicht verringert um diesen Misstand >"Auszubügeln": ?? Höhrt sich schön an und da könnte ich noch folgen aber was machst du bei 2 oder 3 Fehlwerten ? Entschuldige aber das sieht mir nicht nach Filterung aus sondern nach "Übermalen" Wenn ich einen Wert 64x Messe dann ergibt die Summe durch 64 eben den Durchschnitt. Aber selbst wenn ich das alles hinnehme dann komme ich mit der Differenz von 68 immernoch nicht hin denn abzüglich der 64 bleiben 4 Rest. Sorry aber dieser Rechnung kann ich nun garnicht folgen.
Hoppla,ich hab das Trennen der beiden Antworten vergessen. Ich setz nochmal an: Moment
Hi Andi... <Zitat> Es tut mir leid, aber ein Oversampling von 64 ADC Werten (64 * 1023) kann immer noch nicht 65536 ergeben ;-) </Zitat> Das habe ich auch nie behauptet. Ich habe nur behauptet, dass 64K 65536 entspricht... ;-) Ein anderer Weg zur Korrektur wäre das Addieren des Wertes zum Ergebnis, der einen halben Schritt (also 1/2048 des Messbereiches) entspricht. Das wäre dann korrekte Rundung. Wenn ich aber den "Streubereich" des ADC bei (mit unkonventionellen Mitteln) selbst hergestellten Platinen (die alles andere als optimal sind!) betrachte, dann ist mir der ganze Krams sowiso Wurscht... 8-) @Ratber: Besuch macht immer Freude! (Die Einen beim Kommen, die Anderen beim Gehen...) Oder: Das Leben ist wie eine Brille, man macht so Allerhand durch... @Rinaldo: Du hat nicht auf meinen einzigen konstruktiven Beitrag reagiert: http://www.mikrocontroller.net/forum/read-1-241240.html#241445 Hast du dein Vorhaben nun aufgegeben oder hast du den Beitrag nur übersehen? Beste Grüße und frohen Rest vom Einheitsfest... ...olle HanneS...
Also nochmal in anlehnung an deine Formel "(64 ADC addieren (Vin * 1000) / 64468" Ich rechne jetzt mal Simultan für 1024 und 1023 also 2^n und 2^n-1 um es zu verkürzen und nicht allzu unübersichtlich zu gestalten (Hoffentlich) 64*1023=65472 64*1024=65536 Um, das Mittel zu bekommen muß ich auch wieder durch 64 Teilen (bzw. einfach um 6 Bit schieben) um den einfachen Schnitt zu erhalten. Ausreißer fallen damit nur Prozentual ins Gewicht. Jetzt nurnoch Runden (4/5) und schon habe ich den Schnitt. Jetzt bleicbt nurnoch die Rechnung 1000/65468 bzw. 1000/65472 übrig die mit die Kehrwerte also 0.015273704 bzw. 0.015274637 liefert und genau diese verstehe ich nicht ganz. Dh. du hast es ja schon angegeben das diese Wert die Korrektur bei 4.999 im Ergebnis ist aber den Sinn verstehe ich nicht. Hier machst du für einen von 64 Messwerten mit einer abweichung von 1 eine Ausnahme und verläst die abteilung "Oversampling" wegen diesen einen absichtlichen Eingriff. Was machst du denn wenn 2 oder 3 der 64 Werte um eins Abweichen oder einer um mehr als 1 ? wieder anpassen ? Also entschuldige wenn ich so direkt bin aber das sieht für mich in der Tat nach einfacher Verschönerung aus die mit "Berechnung" nichts zu tun hat. Jedenfalls sehe ich keine logische notwendigkeit darin. @Hannes Ja sicher aber ich seh se dann doch lieber von hinten. Fressen mir nur die Vorräte weg und verursachen Kopfschmerzen :D :D :D
Es hat halt jeder seinen Horizont. Darüber hinweg zu sehen ist halt nicht immer einfach. Es ist einfach so: 1. 64 mal ADCH:L auf eine Variable addieren, Name: Oversampling 2. Mit Oversampling folgendes rechnen: Spannungswert = Oversampling * 5000 / 65468 Als Spannungswert kommt eine Integer-Zahl raus von 0 bis 5000 welche auf einem LCD als 0.000V bis 5.000V dargestellt wird und mit der man auch noch überwachen kann. Schluss, aus, ende. Ansonsten wünsch ich auch noch nen schönen Rest vom Einheitsfest. MfG Andi
Aha du rechnest also den ADC-Wert wieder auf die Spanung zurück. Hättest du das gleich gesagt dann wäre uns viel tipperei erspart geblieben. Also Rechnen wir mal. 64*1023 sind 65472 bzw. 65536 bei 1024. Dann *5000 sind 327'360'000 bzw. 327'680'000 Das ganze dann wieder durch 65468 und für die Darstellung auf dem LCD mit einem Dezimalpunkt und 3 nachkommastellen versehen ergibt dann 5.000 bzw. 5.005 Komisch,wenn ich 2^n-1 also 1023 Rechne dann komme ich Punktgenau hin und mit 2^n also 1024 habe ich einen übertrag von 0.005 oder die besagten rund 0.1% Abweichung. Das ist der Grund warum ich "ADC=(Vin*2^n-1)/Vref" Rechne '-) >Als Spannungswert kommt eine Integer-Zahl raus von 0 bis 5000 welche >auf einem LCD als 0.000V bis 5.000V dargestellt wird und mit der man >auch noch überwachen kann. >Schluss, aus, ende. Yo '-) >Es hat halt jeder seinen Horizont. >Darüber hinweg zu sehen ist halt nicht immer einfach Zustimm '-) >Ansonsten wünsch ich auch noch nen schönen Rest vom Einheitsfest. Wünsche ich auch '-)
@Ratber:
Jetzt muss ich mich doch auch mal meinen Senf dazugegeben.
Es ging um die Formel:
> ADC=(Vin*1024)/Vref
Das steht im Datenblatt, wieso die Formel richtig ist:
0x000 represents ground, and 0x3FF represents the selected reference
voltage minus one LSB.
d.h. 1023 entspricht dem Intervall von [Vref-Vref/1024:Vref)
ich mach das mal für 1 Bit Auflösung (d.h. 2 Werte) und 5V Vref
0: 0V <= Vin < 2,5V
1: 2,5 <= Vin <= 5V
Würde ich wie du es propagierst durch 1 teilen, dann würde man
erhalten
0: 0V <= Vin < 5V
1: 5V
d.h. den letzten Wert verschenkst Du, denn der würde nur bei genau 5V
auftreten.
Dein Problem ist, daß Du immer "andersrum" rechnest, also die Frage
stellst:
Was bekomme ich bei 5V?
Nach Deiner Formel bekommst Du 1, nach der von Atmel aber 2, was Du
natürlich mit 1 Bit nicht darstellen kannst.
Du stellst aber die Frage falsch, denn der ADC gibt nur Intervalle aus.
Und wenn Du in meine erste Tabelle schaust, dann wirst Du sehen das das
letzte Intervall von GENAU 2,5 bis GENAU 5V geht. Rechnerisch (nach der
Formel von Atmel) geht es aber nur von GENAU 2,5 bis <5V, denn GENAU 5V
sind nicht darstellbar. 1 Intervall (entweder das erste oder das
letzte) muss auf GENAU zwei glatten Werten liegen. Im Datenblatt steht,
es wäre das letzte (und zwar in der von mir zitierten Textstelle).
Bei Dir ist das nicht so, daher verschenkst Du ja auch einen Messwert,
denn Du opferst die 1023 für GENAU 5V und nur für GENAU 5V alles was
auch nur 1mV kleiner ist, ist schon 1022.
Ich will mich hier nicht nochmal wiederholen deswegen rechne doch einfach mal mit dieser Formel und sag mir wieviele Werte du bekommst. Das ich meinen Spannungsbereich durch 2^N Teilen muß ist mir schon klar aber meine Werte erhalte ich nur mit 2^n-1 da ich Binär von 0 bis 2^n-1 Arbeiten kann. Warum also nicht gleich in die Foirmel einbringen ? Genauso könnte ich die Formel in Römischen Zahlen darstellen.
>0x3FF represents the selected reference voltage minus one LSB.
Auf deutsch heißt das, 0x3FF ist Vref - Vref/1024.
So kann der ADC dann eigentlich keinen ADC-Wert für Vref (höchst
mögliche Spannung) ausgeben.
Angenommen bei 5V wäre der höchst messbare Wert dann wohl doch 4,995V
und nicht 5V.
Unter diesem Gesichtspunkt gehe ich wohl doch von der 1023´ger-Regel
weg.
Durch 1024 bzw. 65536 zu teilen ist sowieso um ein vielfaches
einfacher.
So, jetzt prügel ich mir noch mal den ADC-Teil ein.
MfG
Andi
Also mal anders: Deine Formel für 2 Bit Auflösung, Vref sei 12V ADC=(Vin*2^2-1)/Vref Du sagst "damit bekomme ich bei ADC-Ausgabe '3' raus, daß Vin = 12V ist". Daraus folgt aber auch, das bei 11,999V der ADC schon '2' liefert, denn auf irgendeine Methode zu runden musst Du dich schon festlegen. Insgesamt folgende Tabelle 12V: 3 11,9999V: 2 11,9V: 2 11V: 2 8V: 2 7,99999V: 1 7,9V: 1 4V: 1 3,99999V: 0 3,9V: 0 0V: 0 Du siehst, du erhälst nur für GENAU 12V deinen letzten möglichen Wert von "3". Daher Du verschenkst echte Auflösung. In der von dir selber erstellen Tabelle mit der Atmel Formel sieht das so aus: 0V ( 0V*4)/12V = 0 1V ( 1V*4)/12V = 0 2V ( 2V*4)/12V = 0 3V ( 3V*4)/12V = 1 4V ( 4V*4)/12V = 1 5V ( 5V*4)/12V = 1 6V ( 6V*4)/12V = 2 7V ( 7V*4)/12V = 2 8V ( 8V*4)/12V = 2 9V ( 9V*4)/12V = 3 10V (10V*4)/12V = 3 11V (11V*4)/12V = 3 12V (12V*4)/12V = 3 (nicht 4, sondern als 3 von Atmel definiert) Du siehst, hier wird nix verschenkt und die Umschalt-Grenzen (da wo der ADC Wert wechselt) sind sogar woanders!
Jetzt noch mal: Was representiert nun der Wert 0x3FF? Vref oder Vref-Vref/1024? Oder anders: Ist der Wert 0x3FF = Vref oder nur Vref/1024*1023? MfG Andi
0x3FF repräsentiert Vref, aber nur weil es von Atmel so definiert wurde. Normalerweise würde er (1023*Vref)/1024 bis KURZ VOR (1024*Vref)/1024 repräsentiern. Es ist aber halt DEFINIERT worden das (1024*Vref)/1024 mit eingeschlossen ist. Es besteht ein Unterschied zwischen (1023*Vref)/1024 <= Vin < (1024*Vref)/1024 und (1023*Vref)/1024 <= Vin <= (1024*Vref)/1024 ^ hier ist der Unterschied
also nochmal, nicht das ich missverstanden werde: Ihr (jeder der sich angesprochen fühlt ;-)) müsst davon weg einen ADC Wert als eine exakte Spannung zu interpretierne so repräsentiert 0x3FF nämlich Vref UND (1023*Vref)/1024. Eben alle Zahlen die in diesem Intervall (=Bereich) liegen mit EXAKT den beiden Zahlen als Grenzen. Bei den anderen Werten z.B. 0x3FE ist das Ende der Grenze NICHT mit drin (das gibts halt nur beim spezialfall 0x3FF). 0x3FE stellt also die Zahlen im Bereich von (1022*Vref)/1024 <= Vin < (1023*Vref)/1024 dar, EXAKT (1023*Vref)/1024 ist also nicht mit drin.
Danke Heiko. Das ist auch genau mein Standpunkt, ich hatte nur keine Ahnung, wie ich das verständlich formulieren soll.
Bitte. Ich hoffe man sieht an den beiden Tabellen besser als an den Aussagen über die Intervalle, daß Ratbers Formel zwar bei 0V und Vref schöne Werte liefert (nämlich 0V und Vref - und zwar auf Kosten der Meßgenauigkeit), aber die Schalt-Grenzen intern ganz woanders liegen. Ich denke Ratbers Formel ist so attraktiv, weil sie einem scheinbar die Interpretation der Atmel Formel abnimmt. Rechnerisch kommt ja bei Atmel immer die untere Grenze des Intervalls (in welchem der Meßwert wirklich liegt) raus, was natürlich bei 0x3FF erstmal komisch aussieht, da man hier intuitiv Vref erwartet.
Kann man dann zusammenfassend sagen: 1. Die Spannung (Vref) wird, bei 10 Bit, in 1024 Teile zerlegt. 2. 0x000 = GND bis knapp unter 1/1024 Vref 3. 0x3FF = 1023/Vref bis Vref Bei 0x3FF ist das dann reine Interpretationssache ob man Vref oder knapp über 1023/1024 Vref darstellt. Habe ich das richtig verstanden? Gibt es bei einem Wert 1023 eine Möglichkeit festzustellen, ob es Vref ist oder knapp über 1023/1024 Vref (Oversampling)? MfG Andi
Ui,ih seid ja noch drann. Ich hab für Heute schon genug und meld mich morgen nochmal. Guts Nächtle.
Am logischsten wäre die Interpretation: Vin = [(2*ADC+1)/2^(n+1) +- 1/2^(n+1)] * Vref D.h. bei dem 10bit ADC entsprich 0x000 = (1/2048 +- 1/2048) * Vref und 0x3FF entspricht (2047/2048 +- 1/2048) * Vref. Da der ADC nunmal nur Intervalle misst, bekommt man so genau den mittleren Wert des Intervalls. Durch Oversampling kann man den Wert dann noch genauer eingrenzen, da das letzte Bit immer etwas springen wird, das ändert aber nichts an der Tatsache, dass man immernoch einen Fehler von min. +- 1/2048 * Vref hat.
@Ratber: Muß mich noch für diese Idee mit Oversampling eine höhere "Messauflösung" erzielt zu haben entschuldigen. Totaler Quark. Ich hatte für eine LCD-Beleuchtung über einen 1K-Widerstand an die Basis eines Leistungstransistors BD243 einen Stromfluß von abwechselnd 0 und ca. 5mA über PWM bei 1243Hz. Ohne es zu wissen, hatte dieses im AVR ein Spannungsrauschen verursacht und mich dann mit meiner falschen Meinung bestärkt in Schritten von 0,01° (10000 Stufen) die Temperatur messen zu können. Nach dem ich den Widerstand durch einen mit 10K gewechselt hatte konnte man zwar beobachten wie die Temperartur binnen Sekunden von Beispielsweise 24,11 auf 24,21° ging aber es blieb nie dazwischen stehen. Man könnte die 2. Kommastelle vielleicht als steigend oder fallend interpretieren, solange der NTC sich nicht richtig entscheiden kann, wie er sich nun einstellt, aber ansonsten Schwachsinn. Sorry für die unnötigen Posts hier. MfG Andi
@Andreas Spitze von Dir, dass Du das noch aufklärst. Das sollten sich viele als Beispiel nehmen (bezieht sich auf niemanden aus diesem Thread). Das kann nicht jeder, einen Irrtum eingestehen. Super, bleib so. Grüße Quark
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.