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
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.
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.
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_tgetAdcValue(void)
2
{
3
uint16_tAvgCount=0;
4
uint32_tAvgSum=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.
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.).
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?
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.