www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC-Wandler-Konfiguration+Auslesen


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
ich möchte über eine interruptgesteuerte Werteeinlesung machen. Er soll 
sozusagen, ein Signal abtasten und mir alle Werte in eine Variable 
speichern. Das Einlesen macht er schon, aber irgendwie bekomm ich da 
einen falschen Wert. Vielleicht weiß jemand, was ich da falsch 
eingestellt habe. Schick mal den nötigen Teil des Quelltextes:

  //Initialisierung des Analog Digitalwandler
  ADMUX = 1<<REFS0 | 1<<MUX2 | 1<<MUX0;
  ADCSRA= 1<<ADEN | 1<<ADATE | 1<<ADIE;
  DIDR0|= 1<<ADC5D;
  ADCSRA |= 1<<ADSC;

ISR(ADC_vect)
{

   messsig=(ADCL) +(8<<ADCH);      //Messwerte werden in Register 
geschrieben
   messsigmV=messsig*5000/1027;       //Umwandeln der Messwerte in mV
   messsigmV=messsigmV-1367;       //Offset wird abgezogen
}

Irgendwo muss da jetzt ein kleiner Fehler sein. Aber ich find den gerade 
nicht. Hat jemand eine Idee, wäre super nett :)

P.S. Das ist ein ATMEGA328

Autor: André Wippich (sefiroth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas schrieb:
>    messsig=(ADCL) +(8<<ADCH);      //Messwerte werden in Register

Du schiebst die 8 um ADCH-Schritte nach links :-)

--> (ADCH * 0x100) ist besser

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

> messsig=(ADCL) +(8<<ADCH);

-> messsig=(ADCL) +(ADCH<<8);

MfG Spess

Autor: André Wippich (sefiroth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
>> messsig=(ADCL) +(8<<ADCH);
>
> -> messsig=(ADCL) +(ADCH<<8);
>
> MfG Spess

Hmm, erfolgt ein automatischer Typcast auf 16-Bit, wenn das 8-Bit 
Register ADCH nach links geschoben wird?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Hmm, erfolgt ein automatischer Typcast auf 16-Bit, wenn das 8-Bit
>Register ADCH nach links geschoben wird?

Weiss ich nicht. Benutze kein C.

MfG Spess

Autor: André Wippich (sefiroth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hehe ^_^

@Andreas: Wenn Du AVR-GCC benutzt, kannst Du stattdessen auch ADCW 
benutzen. Das gibt Dir den 10 Bit Wert schon richtig zusammengebaut 
zurück. Ist eigentlich ein Funktionsmakro in der Bibliothek was ADCL und 
ADCH richtig zusammensetzt.

->> messsig = ADCW;

/edit: Welcher Variablentyp ist eigentlich Deine messigmV-Variable? 
Double oder 32-Bit Integer?

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder gleich ADC.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also zu Zeit hab ich das Ding als float, bin mir aber nicht sicher, ob 
das so gut ist :P . Über dieses ADCW liest er schon was ein. Aber die 
Werte passen kein Stück zu meinem eingelesenen Signal. Mein Signal liegt 
zwischen 1120mV und 1330mV und momentan bekomm ich da Werte zwischen 
300mv und 8000mV. Das macht irgednwie keinen Sinn.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas schrieb:

> zwischen 1120mV und 1330mV und momentan bekomm ich da Werte zwischen
> 300mv und 8000mV. Das macht irgednwie keinen Sinn.


Dann lass dir erst mal die ADC Werte als Rohwerte anzeigen.

Welchen Datentyp hat messig?


> Also zu Zeit hab ich das Ding als float, bin mir aber nicht sicher,
> ob das so gut ist :P

Macht wahrscheinlich wenig Sinn

http://www.mikrocontroller.net/articles/FAQ#Datent...

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also meiner Meinung nach müssten die digitalen Werte des ADC hinkommen. 
Hab jetzt einfach mal so aus Spass gesagt, er soll das jetzt mal mit 4 
multiplizieren. Der offizielle Umrechnungsfaktor von Digitalwerten auf 
mV liegt ja irgendwie bei 4,87 (5000/1027) oder so. Und da gibt er mir 
schon völligen Mist aus. Seiner Meinung nach ist 4*100(digital)= 1680 
oder so in der Art, also völliger Mist. Anscheinend muss der Fehler bei 
der Umrechung von Digitalwerten auf mV passieren. Liegt das vll am 
Variablentyp ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas schrieb:
> Also meiner Meinung nach müssten die digitalen Werte des ADC hinkommen.

Kommen sie oder kommen sie nicht?
Im Vertrauen: Nichts gegen deine Meinung aber hier sind Fakten gefragt.

Wenn ich für jeden Fall, bei dem sich hinterher rausgestellt hat, dass 
schon die Eingangswerte nicht stimmen einen Euro bekommen hätte, wäre 
ich heute ein reicher Mann.

Da ich aber zu dämlich war, dafür jedesmal einen Euro zu verlangen, bin 
ich dazu übergegangen in einer Berechnung erst mal die Eingangswerte zu 
überprüfen. Das bringt mir zwar auch keinen Reichtum, spart aber Zeit, 
wenn wieder mal so ein Fall vorliegt.

In der Kette

   Eingabe - Berechnung - Ausgabe

ist nun mal 'Eingabe' der erste Schritt, bei dem schon Unsinn passieren 
kann. Und wie sagt schon der Volksmund so schön:
  garbage in - garbage out

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS:

Dass 1023 * 5000 den Rechenbereich von int verlässt, stört dich 
irgendwie nicht besonders? (1023 ist der größte überhaupt mögliche Wert 
vom ADC)

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe jetzt messsig und messsigmV erstmal double gesetzt und 
dann kann er schon mal auf jeden Fall mit 4 multiplizieren. Das klappt 
schon mal.
So mein Signal liegt also zwischen 1230 und 1460 mV. Meine digitalen 
Werte liegen jetzt zwischen 290 und 512, ab und zu kommt da mal sowas 
zwischen wie 1038 oder so. Wenn ich das jetzt mal so umrechne mit dem 
Faktor 5000/1027 passen die nicht dazu. Nur woran kann das liegen ?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja messsig und messsigmV sind ja jetzt double. Und das 5000/1027 ist 
ja nur für die Umrechnung da und hat letztendlich doch nichts mehr mit 
dem Einlesen vom ADC zu tun oder seh ich das falsch.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal bitte den aktuellen Code.
Aber diesmal mit den tatsächlichen Datentypen

Dazu die Analyse, was bei einem Messwert von 290 eigentlich rauskommen 
müsst und was tatsächlich rauskommt.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich alles geklärt. Danke für die Hilfe ;)

Autor: tox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja was war?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.