Hallo zusammen ! Ich beschäftige mich seit kurzem mit AVRs (Atmega8 + Bascom) um für PV-Solar bzw. Windkraft Leistungmesser zu bauen (in Klartext mit LCD). Ist soweit auch kein Problem, da hierfür die 10 Bit des internen ADC allemal ausreichen. Aber, -- ich hab einen "Watts UP" zum ausmessen von E-Modelmotoren, und der schafft die Spannung und den Strom auf 2 Kommastellen bis 60 Volt bzw. 100 Ampere, und im Vergleich mit einem 6,5 Digitalvoltmeter sind die Werte sehr genau und die letzten Stellen des Watts UP sehr stabil, mit Abweichungen von max. 2 Digits sind meine anderen Multimeter dagegen schlechter im Abschneiden. Der Watts UP hat einen Attiny 26 mit 10 Bit ADC verbaut. Nun die Frage, wie geht das ???, es gibt zwar in anderen Beiträgen Vorschläge und Musterformeln, aber aus denen wede ich nicht schlau, das man mit Mitteln von zwei Werten auf 11 Bit kommen kann ist mir klar, aber wie gehts dann weiter auf 13 Bit, hat jemand einen Vorschlag, vielleicht sogar in Bascom ? mfg Peter
Das wird mit künstlichem Rauschen und Unterabtastung gemacht. Gibt es auch eine AppNote von ATMEL dazu.
n+peter schrieb: > Hallo zusammen ! > > Ich beschäftige mich seit kurzem mit AVRs (Atmega8 + Bascom) um für > PV-Solar bzw. Windkraft Leistungmesser zu bauen (in Klartext mit LCD). > Ist soweit auch kein Problem, da hierfür die 10 Bit des internen ADC > allemal ausreichen. > > Aber, -- ich hab einen "Watts UP" zum ausmessen von E-Modelmotoren, und > der schafft die Spannung und den Strom auf 2 Kommastellen bis 60 Volt > bzw. 100 Ampere, und im Vergleich mit einem 6,5 Digitalvoltmeter sind > die Werte sehr genau und die letzten Stellen des Watts UP sehr stabil, > mit Abweichungen von max. 2 Digits sind meine anderen Multimeter dagegen > schlechter im Abschneiden. Der Watts UP hat einen Attiny 26 mit 10 Bit > ADC verbaut. Atmel hat ein sehr schoenes application note (AVR121) wo das sehr gut drin erklaert ist. > das man mit Mitteln von zwei Werten auf 11 Bit kommen kann ist mir klar, Nein eben nicht. Wenn man zwei 10bit Werte mittelt kommt ein gemittelter 10bit Wert raus. Mehr dazu im appnote.
Wie (und wann) das geht sagt dir Atmel: http://www.atmel.com/dyn/resources/prod_documents/doc8003.pdf avr
> 13 Bit Genauigkeit
Der Unterschied zwischen Genauigkeit und Auflösung ist dir bekannt?
Danke für die einstweiligen Antworten, aber richtig, ich hätte den Eintrag mit "13 Bit Auflösung" benennen sollen. Mir gehts nur darum, wie ich auf 13 Bit Auflösung kommen kann, sprich 8192 Schritte, die natürlich auch reproduzierbar sein sollen. Aber das mit den gemittelten 10 Bit ist mir etwas unklar, denn wenn ich einen 10 Bit Wert der zwischen zwei Werten umherhüpft (z.B. 743 + 744) dann erhalte ich nach dem Mitteln 743,5, dann komme ich auf 1024 x 2 = 2048 Werte, und das sind für mich eben 11 Bit. Welche Auflösung hat dann 10 Bit gemittelt ? mfg Peter, bitte um noch mehr Anregungen
Wenn dir die Theorie und Mathe dahinter nicht behagt: Schneller als einen Wert pro Sekunde wird kaum jemand lesen können, du hast also alle Zeit der Welt um VIELE Messwerte zu sammeln und zu mitteln. 8192 Messwerte sollten kein Problem sein, und wenn du genug Platz für die Divisions-Routinen über hast auch noch mehr. Ob du damit jetzt 11, 12, oder auch 16 Bit erreichst (ist eh durch die "qualität" deiner Rauschquelle limitiert), ist erstmal Wurscht, das wird eh niemand nachmessen.
Jetzt hab ich die Sache am laufen, falls es jemand probieren will, hab die Bascom Datei angehängt.
Verstehe nicht was du da machst !?
1 | For I = 1 To 200 |
2 | Z = Getadc(k) |
3 | V = Z + V |
4 | Next I |
Du addierst 200x den ADC Wert auf und dann ?
dann teile ich durch 10000 (W=V/10000), so habe ich die Kommastelle gleich an der richtigen Stelle, mfg.
Man kann sich natürlich selber die Taschen voll lügen oder man nimmt einfach nen besseren ADC. Ohne Zusatzbeschaltung kriegst Du keine 13 Bit Auflösung (13Bit Genauigkeit kannste in jedem Fall knicken). Du mußt ne Rampe auf das Eingangssignal oder auf die Referenz modulieren, wie in der App-Note beschrieben. Ich vermute mal, die Schaltung mit dem ATtiny26 schaltet einfach die Verstärkung um oder nen Spannungsteiler. Die 0,01V wirst Du bei kleinen Spannungen sehen können, ab einer Schwelle werden dann aber die Stufen größer. Peter
Die Frage war eher ketzerisch gemeint :-) es erschließt sich mir nicht wie man auf 13 BIT kommt in dem man 200x aufaddiert und dann durch 10000 dividiert. Peter Danegger hat hier einmal ein Meßgerät vorgestellt: Beitrag "ADC mit Multiplexanzeige" Ich habe seinen Code mal auf 12 BIT modifiziert und dabei auch Offset und Gain Fehler des Wandlers herausgerechnet. Das kann man dann als Beispiel für die genannten Appnotes verwenden. Ich kenne mich mit Bascom nicht aus daher hier das Prinzip in C.
1 | uint16_t getAdcValue (void) |
2 | {
|
3 | uint16_t AvgCount = 0; |
4 | uint32_t AvgSum = 0; |
5 | |
6 | for (AvgCount = 0; AvgCount < 256; AvgCount ++) { |
7 | ADCSR |= (1 << ADSC); // AD Wandler starten |
8 | while (ADCSR & (1 << ADSC)); // AD Wandlung fertig ? |
9 | AvgSum += ADC; // Mittelwert über 256 Messungen |
10 | }
|
11 | return (AvgSum >> 6); // Oversampling 12 BIT |
12 | }
|
Zu beachten ist, meine 7 Segmentanzeige ist anders angesteuert als Peters... hier also die entsprechenden Defines anpassen. Peters Code führte auf der letzten Stelle zu "Sprüngen". Das hat mich gestört und daher die Anpassung. Mit 12 BIT funktioniert es ohne Probleme.
Bernd schrieb: > Die Frage war eher ketzerisch gemeint :-) es erschließt sich mir nicht > wie man auf 13 BIT kommt in dem man 200x aufaddiert und dann durch 10000 > dividiert. Naja, dein Code macht doch ähnliches: 1. 256 ADC-Wandlungen aufaddieren 2. Durch 16 teilen. 3. Durch 4 teilen. 1+2 = laut Appnote 256faches Oversampling und 4x shift right für 14bit. 3 = zusätzliche Division um auf 12bit zu kommen. n+peter macht folgendes: 1. 200 ADC-Wandlungen aufaddieren 2. Durch 200 teilen (arithmetisches Mittel) 3. Durch 50 teilen. 1+2 = arithmetisches Mittel von 200 Samples. 3. = zusätzliche Division Für 13bit "Auflösung" soll laut Appnote 64faches Oversampling durch 8 (3x shift right) geteilt werden. Das wurde hier nicht beachtet. Künstliches Rauschen vorausgesetzt. Ich habe mir die Appnote jetzt nicht so genau angesehen und weiß nicht, ob die Rauschpegel bekannt sein müssen oder zufällig sein dürfen.
>> Für 13bit "Auflösung" soll laut Appnote 64faches Oversampling durch 8
(3x shift right) geteilt werden. Das wurde hier nicht beachtet.
Genau das meine ich ! er kommt NIE auf 13 BIT.
Kleine Frage... Was für eine Spannung möchte denn der TE messen ? Das Prinzip funktioniert doch nur wenn das Signal zappelt, oder ? Bzw man rechnet sich über die Nomalverteilung der (statistischen) Messfehler "Zwischenbits" dazu ?!?
Der TE macht mit seinen mehrfachen Samplings nur eine Glättung der Daten (=> arithmetischer Mittelwert) und schneidet anschließend noch die springenden Bits ab (/50 = 5,? Bits). Insgesamt bleibt die Auflösung des ADC erhalten (10bit). Durch Mittelwertbildung könnten auch vorgetäuschte 11bit zustande kommen (Beispiel 2+3/2 = 2,5). Durch das Abschneiden der letzten 5,? Bits bleiben auch nur noch knapp 5Bit für den anzuzeigenden Messwert übrig. Das ist ein Wertebereich von 0-31. Bei Vref von 5V ergibt das Schritte von 0,16V. Diese Betrachtung gilt natürlich komplett ohne Rauschen.
>> und schneidet anschließend noch die springenden Bits
und wenn da noch was springt dann hat er ein grundlegendes Problem. Da
"springt" auch nichts mehr bei einer Skalierung auf 12 BIT.
Hallo zusammen ! Ich bin erstmals zufrieden mit dem Ergebnis meiner Testschaltung und Programm, ne, 13 Bit funktioniert nicht zufriedenstellend, da flattern die hinteren Stellen zu viel, aber mit den 11 Bit passt es. Im Prinzip funktioniert die Sache (das wollte ich mit diesem Beitrag ja erfahren), klar das Signal muss um den Wert rauschen, sonst gehts gar nicht, beim Test mit einem Sharp-Pocket mit 8 Bit-Interface stehen die ADC Werte wie festgebunden, da funktioniert es nicht, oder kaum, außerdem kann man nicht viele Werte aufsummieren, da die Sharps zu langsam sind. Und von wegen Genauigkeit, die letzte Stelle muss nicht genau sein für die meisten Anwendungen, sie soll Tendenzen anzeigen. mfg. Peter
Hallo Peter, schön das du dich zurück meldest. Ich wollte dich eigentlich dazu motivieren es mit den 13 BIT aufzunehmen :-) aber bei dir stimmt die Rechnung so nicht oder ich bin wirklich zu blöd "Bascom" zu lesen. Du bildest doch nur einen Mittelwert (10 BIT) und sähst dann noch weitere Stellen ab. Keinen Schimmer wie du überhaupt an einen Wert kommst der brauchbar ist. >> Im Prinzip funktioniert die Sache Nicht nur im Prinzip sondern auch in der Praxis, siehe Beispielcode und Schaltung. >> 13 Bit funktioniert nicht zufriedenstellend, da flattern die hinteren >> Stellen zu viel Da flattert nichts mehr, der Meßwert steht absolut stabil. Aus meiner Sicht stimmt dein Code nicht und wenns noch "flattert" dann stimmt noch mehr nicht. Seis drum, du bist zufrieden :-)
Tja, wie hoch ist denn nun Genauigkeit und Auflösung des kleinen Eigenbau-Voltmeterchens im Anhang? Mir ist es eigentlich egal, ein paar Freunde und ich sind damit zufrieden und nutzen es sehr häufig. ...
>> Tja, wie hoch ist denn nun Genauigkeit und Auflösung des kleinen >> Eigenbau-Voltmeterchens im Anhang? 12 BIT bei einem Eingangsspannungsbereich von 0 - 27 Volt (AREF) bei dem gewählten Bereich (Spannungsteiler 10:1) also 10 mV. Sind ja nur 4 7-Segment Ziffern darauf (siehe Schaltplan). Zuvor waren es 10 BIT und dann springt die letzte Stelle. Genauigkeit ist +- 2 Digit. Die werden aber auch nur erreicht weil Offset und Gainfehler auch behandelt sind.
Oooh, sehe jetzt erst deinen Anhang, schau ich mir mal an :-)
Vielleicht haben die Ingenieure im "Watts UP" einfach einen Sigma-Delta-Wandler - mit Kondensator und Komparator gebastelt? Damit kann man extrem hohe Auflösungen erreichen bei längerer Messzeit. Als PIC habe ich das schon mal gesehen: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011642 Kennt jemand eine AVR Lösung dafür?
Die Idee dahinter ist recht einfach. Man nehme einen DA Wandler mit hoher Auflösung, das kann auch ein R2R Netzwerk sein und erzeugt eine Rampe. Wann immer der Komparator "kippt", entspricht die Eingangsspannung dem ausgegebenen DA Wert.
Dem muss ich widersprechen. http://de.wikipedia.org/wiki/Sigma-Delta-Wandler Im PIC Projekt wird mit 2 Widerständen und einem Kondensator als externe Bauelemente und intern mit Komparator und Timer, sowie natürlich einem schönen Stück Software, ein sehr genauer ADC realisiert. Ursprünglich für MCU's ohne ADC. Siehe mein Link weiter oben. Dort ist alles beschrieben und mit Assembler-Quellcode für den PIC. Ich fage nochmal, hat das schon mal jemand für AVR gemacht? Speziell der Digitalfilter könnte sicher effizienter geschrieben werden. Da die externen Bauelemente extrem in die Genauigkeit eingehen, sollte man auch eine Selbstkalibration einbauen - sowohl für Nullpunkt und Endwert. Die Linearität könnte man berechnen. Ich denke 16 Bit Genauigkeit sind machbar. Es ist allerdings langsam.
Naja, der DAC ist halt als 1 BIT ausgeführt. Man kann das mit ner PWM und einem Tiefpaß realisieren. Bei 16 BIT würde ich da nicht das Basteln anfangen sondern einen fertigen Wandler kaufen. Ist schon schwer genug die 16 BIT einzuhalten (Layout etc.).
Joe Redfish schrieb: > Kennt jemand eine AVR Lösung dafür? Atmel: http://www.atmel.com/dyn/products/app_notes_mcu.asp?family_id=607 AVR400: http://www.atmel.com/dyn/resources/prod_documents/doc0942.pdf und 401: http://www.atmel.com/dyn/resources/prod_documents/doc0953.pdf Allerdings traut Atmel dem Ganzen nur 8 bit zu. Gruß Jadeclaw.
Nein, das trifft es leider auch nicht. Das sind Rampenkonverter. Ziemlich ungenau. Der von Microchip beschriebene Sigma-Delta-Wandler funktioniert über eine Rückkopplung und erzeugt - einfach gesagt - ein PWM Singnal hoher Frequenz dessen High-Low Verhältnis dem Analogwert annähernd entspricht. Die Timerauflösung und die Integrationsdauer sind ausschlaggebend für die Genauigkeit. Hier im Forum gibt es in der DSP Abteilung schon Lösungen für FPGA und DSP. Aber halt nicht für AVR. Der digitale Filter ist nicht ganz trivial. Der Vorteil dieser Schaltung ist die große mögliche Genauigkeit bei minimalem Bauteilaufwand. Die Software schreiben wir nur einmal - den 16Bit ADC müsste jeder kaufen um das zu erreichen. Wer hat noch nie einen genauen ADC benötigt, wo die Wandlungszeit sekundär war? Ein Analogmultipexer am Eingang könnte für die Autokalibrierung Referenz und AGND aufschalten. ODER, traut sich jemand zu den digitalen Filter in C zu schreiben? Mit Assembler geht das zwar alles auch, ist aber mühsam.
Vielleicht mal einen anderen Ansatz, der hier hat einen solchen Wandler an Board und kostet nicht mal 2 Euro. http://focus.ti.com/docs/prod/folders/print/msp430f2013.html Ich habe die Wandler der AVR, Silabs (8x51) und MSP's getestet, der Preis rechtfertig in keiner Weise den Aufwand den du treiben willst. Übertrage das Wandlerergebnis einfach per SPI zu deinem AVR.
@Berd Ja Danke, ist ja sicher gut gemeint von Dir. Aber der Aufwand ist nur einmalig. Danach kommt der Wandler mit 1x4051, 2 Widerständen und einem Kondensator aus, ist hochgenau, hat 6 Eingänge und kostet fast nix. Wenn sich das nicht rentiert für uns alle? Muss man halt mal machen. Ich brauche das oft mal und wie immer soll es nichts kosten.
Mal so gefragt: wie genau ist denn die Referenzspannungsquelle? Wenn diese 12Bit auf ein LSB genau ermöglichen soll, muss die auch schon ganz anständig sein.
@ Joe Redfish
Eingänge hat der MSP genug :-)
>> Ich brauche das oft mal und wie immer soll es nichts kosten.
Wird es aber :-) denn die Zeit die du investierst um herauszufinden das
so etwas nicht trivial ist kostet auch Geld.
Ansonsten mein letzter Tipp :-) nimm nen U/F Wandler.
Die interne Band Gap Referenzspannungsquelle hat zwischen -40 und 85°C bei 3,3Volt Betriebsspannung 0,004V Abweichung. Bezogen auf Ihren Sollwert 1,25V genügt das für eine Genauigkeit von 8,5 Bit. Also arbeitet der interne ADC im Temperaturbereich -40 bis 85°C auch nur auf 8Bit genau. Bei Temperaturen von 15 bis 35°C sind es immerhin schon 10,5 Bit Genauigkeit. Auch nicht zu viel, aber für die Wiederholgenauigkeit bei 16Bit ist mir das ausreichend. Bei mir geht es primär um eine Temperaturreglung. Ich möchte schnell erkennen wenn sich im Raum die Temperatur um Milligrade ändert. Das geht mit 12Bit nicht. Der Absolutwert muss nicht so genau sein. Meine PT1000 sind auch nur in der Genauigkeitsklasse 0,5%. Das gleiche Problem gibt es z.B. beim Auswerten von Erschütterungssensoren, Gyrosensoren oder Audiosingnalen. Da genügen 12Bit Dynamik vom SAR-ADC nicht. Wer es genauer möchte, kann die interne Referenz eichen und den Temperaturkoeffizienten herausrechnen. Alterungsbeständige Widerstände und Kondensatoren vorausgesetzt. Da kommt aber Bernds Vorschlag besser. Ich habe etwa 36 Sensoren und einen SPI, hm. Das Bestechende am Delta Sigma Wandler ist die einfache Anschaltung. Die Empfindichkeit wird mit dem Widerstandsverhältnis geregelt. Keine komplizierte OPV Schaltung, Störsingnale werden wegintegriert wenn ich symmetrische Kabel verwende etc. Was geht besser und ist preiswerter?
>> möchte schnell erkennen wenn sich im Raum die Temperatur um Milligrade >> ändert. Jetzt bin ich neugierig :-) wofür brauchst du das denn ?
Luftzug, Sonneneinstrahlung, Personenabstahlung, Fenster auf/zu sind alles verschiedene Wärmequellen/senken die ich anhand der genauen Kennlinie identifizieren kann. Eine normale Reglung gleicht die Temperatur einfach aus, nix mit Energie sparen. Eine Event gesteuerte Reglung wird nach der Lernphase erkennen das jetzt gelüftet werden soll oder was auch immer. In Abhängigkeit der Up/Down Geschwindigkeit der Temperatur kann der Regler frühzeitig entscheiden ob er jetzt aufdreht oder abschaltet. Desweiteren ist mir die Anschaltung an einen normalen SAR-ADC mit OPV's zu aufwändig. Mit meinem Vorschlag brauche ich nur einen Muxer, einen Widerstand und einen Kondensator. Der Eingangswiderstand ist der/sind die PT1000 und da die Spannung am Kondensator immer 1,24Volt ist, fließt da auch ein Konstantstrom von 1,24mA durch, perfekt. Die 16 Ohm vom Multiplexer ziehe ich ab. Als Referenz dient nicht die Spannung, sondern ein 1KOhm Widerstand für den Nullwert und ein 3,9kOhm für den Endwert. Die muss ich genau ausmessen. Damit ist die Referenzspannung so gut wie unwichtig. Falls es jemanden gibt der sich mit digitalen Filtern auf AVR auskennt oder schon mal was gehört hat, wenn möglich in C, dann kann er sich ja mal melden. Ich habe derzeit ein Problem das im AVR GCC "double" mit 32Bit Länge definiert ist (warscheinlich 24.7). Gibt es da eine Lösung? Könnte man nicht einfach die "defines" ändern und den GCC neu kompilieren? z.B. im GCC 4.4.2 in Datei \\gcc-4.4.2\gcc\config\avr\avr.h Zeile 161: #define DOUBLE_TYPE_SIZE 32 #define LONG_DOUBLE_TYPE_SIZE 32 auf 64 ändern und den GCC neu kompilieren... Kann das jemand? In anderen CPU Headern ist der Wert auf 64. Es muss also gehen. cris: /* Note that DOUBLE_TYPE_SIZE is not defined anymore, since the default value gives a 64-bit double, which is what we now use. */ Motorola 68HC11 and 68HC12: /* A C expression for the size in bits of the type double on the target machine. If you don't define this, the default is two words. Be IEEE compliant. */ #define DOUBLE_TYPE_SIZE 64 #define LONG_DOUBLE_TYPE_SIZE 64 Ich meine die AVR-Flashgröße ist mittlerweile recht üppig. Da würde ich jetzt nicht mehr sparen. Vielleicht umschaltbar machen. Auf jeden Fall gab es hier im Forum schon Probleme damit, GPS Daten genau genug zu berechnen.
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.