Hallo Leute, ich muss durch Oversampling meinen 10bit ADWandler auf 12bit erhöhen,um die Genaugigkeit zu verbessern. Das Prinzip hab ich grob verstanden,bloß ich bin einfach nicht in der Lage dies auf Atmel umzusetzen. Programmieren ist grade nicht meine Stärke... 1AD-Wert macht schon einen Höhenunterschied von 10m --> Professor will es auf 2,5m haben) ich hoffe es kann mir wer da behilflich sein :)
Diri schrieb: > ich muss durch Oversampling meinen 10bit ADWandler auf 12bit erhöhen,um > die Genaugigkeit zu verbessern. Das geht nicht. Du kannst zwar die Auflösung auf 12 Bit steigern, nicht aber die Genauigkeit. https://www.mikrocontroller.net/articles/Aufl%C3%B6sung_und_Genauigkeit
Schau mal hier, wird zwar nicht genauer, ist aber vielleicht das was du suchst. Beitrag "ADC und Fixed-Point Arithmetik" Gruß Frank aus Köln
Moin, Mich beschleichen da zwar leichte Zweifel, ob das dann so klappt, wie du's gerne haettest, aber der simpelste Weg waere wohl: Du nimmst je 4 Samples à 10bit und summierst die auf zu einem 12bit Wert. Fertsch. "Schoener" gehts auch, wenn man dann eben mehr als 4 Samples nimmt und die dann auch "schoener" (als mit einem FIR mit Koeffizienten [1,1,1,1]) tiefpassfiltert. Gruss WK
https://www.sparkfun.com/datasheets/Components/General/BST-BMP085-DS000-05.pdf nim doch einfach diesen Sensor.
Das ist deine AppNote: AVR121: Enhancing ADC resolution by oversampling
Burgas schrieb: > Das ist deine AppNote: AVR121: Enhancing ADC resolution by oversampling Ja, da steht auch "resolution" und nicht "accuracy".
ich schätz dann mal er will eine höhere Auflösung ^^ an den Bauteilen darf ich nichts ändern , es muss durch Oversampling gelöst werden
uint16_t getAdcValue (void) { uint16_t AvgCount = 0; uint32_t AvgSum = 0; for (AvgCount = 0; AvgCount < 256; AvgCount ++) { ADCSRA |= (1 << ADSC); // AD Wandler starten while (ADCSRA & (1 << ADSC)); // AD Wandlung fertig ? AvgSum += ADC; // Mittelwert über 256 Messungen } return (AvgSum >> 6); // Oversampling 12 BIT } brauch ich dann das hier ??
Ja, das ist Dein gewünschtes Oversampling. Du kannst dann noch die linearen Fehler rausrechnen wenn Du die Offset und Gain korrektur durchführst. Steht oben im #define. Dann kann dir auch die meist falsche interne Referenz egal sein. Gruß Frank aus Köln
Diri schrieb: > ich schätz dann mal er will eine höhere Auflösung Gespaltene Persönlichkeit ? Diri schrieb: > an den Bauteilen darf ich nichts ändern Ohne ausreichendes Rauschen wird das aber nichts.
Harald W. schrieb: > Ja, da steht auch "resolution" und nicht "accuracy". Vielleicht mal mehr als die Überschrift lesen: "In most cases 10-bit resolution is sufficient, but in some cases higher accuracy is desired." Bei einem mit symetrischen Fehler behafteten Signal kann man sehr wohl die Genauigkeit durch Oversampeling erhöhen. Harald W. schrieb: > Das geht nicht. Du kannst zwar die Auflösung auf 12 Bit steigern, > nicht aber die Genauigkeit. Wie hoch die Genauigkeit ist, kannst du nicht beurteilen. Wenn das Signal auf 14 bit genau ist, wird durch Oversempeling das Signal auch genauer. Typisches mikrocontroller.net Bla Bla...
Diri schrieb: > 1AD-Wert macht schon einen Höhenunterschied von 10m > --> Professor will es auf 2,5m haben) Was für einen Sensor benutzt du da? Der ADC wird doch sicher mit irgendetwas elektrischem gefüttert.
Wolfgang schrieb: > Was für einen Sensor benutzt du da? > Der ADC wird doch sicher mit irgendetwas elektrischem gefüttert. einen MPXHZ6115A6u
Erfahrungsgemäß ist der interne ADC der AVR µC deutlich besser als im Datenblatt steht, und das selbst bei höheren ADC-Frequenzen als 500kHz noch. Das klappt so schon ganz gut. Wenn hohe Samplingraten gefordert sind, sollte man gucken dass man den FIR-Filter mit Potenzen von 2 aufbaut, dann kann man auf kostspielige Divisionen verzichten. Matlab hilft.
Dergute W. schrieb: > Du nimmst je 4 Samples à 10bit und summierst die auf zu einem 12bit > Wert. Fertsch. Nee, da kommt auch bloß Mist raus. Ich hatte das so gemacht, daß ich auf das Meßsignal einen winzigen Sägezahn draufmoduliert hab und dann so über 128 Samples oder mehr gemittelt habe. Man braucht dazu nur ein Portbein, einen C und 2 Widerstände. Ja, das gibt mehr Auflösung, aber keinesfalls mehr an Genauigkeit. Ist aleo eher was für's Auge... W.S.
MaWin schrieb: > Ohne ausreichendes Rauschen wird das aber nichts. Meist ist schon in der Signalquelle genug Rauschen...
Harald W. schrieb: > Burgas schrieb: > >> Das ist deine AppNote: AVR121: Enhancing ADC resolution by oversampling > > Ja, da steht auch "resolution" und nicht "accuracy". Harald, die Wahrscheinlichkeit, dass du diese AppNote gelesen hast, setzte ich mit Null an.
Diri schrieb: > Wolfgang schrieb: >> Was für einen Sensor benutzt du da? >> Der ADC wird doch sicher mit irgendetwas elektrischem gefüttert. > > einen MPXHZ6115A6u Da habe ich ja meine Zweifel, ob 12 Bit für diesen hochwertigen Druckaufnehmer genug sind. Der hat schließlich eine Genauigkeit von +/- 1,5%. Dagegen sieht jede Küchenwaage blass aus.
Danke an alle für eure Hilfe :) ich schau morgen dann mal ob ichs irgendwie hinkrieg^^
MaWin schrieb: > Ohne ausreichendes Rauschen wird das aber nichts. Das ist vollkommen korrekt und diese Erfordernis wird oft massiv unterschätzt (nicht zuletzt von diversen Regulars dieses Forums). Einige dieser Lichtgestalten haben sogar richtige "Versuchsreihen" geposteted, die ihrer Meinung nach bewiesen haben, das die Erhöhung der Auflösung garnicht funktioniert, dass die entsprechende Atmel-AN also kompletter Bullshit ist. Dabei haben sie eigentlich nur bewiesen, dass sie keine Ahnung von Mathematik haben. Oder zumindest keine Ahnung von analoger Hardware... Es ist nämlich überaus leicht, den AD-Wandler selber genügend Rauschen produzieren zu lassen. Und das wirkt sich dann sogar noch in anderer Richtung günstig aus... Man muss Datenblätter eben nicht nur lesen und sträflich umsetzen können, sondern manchmal auch einfach verstehen und fantasievoll umsetzen. Vorgefertigte C-Libs sind hier nicht unbedingt als Katalysator für die Gewinnung neuer Erkenntnisse geeignet. Nichtmal dann, wenn sie aus eigener Feder stammen und nicht per C&P beschafft wurden, was ich o.g. Personenkreis durchaus zugestehen würde, der überwiegenden Mehrheit der C-User allerdings erfahrungsgemäß nicht. Für beide aber gilt gleichermaßen: Sie glauben ganz fest: Es gibt nix, was meine einmal fertige, portable, was auch immer Lib nicht kann... [EDIT Moderator: Beleidigung gelöscht]
:
Bearbeitet durch Moderator
Nimm doch einfach die Random-Funktion des Compilers, um Dir noch 2 Bits in die Tasche zu lügen. Das macht überhaupt keinen Unterschied. Ich hatte früher auch mal überlegt, mit der PWM ein Dreiecksignal auf den Eingang zu modulieren, um mehr Bits rauszukitzeln. Aber einen SPI-ADC mit der gewünschten Auflöung zu nehmen, ist einfacher und außerdem funktioniert es.
@peda Darf er ja nicht, sonst könnter er ja auch den BMP nehmen Gruß Frank aus Köln
Also eine Analogschaltung die sooo gut ist, das aus einem 10 Bit ADC auch wirklich 10 verwertbare Bits raus kommen ist schon eine Herausforderung. Wahrscheinlich sind auf der Platine nur 8 Bits repräsentativ für den Analogwert und die letzten beiden Bits einfach nur Müll. Alles was da rüber hinausgeht wird wirklich sehr aufwändig. Wenn man das dann mit Oversampling hochrechnet gibt das halt 9 Bit Nutzwert und 3 Bit Müll. Aus Scheiße lässt sich halt kein Gold machen, egal wie viel man rechnet. Da hilft nur die richtige Hardware zu verwenden.
Ralph schrieb: > Also eine Analogschaltung die sooo gut ist, das aus einem 10 Bit ADC > auch wirklich 10 verwertbare Bits raus kommen ist schon eine > Herausforderung. > > Wahrscheinlich sind auf der Platine nur 8 Bits repräsentativ für den > Analogwert und die letzten beiden Bits einfach nur Müll. > Alles was da rüber hinausgeht wird wirklich sehr aufwändig. > > Wenn man das dann mit Oversampling hochrechnet gibt das halt 9 Bit > Nutzwert und 3 Bit Müll. > > Aus Scheiße lässt sich halt kein Gold machen, egal wie viel man rechnet. > > Da hilft nur die richtige Hardware zu verwenden. Du reihst Behauptung an Behauptung - nur allein sehe ich weder einen Beleg noch einen Beweis für diese. Sei doch bitte so lieb und reiche beides nach. Ansonsten: Wie sagt es der Pinguin so schön: Wenn man keine Ahnung hat ...
Burgas schrieb: >>> Das ist deine AppNote: AVR121: Enhancing ADC resolution by oversampling >> >> Ja, da steht auch "resolution" und nicht "accuracy". > > Harald, die Wahrscheinlichkeit, dass du diese AppNote gelesen hast, > setzte ich mit Null an. Ich hab mich nur auf die Überschrift bezogen, habe aber selbst schon Oversampling benutzt. Allerdings nicht, um die Genauigkeit zu steigern, sondern um mir ein Antialiasingfilter zu ersparen.
Ich empfehle Abbildung 8 in diesem Datenblatt http://www.nxp.com/files/sensors/doc/data_sheet/MPXA6115A.pdf Der Fehler des Sensor ist Rechteck verteilt und hat +-1,5 KPa Bei 15 kPa also sogar 10% Fehler. Bei 115 kPa immerhion noch 1%. Selbst wenn du 10 Bit Auflösung hast mach das dein Messergbniss nicht besser. Alle Stellen die durch eine hohe Auflösung bekommst sind NICHT SIGNIFIKANT! Sie sehen zwar gut aus sind aber Wertlos!
Diri schrieb: > ich muss durch Oversampling meinen 10bit ADWandler auf 12bit erhöhen,um > die Genaugigkeit zu verbessern. So ziemlich alle Leser Deines Beitrages sind sich (hoffentlich) einig, dass Du die Genauigkeit nicht verbessern kannst. > Das Prinzip hab ich grob verstanden, Scheinbar nicht, sonst könntest Du GENAUIGKEIT und AUFLÖSUNG unterscheiden. > 1AD-Wert macht schon einen Höhenunterschied von 10m > --> Professor will es auf 2,5m haben) Zeige bitte die Aufgabe im originalen Wortlaut und den dazu gehörigen Schaltplan.
Ohne Rauschen geht es nicht! Das steht auch in der App-Note. Kleines (Gedanken)experiment: Wenn kein Rauschen vorhanden ist, nimm mal immer nur die ersten n Bit und betreibe damit Oversampling. Was du dann ausrechnest vergleichst du mit dem Messergebnis mit voller Bitzahl. Besonders anschaulich wird es, wenn man nur wenige Bit nimmt, n also klein ist. Ohne Rauschen bleiben die ersten n Bit stabil. Man erhält also immer die identischen Werte für diese ersten n Bits, egal wie oft man die Messung durchführt. Da ist es dann egal wie oft am "oversampled". Der Informationsgewinn ist "NULL"! Man kann daraus keine Schlüsse ziehen wie das nächste Bit aussieht. Ob ich nun das ganze mit nur den ersten n Bit, oder mit den ganzen 10 Bit veranstalte, ändert nichts am Prinzip. Ich habe nur ein kleines n vorgeschlagen, damit es anschaulicher wird und damit man Bit n+1 noch real messen kann um es mit dem Oversamplingergebnis vergleichen kann. Ferner reicht nicht irgendein Rauschen. Es muß bestimmte Anforderungen erfüllen. Aber bislang haben wir noch gar kein Rauschen, zumindest ist es bislang noch nicht erwähnt worden beim Versuchsobjekt. Welcher AVR genau wird eingesetzt? Manche haben die Möglichkeit das Signal zu verstärken um so lokal für einen Ausschnitt des Wertebereichs eine höhere Auflösung zu erzielen. Je nach Aufbau hat man ja auch nicht das volle Spektrum, sondern das Signal wird in einem bestimmten Bereich liegen.
:
Bearbeitet durch User
c-hater schrieb: > MaWin schrieb: > >> Ohne ausreichendes Rauschen wird das aber nichts. > > Das ist vollkommen korrekt > [...] > [zig weitere Zeilen Einleitung] > [mit den obligatorischen Seitenhieben] > [...] > [EDIT Moderator: Beleidigung gelöscht] Warum hörst Du nach der Einleitung auf? Ich dachte Jetzt kommt der Hauptteil in dem Du erklärst wie man mit phantasievollem Umgang mit dem Datenblatt dem ADC beibringt aus sich heraus ein geeignetes Rauschen mit geeigneter Amplitude und Verteilung zu produzieren?
:
Bearbeitet durch Moderator
Benedikt S. schrieb: > Ich empfehle Abbildung 8 in diesem Datenblatt > > http://www.nxp.com/files/sensors/doc/data_sheet/MPXA6115A.pdf > > Der Fehler des Sensor ist Rechteck verteilt und hat +-1,5 KPa > Bei 15 kPa also sogar 10% Fehler. > Bei 115 kPa immerhion noch 1%. > > Selbst wenn du 10 Bit Auflösung hast mach das dein Messergbniss nicht > besser. Alle Stellen die durch eine hohe Auflösung bekommst sind NICHT > SIGNIFIKANT! Sie sehen zwar gut aus sind aber Wertlos! Üblicher weise wird der Fehler immer auf den Nennwert des Aufnehmers bezogen, und nicht auf den Istwert. Ferner ist die Aussage ob es SIGNIFIKANT ist oder nicht nicht durch dich zu entscheiden. Wenn für die Ergebnisse z.B. nur die relative Änderung maßgebend ist, der Fehler des Sensors aber z.B. nur ein Offset ist, dann kann dass Ergebnis besser werden. Weiterhin besteht die Möglichkeit den Sensor einzumessen und so die Genauigkeit zu verbessern. Wichtiger als die Angabe einer absoluten Genauigkeit ist für die meisten Aufgaben die Wiederholbarkeit.
>So ziemlich alle Leser Deines Beitrages sind sich (hoffentlich) einig, >dass Du die Genauigkeit nicht verbessern kannst. Ich nicht. Definiere doch mal "Genauigkeit" eines AD-Wandlers. Kann die Genauigkeit höher als die Auflösung ( Quantisierungsfehler ) sein? Falls nein: Könnte die Genauigkeit steigen, wenn die Auflösung steigt?
Also zu meinem Problem nochmal: Wenn ich mit meiner Platine (+Drucksensor) 1 m hochgehe ,ändert sich der AD-Wert um 1.1 , was einen Höhenunterschied von ca.10m beträgt und das reicht meinen Professor nicht aus ist ihm zu viel er meint wenn ich Oversampling nutze ,würde die Höhe sich dann um 2.5m Unterscheiden statt den vorherigen 10m microcontroller--Atmega48PA Ich hoffe es ist jetzt etwas klarer geworden was gefragt ist habt bissle Rücksicht bin was Programmieren/Digitaltechnik noch relativ am anfang..^^
"Dann gib dem Kaiser, was des Kaisers ist." Oder für Ungläubige: gehorche Deinem Professor und mache, was er sagt. Schwachsinn ist es allemal.
@ Diri (Gast) >Wenn ich mit meiner Platine (+Drucksensor) 1 m hochgehe ,ändert sich der >AD-Wert um 1.1 , Kaum, denn der AD-Wandler liefert Integerzahlen, keine Fließkommazahlen. Außerdem, wenn du nur um 1m die Höhe des Sensor veränderst, wieso sollte das dann 10m Höhenunterschied entsprechen? > was einen Höhenunterschied von ca.10m beträgt >und das reicht meinen Professor nicht aus ist ihm zu viel ??? Zuviel? >er meint wenn ich Oversampling nutze ,würde die Höhe sich dann um 2.5m >Unterscheiden statt den vorherigen 10m Also will er mehr AUFLÖSUNG! Nicht GENAUIGKEIT! >Ich hoffe es ist jetzt etwas klarer geworden was gefragt ist >habt bissle Rücksicht bin was Programmieren/Digitaltechnik noch relativ >am anfang..^^ Was dich aber nicht von der Pflicht entbindet, die Netiquette zu berücksichtigen.
:
Bearbeitet durch User
Diri schrieb: > Wenn ich mit meiner Platine (+Drucksensor) 1 m hochgehe ,ändert sich der > AD-Wert um 1.1 , was einen Höhenunterschied von ca.10m beträgt Du hast einen Rechenfehler im Programm. Der könnte aber auch auf einem vorausgehenden Denkfehler basieren... Ähmmm, nachgeschaut: es ist beides zusammen und dazu noch ein Programmierfehler. Du solltest deine Umrechnung unbedingt nochmal ansehen:
1 | lcd_putc(i/100 + 0x30); // Hunderter ausgeben (°C Zehner) |
2 | i = i%100; |
3 | lcd_putc(i/10 + 0x30); // Zehner ausgeben (°C Einer) |
4 | |
5 | lcd_putc(i%10 + 0x30); |
6 | lcd_putc(0x2E); |
7 | lcd_putc(i%10 + 0x30); |
>>> 1AD-Wert macht schon einen Höhenunterschied von 10m
Was ist hier "1 AD-Wert"?
BTW:
ad_wert1 = ADCL + (ADCH<<8); // 10-Bit-Wert berechnen
Lass das doch den Compiler machen, der kann das schon:
ad_wert1 = ADC;
:
Bearbeitet durch Moderator
Diri schrieb: > er meint wenn ich Oversampling nutze ,würde die Höhe sich dann um 2.5m > Unterscheiden statt den vorherigen 10m Es ist aber gut möglich, das meim nächsten sampeln der Wert auf einmal 10...15m danebenliegt, ohne das Du die Höhe geändert hast. Deine ganze Messeinrichtung ist vermutlich für eine präzise Höhenmessung viel zu ungenau.
Lothar M. schrieb: > Ähmmm, nachgeschaut: es ist beides zusammen und dazu noch ein > Programmierfehler. Du solltest deine Umrechnung unbedingt nochmal > ansehen: lcd_putc(i/100 + 0x30); // Hunderter ausgeben (°C Zehner) > i = i%100; > lcd_putc(i/10 + 0x30); // Zehner ausgeben (°C Einer) > > lcd_putc(i%10 + 0x30); > lcd_putc(0x2E); > lcd_putc(i%10 + 0x30); > ja seh grad das meine Nachkommastelle falsch ist
Diri schrieb: > 1AD-Wert macht schon einen Höhenunterschied von 10m > --> Professor will es auf 2,5m haben) Ich hoffe mal, dass es ums Prinzip geht und nicht darum, eine Höhenmessung mit besser als 10m Auflösung zu machen. Sonst würde ich auch den Weg von Peter empfehlen und mal über die Bauteile nachdenken. Mit einem BMP280 oder besser noch MS5611 wäre man mindestens einen Faktor 5 besser, als der Professor möchte. Intern verwenden die auch mehr oder weniger kräftiges Oversampling. Peter D. schrieb: > Aber einen SPI-ADC mit der gewünschten Auflöung zu nehmen, ist einfacher > und außerdem funktioniert es.
chris_ schrieb: > Definiere doch mal "Genauigkeit" eines AD-Wandlers. Kann die Genauigkeit > höher als die Auflösung ( Quantisierungsfehler ) sein? Nanana.. Also, die Genauigkeit eines ADC kann tatsächlich deutlich höher sein als dessen Auflösung. Stell dir dafür (Gedankenexperiment) einen 1 Bit ADC vor, Eingangs-Spannungsbereich von 0 bis 5 Volt. Man kann dafür ein TTL-Gatter nehmen oder einen Präzisions-Komparator. Beim TTL-Gatter ist uns allen klar, daß dessen Schaltschwelle irgendwo im verbotenen Bereich liegt, also gerade ausreichend um sagen zu können "Eingang ist etwa 0 Volt oder etwa 5 Volt". Aber beim Komparator kann die Präzision der Schaltschwelle bedeutend besser sein als die lumpige Auflösung von nur 1 Bit. Da kann man bei geeignetem Komparator durchaus sagen "Eingang ist kleiner als 2.49 Volt oder eben nicht". ABER: Wer als Hersteller eine Technologie beherrschen würde, die deutlich mehr Genauigkeit als die vorgesehene Auflösung bringen würde, der würde seine Auflösung erhöhen, solange bis er grad noch so "no missing codes" behaupten kann. Fazit: Man findet ganz gewiß keinen ADC, der 12 bit genau ist aber nur 10 Bit liefert. Das wäre seitens des Herstellers rausgeschmissener Fertigungsaufwand. Was also kann man mit einem aufgeprägten Sägezahn oder Rauschen erzielen? Man kann die Übertragungskurve zwischen den 10 Bit des Wandlers auffüllen mit Zwischenwerten, die die Auflösung tatsächlich erhöhen. Aber das ist dann keine Gerade mehr, sondern ein eher unregelmäßig eckiger Verlauf, weil eben die Schaltschwellen des ADC nicht mehr hergeben und ihrerseits NICHT auf einer wirklichen Geraden liegen. W.S.
W.S. schrieb: > Fazit: Man findet ganz gewiß keinen ADC, der 12 bit genau ist aber nur > 10 Bit liefert. Das wäre seitens des Herstellers rausgeschmissener > Fertigungsaufwand. Der Fertigungsprozeß ist relativ unabhängig davon, was man für eine Schaltung damit baut, insbesondere wieviel Bit sie am Ende ausgeben soll. Einen besonders schlechten Analogteil zu fertigen, bloß um ihn einer niedrigen digitalen Auflösung der Schaltung anzupassen, halte ich für wenig plausibel.
>Fazit: Man findet ganz gewiß keinen ADC, der 12 bit genau ist aber nur >10 Bit liefert. Das wäre seitens des Herstellers rausgeschmissener >Fertigungsaufwand. Mittle doch mal eine Stunde lang das Signal des Drucksensors und schaue, ob Du einen Höhenunterschied genauer als die Angesprochenen 10m detektieren kannst ( falls Du es schaffst, den Luftdruck während den Messungen konstant zu halten )
W.S. schrieb: > Fazit: Man findet ganz gewiß keinen ADC, der 12 bit genau ist aber nur > 10 Bit liefert. Das umgekehrte dagegen findet man deutlich häufiger. :-)
Man könnte versuchen, mit dem internen Komparator und etwas Hühnerfutter einen Dual-Slope-ADC zu programmieren. Damit erreicht man deutlich höhere Auflösungen.
batman schrieb: > Einen besonders schlechten Analogteil zu fertigen, bloß um ihn > einer niedrigen digitalen Auflösung der Schaltung anzupassen, halte ich > für wenig plausibel. Um so plausibler ist es, dass beim Fertigungsprozess unterschiedlich gute Wandler raus kommen und dass sie dann den Stempel je nach Güte bekommen.
Aha und dann? Werden die Chips nach Güte belabelt, z.B. als "Atmega8-super", "Atmega8-standard", "Atmega8-economy"?
>Man könnte versuchen, mit dem internen Komparator und etwas Hühnerfutter >einen Dual-Slope-ADC zu programmieren. Damit erreicht man deutlich >höhere Auflösungen. Der Parallax Propeller macht mit drei normalen Digital IOs einen ADC mit 14Bit Auflösung: https://www.parallax.com/sites/default/files/downloads/AN008-SigmaDeltaADC-v1.0.pdf Eigentlich wollte ich das Prinzip schon immer mal auf einem AVR mit seinem Comparator probieren, aber leider kam ich nie dazu ...
Peter D. schrieb: > einen Dual-Slope-ADC zu programmieren. Halte ich für Quatsch, denn guck mal was die meisten Anfragenden hier in diesem Forum so für Fragen stellen. Selbst wenn einer nur 3 LED's in Abhängigkeit von seiner Batteriespannung leuchten lassen will, hat er Probleme mit seiner main(). Ach nö, für einen guten DualSlope-ADC und den auch noch in Software würde es ne Kombination von HW-Verständnis und Programmierfähigkeiten brauchen. Aber da kenne ich jemanden, der mal behauptet hatte, daß sein ATtiny oder so ähnlich nur deshalb so gut funktionieren würde, weil er das Abtasttheorem nicht kennt. Gelle? Abgesehen davon dürfte heutzutage SigmaDelta wesentlich eher angesagt sein. Sowas gibt's in Form kleiner Achtbeiner mit weniger als 1 mA Gesamtstromaufnahme und 20 Bit, von denen man mindestens 17 Bit gebrauchen kann. Da lohnt sich ein DualSlope in Software nicht mehr wirklich. Guck dir mal an, was die Leute von Freescale bei ihren Kinetis für Kopfstände anstellen, um ihre internen 16 Bit DualSlope-ADC's zum benutzbaren Laufen zu bringen. Nee, wer sich das freiwillig antut, hat's verdient... W.S.
>Aber da kenne ich jemanden, der >mal behauptet hatte, daß sein ATtiny oder so ähnlich nur deshalb so gut >funktionieren würde, weil er das Abtasttheorem nicht kennt. Gelle? Ah, Du spielst auf den Thread an, in dem Du das Problem nicht verstanden hattest: Beitrag "Re: Nicht-Sinus DDS"
W.S. schrieb: > Fazit: Man findet ganz gewiß keinen ADC, der 12 bit genau ist aber nur > 10 Bit liefert. Das wäre seitens des Herstellers rausgeschmissener > Fertigungsaufwand. Das ist richtig. Aber genauso richtig ist: man findet ganz sicher AD-Wandler, die nur auf 10 Bit genau sind und deshalb auch nur 10 Bit liefern, aber eine Auflösung von 12 Bit liefern können (wenn man genug Zeit für die Messung hat). Genau das ist der springende Punkt, den die ganzen Blindflansche einfach nicht verstehen... Ich versuche mal, das an einem Beipiel darzustellen. Sagen wir mal, es geht darum, einen bestimmten typischen Punkt im Verlauf der Ladespannungskurve des Ladeprozesses eines Akkus möglichst genau zu bestimmen. Die absolute Spannung, an der dieser Punkt auftritt, ist wohlgemerkt nicht bekannt! Weil sie z.B. von der (eventuell nicht messbaren) Innentemperatur des Akkus abhängt, dem Alterungszustand seiner Elektroden und was weiss ich noch für Parametern. Für diese Aufgabe kann man natürlich einen AD-Wandler entsprechend hoher Genauigkeit einsetzen. *ABER*: (und das ist genau der Punkt) man muss es nicht! Es genügt auch einer, der mit den Tricks der Wissenden nur eine hinreichend hohe Auflösung liefern kann. Denn wie bereits aus der Aufgabe bekannt, ist die absolute Größe hier ziemlich irrelevant, es kommt nur auf die korrekte Bewertung des (relativen) Verlaufs der Kurve an. Sprich: Das System ist in der Lage, den Ladestrom bei der bestmöglichen Spannung korrekt anzupassen. Es könnte allerdings nur mit der tatsächlichen Genauigkeit des AD-Wandlers angeben, bei welcher Spannung es das getan hat. Aber das interessiert ja auch niemanden wirklich! Begreifst du jetzt in etwa, worum es geht?
Frank aus Köln schrieb: > Schau mal hier, wird zwar nicht genauer, ist aber vielleicht das > was du > suchst. > Beitrag "ADC und Fixed-Point Arithmetik" > > Gruß > > Frank aus Köln lol die Appnote. Lamentiert rum von wegen: "Mitteln mehrere Messungen erhöht nicht die Auflösung, es sei denn die Anzahl ist 4^n (n:=Anzahl extra Bits) und man führt einen entsprechenden Rechtsshift aus". Ja ne is klar. Außerdem: Oversampling verbessert die Genauigkeit. Genauigkeit wird als Messunsicherheit ausgedrückt. Diese kann in eine stochastische und in eine systematische Abweichung unterteilt werden. Die stochastische ergibt sich aus stdev(x)/sqrt(N). Ist ja auch logisch: Das Rauschen wird verringert -> höhere Präzision -> höhere Genauigkeit bei gleicher systematischer Abweichung. Auch müsste man laut der Appnote extra Rauschen einfügen, falls keins vorhanden ist. Kann das jemand erklären? :D
manmanman schrieb: > Auch müsste man laut der Appnote extra Rauschen einfügen, falls keins > vorhanden ist. Kann das jemand erklären? :D Ja, guck dir mal Temperaturwerte von einem DS18B20 an. Trotz beliebigem Oversampling bekommst du bei einer langsam steigenden Temperatur keinen stufenlosen Temperaturverlauf gemessen, weil dem Sensor das Rauschen fehlt. Beitrag "Re: DS18S20 One Wire Temperatur Sensor mit 16 Bit -> ich brauch aber nur 10 Bit"
>Außerdem: Oversampling verbessert die Genauigkeit.
Der akademischen Korrektheit geschuldet: Es gibt schon gewisse
Voraussetzungen an den Zufallsprozess. Das Rauschen das Rauschsignal
muss statistisch unabhängig vom Messprozess sein. Wenn z.B. irgend ein
Anteil mit der Abtastfrequenz des ADC oder irgendwie sonst mit der
Taktfrequenz der MCU korreliert ist, mittelt es sich nicht weg.
Die Störstrahlung der CPU ist schon erlaubt. Geht ja nur drum, dass das letzte Bit des ADC Messergebnisses hin und her toggelt, sodass man bei der Mittelwertbildung den Zwischenwert erhält. Da ist in der Appnote ja sogar ne schöne Visualisierung zu drin. Erfahrungsgemäß braucht man kein Rauschen hinzu zu fügen. Bei 1MHz ADC Takt macht das LSB schönes Dithering. @manmanman: Der Zweck ist Dithering. Da hab ich schon nen 256 Byte Ringpuffer gebaut und da mal mit verschiedenen FIR Filtern ausprobiert was so rauskommt. Ich glaube am Ende blieb ein mittelsymmetrischer FIR mit 7 Taps und Faktoren in Zweierpotenzen übrig. Durch Zusammenklappen in der Mitte ließ sich das zu 4 Taps zusammenschrumpfen die allesamt nur noch aus Bitshift und Addition bestanden, gefolgt von einer einzelnen Bitshiftoperation ganz am Ende, die die kostspielige Division ersetzt. Das ging alles ganz wunderbar, minimale Aussenbeschaltung vom µC (nur ein Tiefpassfilter zwecks Antialiasing).
@ Sascha (Gast) >Die Störstrahlung der CPU ist schon erlaubt. Nö. >Geht ja nur drum, dass das letzte Bit des ADC Messergebnisses hin und >her toggelt, sodass man bei der Mittelwertbildung den Zwischenwert >erhält. >Da ist in der Appnote ja sogar ne schöne Visualisierung zu drin. >Erfahrungsgemäß braucht man kein Rauschen hinzu zu fügen. Bei 1MHz ADC >Takt macht das LSB schönes Dithering. Und schon wieder lehnst du dich viel zu weit aus dem Fenster und trompetest Unsinn herum. Gratulation! Der chris_ hat es richtig beschrieben!!!
Eine andere Möglichkeit wäre ein SAR-Wandler mit dem Komparator, 2 gleichen Kondensatoren und 4 Analogschaltern (1*74HC4066).
@Peter Dannegger (peda) >Eine andere Möglichkeit wäre ein SAR-Wandler mit dem Komparator, 2 >gleichen Kondensatoren und 4 Analogschaltern (1*74HC4066). Wollen wir nicht auch noch gleich unsere Transistoren selber feilen? So ein Quark. Die Zeiten der selbstgestrickten ADCs sind lange vorbei. Heute gibt es TONNENWEISE gute und sehr gute ADCs zum TOP-Preis, wie man sie selber/diskret nie hinbekommt. Die nimmt man und ist fertig. Alles andere sind nur nette Spielereien und Prinzipdemonstrationen.
Sascha schrieb: > Erfahrungsgemäß braucht man kein Rauschen hinzu zu fügen. Dann hast du wohl andere Erfahrungen gemacht Tom schrieb: > Ja, guck dir mal Temperaturwerte von einem DS18B20 an.
Falk B. schrieb: > @ Sascha (Gast) > >>Die Störstrahlung der CPU ist schon erlaubt. > > Nö. > >>Geht ja nur drum, dass das letzte Bit des ADC Messergebnisses hin und >>her toggelt, sodass man bei der Mittelwertbildung den Zwischenwert >>erhält. > >>Da ist in der Appnote ja sogar ne schöne Visualisierung zu drin. > >>Erfahrungsgemäß braucht man kein Rauschen hinzu zu fügen. Bei 1MHz ADC >>Takt macht das LSB schönes Dithering. > > Und schon wieder lehnst du dich viel zu weit aus dem Fenster und > trompetest Unsinn herum. Gratulation! > > Der chris_ hat es richtig beschrieben!!! Ich sag meiner Schaltung nicht dass sie nicht funktionieren kann, wenn du es nicht tust. Deal? Was sagst du, Randall? Ah! https://xkcd.com/386/ Hey Terry, altes Ofenrohr! Wie gehts? Was meinst du? "Fünf Ausrufezeichen. Sicherer Hinweis auf geistige Umnachtung." Ah. Verstehe. Du entschuldigst. Ich muss die Realität kurz geradebiegen. Mein Schreibtisch hängt grad an der Decke weil dem keiner gesagt hat er soll aufm Teppich bleiben. Und es gibt da diese Studienarbeit die aus irgendwelchen Gründen genau das tut, was Sie soll. Da kann doch auch was nicht stimmen.
Mit dem Rauschen in deiner Schaltung bekommst du vielleicht 1 Bit mehr und bist damit glücklich, anderen reicht das wiederum nicht. Für sehr lange Oversampling-Serien kann man sich auch schön einfach nen einstellbaren 50Hz-Ripple drauflegen.
>Für sehr >lange Oversampling-Serien kann man sich auch schön einfach nen >einstellbaren 50Hz-Ripple drauflegen. Wenn Du die Samplingzeit auf N*20ms stellst, werden die 50Hz exakt weggefiltert. Ein gleitender Mittelwertfilter kann als FIR filter betrachtet werden und hat dann bei 50Hz eine Nullstelle.
Solange man nicht gerade mutwillig auf N*20ms synchronisiert, werden wie gewünscht alle analogen Zwischenwerte durchlaufen und gehen ins Oversampling ein.
>man nicht gerade mutwillig auf N*20ms synchronisiert
Es muss nichts synchronisiert werden. Man kann entweder immer über eine
Zeit von N*20ms mitteln oder einen gleitenden Mittelwert mit der
Fensterlänge N*20ms verwenden, dann bekommt man für jeden Abtastwert
auch einen Ausgangswert.
chris_ schrieb: > Ah, Du spielst auf den Thread an, in dem Du das Problem nicht verstanden > hattest.. Ähem - falsch getippt. Das Ganze liegt etwas weiter zurück. Es ging um das Grundverständnis davon, daß ein µC ein getaktetes System ist und deshalb alle (ja, ALLE) Signale, die man an irgendwelche Portpins anlegt, gesamplet (sch... denglish) werden. Deswegen kann auch ein Counter im µC nicht wirklich von einem Signal am Portpin getaktet werden, da dieses Signal ja nur als Sample vorliegt - eben das Zuschlagen des Abtasttheorems. Ja - irgendwie trifft sich das mit diesem Thread. Damals ging es um zeitliche Auflösung zwischen den Schaltflanken des Systemtaktes, hier geht es jetzt um das um 90° gedrehte Problem, nämlich um die amplitudenmäßige Auflösung zwischen zwei ADC-Stufen. Tja, man sollte wirklich sich dazu durchringen, Naturgesetze anzuerkennen. Wirklich... auch dann wenn einem eines nicht schmecken will. W.S.
c-hater schrieb: > Denn wie bereits aus der > Aufgabe bekannt, ist die absolute Größe hier ziemlich irrelevant, es > kommt nur auf die korrekte Bewertung des (relativen) Verlaufs der Kurve > an. Ach, mei Liaber, mir ist das alles von Anbeginn schon längst klar gewesen. Aber du solltest eines bedenken: Die typischen SAR-ADC's in µC sind von hause aus eben nicht monoton. Das ist z.B. bei Audio-ADC's anders, die sind nicht überragend genau (absolut gesehen), aber sie sind idR. so konstruiert, daß sie monoton wandeln. Also, was hast du von einem ADC, den du per Tricks (Rampe, Rauschen, Oversampling) aufgeblasen hast in dem von dir beschriebenen Falle? Nun, du hast in vielen Fällen den erhofften Erfolg, aber in manchen Fällen den richtigen Reinfall. Grund: Die Stufen von SAR-ADC's sind eben nicht alle gleich und besonders die Stufen der höherwertgen Bits machen das Problem aus. Zum Beispiel Übergang von 7Fh nach 80h oder FFh nach 100h und so weiter. An diesen Stellen landet man dann in der (relativen) Prärie beim Mitteln von Zwischenstufen. Wenn man es nicht übertreibt und sich nur 1 zusätzliches Bit oder allenfalls 2 Bits dazumittelt, dann geht das ja so lala für's Auge, also wenn man ein Thermometer, das eigentlich nur 1° Stufen hat, auf Pseudo-Nachkommastellen aufblasen will. Aber einen echten Algorithmus, der sich auf die Werte verlassen muß, würde ICH nie und nimmer mit solchen Meßwerten füttern wollen. W.S.
Leute, bitte bei der Sache bleiben. Da haben dann Personalpronomen nichts verloren...
Beitrag "Re: [S] Gute & günstige Ready-to-use Akkus (Mignon) + 9V Blöcke" Da geht es zwar um ein anderes thema, aber in dem entsprechenden Beitrag kann man in der Grafik schön sehen was dabei herauskommen kann wenn das Rauschen beim Multisampling nicht zu den "Stufen" paßt. Das ist natürlich nur eines der möglichen Szenarien. Schon geringe Detailänderungen können dazu führen, daß es nochmals ganz anders aussieht. Bei dem Einen kann stumpfes Multisampling funktionieren, weil es gerade mit den Bedingungen so paßt. Aber Ohne die Details zu analysieren bleibt es Glückssache ob es wie gewünscht funktioniert.
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.