Forum: Mikrocontroller und Digitale Elektronik 13 Bit Genauigkeit mit Atmega messen ?


von n+peter (Gast)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das wird mit künstlichem Rauschen und Unterabtastung gemacht. Gibt es 
auch eine AppNote von ATMEL dazu.

von Michael B. (mb_)


Lesenswert?

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.

von T. C. (tripplex)


Lesenswert?

Oder die so oft zitierte AVR AN-123

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?


von avr (Gast)


Lesenswert?

Wie (und wann) das geht sagt dir Atmel:

http://www.atmel.com/dyn/resources/prod_documents/doc8003.pdf

avr

von Bensch (Gast)


Lesenswert?

> 13 Bit Genauigkeit

Der Unterschied zwischen Genauigkeit und Auflösung ist dir bekannt?

von Falk B. (falk)


Lesenswert?


von n+peter (Gast)


Lesenswert?

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

von Ungast (Gast)


Lesenswert?

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.

von n+peter (Gast)


Angehängte Dateien:

Lesenswert?

Jetzt hab ich die Sache am laufen, falls es jemand probieren will, hab 
die Bascom Datei angehängt.

von Bernd (Gast)


Lesenswert?

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 ?

von n+peter (Gast)


Lesenswert?

dann teile ich durch 10000 (W=V/10000), so habe ich die Kommastelle 
gleich an der richtigen Stelle,
mfg.

von Peter D. (peda)


Lesenswert?

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

von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

>> 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.

von Thomas W. (wagneth)


Lesenswert?

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 ?!?

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

>> 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.

von n+peter (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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 :-)

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

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.

...

von Bernd (Gast)


Lesenswert?

>> 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.

von Bernd (Gast)


Lesenswert?

Oooh, sehe jetzt erst deinen Anhang, schau ich mir mal an :-)

von Joe R. (joer)


Lesenswert?

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?

von Bernd (Gast)


Lesenswert?

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.

von Joe R. (joer)


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

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.).

von Jadeclaw (Gast)


Lesenswert?

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.

von Joe R. (joer)


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

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.

von Joe R. (joer)


Lesenswert?

@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.

von Kevin K. (nemon) Benutzerseite


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

@ 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.

von Joe R. (joer)


Lesenswert?

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?

von Bernd (Gast)


Lesenswert?

>> möchte schnell erkennen wenn sich im Raum die Temperatur um Milligrade
>> ändert.

Jetzt bin ich neugierig :-) wofür brauchst du das denn ?

von Joe R. (joer)


Lesenswert?

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
Noch kein Account? Hier anmelden.