Hey ich benutze eine Atmega32 mit dem Funk Evulation Board von Pollin. Habe ein LCD Display vom S65 angeschlossen. Die 10,und Volt für die Hintergrundbeleuchtung mache ich mittels Hochsetzsteller (PWM, Spule, Diode, Transistor). Soweit zur Hardware. Ich habe einen LM335 Temperatursensor an ADC0 Eingang gelegt und benutze AVCC als AREF. Achso es handelt sich um einen 10Bit ADC. Ich messe mit dem Multimeter 2.882V am ADCO Pin konstant. Ich lasse mir den Wert vom ADC auf dem Display darstellen. Und sehe immer einen Wert zw. 682 - 689. Woran kann das liegen das der so schwankt. Anbei der Code Vielen Dank für die Hilfe
Ohne den Rest genau angesehen zu haben: Es ist normal, das die letzten Bits vom ADC rumwackeln. vor allem, wenn auf der selben Platine noch ein Schaltregler sein Unwesen treibt. Einfach den Mittelwert über viele Messungen bilden, und den anzeigen.
Es macht keinen Unterschied ob ich 10 100 oder 1000 Werte nehme und diese mittel. Der Wert schwankt immer noch. Das Problem ist ja wenn ich den Wert umrechne auf die Spannung ergibt sich ja bei einer kleinen Änderung am Wert ein große Änderung als Wert der Spannung. Siehe Formel Umrechung auf die Spannung:
Wenn nun ein Änderung auftritt ergibt sich
Das bedeutet das bei einer Referenzspannung von 5.0V = 5000 (Um die Kommastellen ohne float mitzunehemen) sich das dx um ein Faktor von ca. 5 letztendlich auswirkt.
Matthias Laubnitz wrote: > Es macht keinen Unterschied ob ich 10 100 oder 1000 Werte nehme und > diese mittel. Der Wert schwankt immer noch. Diese Aussage ist stochastischer Bloedsinn. Olli
@Olli stochastisch gesehen hast du Recht. Hilft mir nur leider nicht weiter.
Matthias Laubnitz wrote: > @Olli > > stochastisch gesehen hast du Recht. > Hilft mir nur leider nicht weiter. Verstehe ich aber immer noch nicht. Du schreibst: "Und sehe immer einen Wert zw. 682 - 689" Wenn ich ueber 100 solcher Werte mittele, schwankt da nichts mehr. Einfach die ADC-Werte mitteln und den gemittelten Wert dann in eine Spannung umrechnen. Wenn die Schwankungsbreite wie von Dir angegeben 1% ist, was willst du mehr? Olli
Ja habe ich ja bereits gemacht nur leider tut sich nicht. Hast du dir den Code mal angeguckt? Vielleicht ist ja irgendetwas falsch nur ich sehe es nicht.
Du mittelst ueber 4 (vier) Werte. Da ist doch eine Varianz von 1% im Ergebnis nicht schlecht. ich kenne das Pollin-Board zwar nicht genau, aber das ist sicher nicht fuer ADC-Messungen optimiert. Da wackeln halt ein 1,2 Bits. Mittel doch mal ueber 100 statt nur ueber vier Messwerte. Oder hast Du das schon versucht und dann schwankt es immer noch genauso? Olli
Habe ich auch schon nur es ändert sich nichts und deshalb dachte ich hätte einen Fehler im Code. Schaltpan Pollin-Board: http://www.pollin.de/shop/shop.php
Das muss wohl so sein, mit mehr Messwerten muss die Statistik besser werden. Hae den Code bisher nur ueberflogen, ich guck ihn mir mal genauer an. Olli
Hier die fragliche Schleife: result = 0; result2 = 0; for( i=0; i<4; i++ ) { ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } result2 = ADCL; result2 = result2 + (ADCH<<8); result =result+result2; } Ich kann da keinen Fehler erkennen, der das beschriebene Verhalten erklaeren wuerde, hm :( Olli
Aber versuch doch mal den 16-bit-Zugriff mit result2 = ADCW; anstatt High- and Low-Byte einzeln einzulesen. Olli
Erstmal vielen Dank für deine Mühe. Nur leider ändert es auch nichts.
gib doch einfach mal die original-adc werte ohne filterung aus. und gucke, ob die auch so schwanken..
Justus Skorps wrote:
> kann es sein, dass der Pin "Aref" in der Luft hängt?
Im Eingangsposting schreibt er, das AREF an VCC haengt.
Olli
Oliver Rother wrote: > Justus Skorps wrote: >> kann es sein, dass der Pin "Aref" in der Luft hängt? > > Im Eingangsposting schreibt er, das AREF an VCC haengt. > > Olli nicht direkt: > Ich habe einen LM335 Temperatursensor an ADC0 Eingang gelegt und benutze > AVCC als AREF. das habe ich jetzt so interpretiert, dass er die Ref-Spannung per Register auf Avcc gestellt hat...und ich glaub , in seinem Code steht das auch so: ADMUX = (1<<REFS0) | (0<<REFS1); = AVCC with external capacitor at AREF pin
> ADMUX = mux; // Kanal waehlen > ADMUX = (1<<REFS0) | (0<<REFS1); // ADCVCC=ADCVREF Du überschreibst hier mit der Referenzspannungskonfig den gewählten Kanal. Solange Du nur auf Kanal 0 misst, kein Problem, aber wenn nicht...
@lippy Ohne Filterung? Du meinst ohne Mittelwert? @jussa Habe ich an VCC angeschlossen. Mit Anschluss oder ohne macht auch keinen Unterschied.
Bist du sicher, dass AREF an VCC haengt? Ich habe gerade mal in den Schaltplan des Pollin-Boards geguckt, da haengt AREF nur auf einer Steckerleiste. Den richtigen Pin mit VCC verbunden? Olli
> > @jussa > Habe ich an VCC angeschlossen. Mit Anschluss oder ohne macht auch keinen > Unterschied. dann ist imo aber deine Einstellung falsch...
Matthias Laubnitz wrote: > @jussa > Habe ich an VCC angeschlossen. Mit Anschluss oder ohne macht auch keinen > Unterschied. Das kann nicht sein. Wie willst du denn ohne Referenz eine Spannung messen, wenn AREF nicht beschaltet ist? Das floatet dann ja nur. Olli
Oliver Rother wrote: >> Habe ich an VCC angeschlossen. Mit Anschluss oder ohne macht auch keinen >> Unterschied. > > Das kann nicht sein. Wie willst du denn ohne Referenz eine Spannung > messen, wenn AREF nicht beschaltet ist? Das floatet dann ja nur. Lies mal das Datenblatt! Die Referenzquelle wird intern ausgewählt. AVCC hat an dem AREF-Pin nichts zu suchen. AVCC kann intern über die REFS-Bits in ADMUX als Referenz gewählt werden. An AREF kommt im Normalfall nur ein 100 nF-Kondensatörchen, es sei denn, es soll eine Referenzspannung verwendet werden, die der µC intern nicht zur Verfügung stellen kann! Wenn das Kondensatörchen allerdings fehlt, kann es auch zu Störungen kommen...
>Die Referenzquelle wird intern ausgewählt. >AVCC hat an dem AREF-Pin nichts zu suchen. AVCC kann intern über die >REFS-Bits in ADMUX als Referenz gewählt werden. An AREF kommt im >Normalfall nur ein 100 nF-Kondensatörchen, es sei denn, es soll eine >Referenzspannung verwendet werden, die der µC intern nicht zur >Verfügung stellen kann! Druckt euch das aus, und hängt es übers Bett! >Ohne Filterung? Du meinst ohne Mittelwert? Ja. als etwa so:
1 | _u16Result = ADCW; |
2 | itoa ( _u16Result, ... ); |
Matthias Lipinsky wrote: > Druckt euch das aus, und hängt es übers Bett! Überm Bett nützt es in den wenigsten Fällen...;-) > Ja. als etwa so: >
1 | > _u16Result = ADCW; |
2 | > itoa ( _u16Result, ... ); |
3 | >
|
Oh là là, bitte keine Bezeichner mit Unterstrichen am Anfang benutzen! Das darf nur die Bibliothek...
>mit Unterstrichen
Ich dachte, Bibliothek hat zwei Unterstriche..?
Ich hab das immer als Unterscheidung global (u16Text) und lokal
(_u16Name) benutzt..
Hat bisher immer funktioniert
Matthias Lipinsky wrote: >>mit Unterstrichen > > Ich dachte, Bibliothek hat zwei Unterstriche..? Nö. Alles, was mit einem oder mehreren Underscores anfängt, ist für Compiler und Bibliothek reserviert. > Ich hab das immer als Unterscheidung global (u16Text) und lokal > (_u16Name) benutzt.. > > > Hat bisher immer funktioniert Naja, die Wahrscheinlichkeit, dass irgendeine systemeigene Funktion exakt den von Dir vergebenen Namen benutzt, ist natürlich nicht sooo groß. Nichtsdestotrotz gilt obige Regelung...
Das der ADC in den letzten Bits ein bischen wackelt, kann durchaus an einem fehlendem Kondi an AREF liegen. Wie ist eigentlich die Beschaltung des LMirgendwas? Was mir allerdings mehr Sorgen machen würde: Dein ADC Wert stimmt nicht! Wenn dein ADC 682 ausgibt, bei 5V Referenz, dann sind das keine 2.882 Volt (682 sind nach meiner Rechnung 3.33). Dagegen ist das Bitgewackel in den letzten Stellen Peanuts.
>Nichtsdestotrotz gilt obige Regelung...
Ok. Ist das eine C-Festlegung, oder eher ein "ungeschriebenes GEsetz" ?
Was sich so eingebürgert hat?
Matthias Lipinsky wrote: >>Nichtsdestotrotz gilt obige Regelung... > > Ok. Ist das eine C-Festlegung, oder eher ein "ungeschriebenes GEsetz" ? > Was sich so eingebürgert hat? Nein, das ist schon so im C-Standard festgelegt. Die genauen Regeln weiß ich auch nicht mehr auswendig. Wenn ich mich recht erinnere ist für einen Applikationsprogrammierer tabu: * alles was mit 2 Unterstrichen anfängt * alles was mit 1 Unterstrich gefolgt von einem Grossbuchstaben (oder wars ein Kleinbuchstabe?) anfängt. Aber schlag mich nicht, wenn ich mich da jetzt falsch erinnere. Lass einfach die Finger von allem was mit einem Unterstrich anfängt und gut ists.
Justus Skorps wrote: > das habe ich jetzt so interpretiert, dass er die Ref-Spannung per > Register auf Avcc gestellt hat...und ich glaub , in seinem Code steht > das auch so: > > ADMUX = (1<<REFS0) | (0<<REFS1); > = > AVCC with external capacitor at AREF pin Ah, das hatte ich uebersehen. Olli
Oliver Rother wrote: > > Ah, das hatte ich uebersehen. > > Olli er hat aber trotzdem auch Vcc direkt an Aref angeschlossen...kA ob das für das falsche Ergebnis verwantwortlich sein kann...
>Lass einfach die Finger von allem was mit einem Unterstrich anfängt und gut >ists. Hm.. Na ok. Wieder was gelernt..
Matthias Lipinsky wrote: >>Lass einfach die Finger von allem was mit einem Unterstrich anfängt und gut >>ists. > > Hm.. Na ok. Wieder was gelernt.. Der Sinn der Sache ist aber klar (hoffe ich mal). Derjenige, der die Standard-Library implementiert, braucht sowas wie einen Namensraum, in dem er seine globalen Variablen bzw. Library-privaten Makros anlegen kann. Nur gibts in C keine Namespaces wie in C++, daher hat man sich auf eine derartige Namenskonvention geeinigt.
Das ist mir alles schon klar, ich dacht nur bisher, dass Lib-eigene Namen immer zwei Unterstriche haben.. Ok. Lass ich das mal sein, ab dem nächsten PRojekt...
Also: AVREF habe ich nun mit VCC verbunden => keine Änderung immer noch leichtes zappeln AVREF an 100nF an GND => keine Änderung immer noch leichtes zappeln Den Wert vom ADC ohne Mittelwertbildung => keine Änderung immer noch leichtes zappeln Was mich wundert ist das wenn ich doch über z.B. 1000 Werte mittel dann müsste sich doch etwas ändern. Es sind immer 3-4 int Werte die sich ändern egal ob ich 1 Mittelung oder 1000 mache.
Matthias Laubnitz wrote: > Also: > > AVREF habe ich nun mit VCC verbunden => keine Änderung immer noch > leichtes zappeln > > AVREF an 100nF an GND => keine Änderung immer noch leichtes zappeln bei deinen Einstellungen (ADMUX = (1<<REFS0) | (0<<REFS1);) soll man Vcc aber nicht an AVref anschliessen, sondern nur den 100nF zwischen Avref und Gnd..
Ja ich weiss. Habe ich ja auch gemacht nur leider ändert sich nichts. Ich verstehe es einfach nicht
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.