Forum: Mikrocontroller und Digitale Elektronik ADC liefert falschen Messwert


von adcfail (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe einen ADC aufgebaut und diesen wie im GCC-Tutorial beschrieben 
übernommen.

Ich lege eine Spannung von 1,73 V an den ADC.
Jedoch ist der gemessene Wert (ADC_average = 25666) falsch.
Laut Formel im Datenblatt: ADC = Vin * 1023/Vref
müsste sich bei einer Eingangsspannung von 1,73 V und Vref=5V ein 
ADC-Wert von 353,96 erbeben.

Was läuft hier falsch?

Vielen  DANK!

Gruss

von Karl H. (kbuchegg)


Lesenswert?

adcfail schrieb:

> Was läuft hier falsch?

Das du einen Screenshot postest anstatt dem Code.

Wie kommt adc_average zu seinem Wert?
Der kann nicht 25666 sein.
Selbst wenn der ADC 32 mal hintereinander 1023 liefern würde, ist der 
Mittelwert davon immer noch 1023 und kann auch niemals größer als 1023 
sein.

Da du aber in der Variablen 25666 stehen hast, liegt die Vermutung nahe, 
dass du mit dem Returnwert der Funktion nicht das richtige machst. Nur 
leider sieht man das in deinem Screenshot nicht, weil wir nicht im Code 
scrollen können :-(

von Karl H. (kbuchegg)


Lesenswert?

Noch komplizierter hättest du aber in der init Funktion die Einstellung 
für die Referenzspannung in ADMUX nicht gestalten können?

Noch bin ich mir nicht sicher, ob das einfach nur blödsinnig oder 
blödsinnig falsch ist. Das muss ich erst mal auseinanderdröseln.

von adcfail (Gast)


Lesenswert?

>Wie kommt adc_average zu seinem Wert?

while(1)
  {
  ADC_average = ADC_average_read();
         }

von adcfail (Gast)


Lesenswert?

>Noch komplizierter hättest du aber in der init Funktion die Einstellung
für die Referenzspannung in ADMUX nicht gestalten können?

Vll. kompliziert, funktioniert jedoch so!

von Cyblord -. (cyblord)


Lesenswert?

adcfail schrieb:
>>Wie kommt adc_average zu seinem Wert?
>
> while(1)
>   {
>   ADC_average = ADC_average_read();
>          }

Ah ein Komiker vor dem Herrn ;-)

von Karl H. (kbuchegg)


Lesenswert?

adcfail schrieb:
>>Noch komplizierter hättest du aber in der init Funktion die Einstellung
> für die Referenzspannung in ADMUX nicht gestalten können?
>
> Vll. kompliziert, funktioniert jedoch so!

Na, wenn alles so funktionieren würde, wie du dir das vorstellst, dann 
sollte es ja auch kein Problem geben. Da es aber ein Problem gibt, 
stimmt also ganz offenbar irgendwo was nicht. Und unverständlicher Code, 
über den man erst mal 2 Minuten nachdenken muss um sich zu überzeugen, 
dass er das tut was er soll, macht die Sache nicht leichter.

von adcfail (Gast)


Lesenswert?

>Ah ein Komiker vor dem Herrn ;-)

Wie kann man das verstehen?

von spess53 (Gast)


Lesenswert?

Hi

Du hast linksbündig eingestellt. Also darfst du nur ADCH einlesen.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

adcfail schrieb:
>>Ah ein Komiker vor dem Herrn ;-)
>
> Wie kann man das verstehen?

Das das nicht dein Code sein kann.
Da wird die Ausgabefunktion nicht aufgerufen.


Was soll das eigentlich?
Ich dachte bisher eigentlich immer, dass der der Hilfe braucht alles 
dazu tun sollte, um seinen Helfern die Sache möglichst einfach zu 
machen. Und du veranstaltest stattdessen eine Rätselrunde.

von adcfail (Gast)


Lesenswert?

>Na, wenn alles so funktionieren würde, wie du dir das vorstellst, dann
sollte es ja auch kein Problem geben.

Ich habe diese ADMUX-Zeile auch mal auskommentiert, jedoch verhält sich 
das Programm genauso.

DANKE!

von Karl H. (kbuchegg)


Lesenswert?

Wo wird eigentlich die ADLAR Einstellung rausgerechnet?


Edit: spess hats früher gesehen

von Stefan E. (sternst)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Mittelwert davon immer noch 1023 und kann auch niemals größer als 1023
> sein.

Doch, weil 33 Messungen aufaddiert werden, aber nur durch 32 dividiert 
wird. ;-)

(aber natürlich ist das keine Erklärung für die 25666)

von Karl H. (kbuchegg)


Lesenswert?

Stefan Ernst schrieb:
> Karl Heinz Buchegger schrieb:
>> Mittelwert davon immer noch 1023 und kann auch niemals größer als 1023
>> sein.
>
> Doch, weil 33 Messungen aufaddiert werden, aber nur durch 32 dividiert
> wird. ;-)

Ah.
Hast du recht. Sieht man auch auf dem JPG so wahnsinnig gut.


(Manchmal frag ich mich schon, wozu eigentlich im Tutorial fix&fertige 
ADC Routinen rumliegen, die man benutzen und studieren kann)

von adcfail (Gast)


Lesenswert?

>Das das nicht dein Code sein kann.
Da wird die Ausgabefunktion nicht aufgerufen.


Ich versteh grad das Problem nicht, was für eine Ausgabefunktion?
Man sieht doch auf dem Bild eindeutig den nichtfunktionierenden Code. 
Mehr braucht man doch nicht!

Gruss

von Karl H. (kbuchegg)


Lesenswert?

adcfail schrieb:
>>Das das nicht dein Code sein kann.
> Da wird die Ausgabefunktion nicht aufgerufen.
>
>
> Ich versteh grad das Problem nicht, was für eine Ausgabefunktion?
> Man sieht doch auf dem Bild eindeutig den nichtfunktionierenden Code.
> Mehr braucht man doch nicht!

Na dann.
Dann such deine Fehler doch bitte nächstes mal selber. Ok?

Hinterher, wenn einem die anderen die Fehler gezeigt haben, ist es 
leicht klug zu scheissen.

von adcfail (Gast)


Lesenswert?

Ich konnte halt nicht mehr in einen Screenshot kopieren, weil ich auch 
den Debugger mit abbilden wollte.

Das war ja nicht böse gemeint! ;)

von Stefan H. (hohmi)


Lesenswert?

Der Wert des ADC steht im ADCL und ADCH Register. in deinem Bild wird 
jedoch nicht gezeigt wie der Wert in eine Variable übergeben oder 
berechnet wird.

Schau mal im Datenblatt deines Controllers (Bsp.: ATMEGA8 S.201) unter 
"The ADC Data Register - ADCL ans ADCH". Da wird die Verwendung von 
ADLAR = 0/1 beschrieben.

mfg
Hohmi

von adcfail (Gast)


Lesenswert?

@spess53: Vielen DANK für deine Hilfe!

@kbuckegg: Ich hab jetzt ein paar mal was gepostet, das einzige was von 
dir kommt sind ständig Vorwürfe oder irgendein doofes rumgemotze, du 
konntest mir in keinem einzigen Beitrag wirklich helfen!

Mir wurde nur durch Gasteinträge weitergeholfen!

Also was soll das.

Ich bin erst Anfänger, ich glaub es ist noch kein Meister vom Himmel 
gefallen und du bist auch keiner!

von adcfail (Gast)


Lesenswert?

@ Stefan H. : DANKE ich schau nochmal nach.

von adcfail (Gast)


Lesenswert?

Ich habe ADLAR mal auf right-adjust gestellt (so wie ich es eigentlich 
machen wollte) und nun funktioniert es.

DANKE nochmal!

von Cyblord -. (cyblord)


Lesenswert?

adcfail schrieb:

> @kbuckegg: Ich hab jetzt ein paar mal was gepostet, das einzige was von
> dir kommt sind ständig Vorwürfe oder irgendein doofes rumgemotze, du
> konntest mir in keinem einzigen Beitrag wirklich helfen!
> Also was soll das.

Das Problem ist, wenn jemand Code per Screenshot postet, dann weckt das 
erstmal gewisse Agressionen.

von adcfail (Gast)


Lesenswert?

@cyblord:

Das war das erste mal und nur mit der Absicht, die Debuggerergebnisse 
mit abzubilden.

Gruss

von Sepp (Gast)


Lesenswert?

Vorsicht!

Nicht mit 1023 rechnen, sondern mit 1024!
Macht zwar nicht viel aus, ist aber falsch!
Es gibt dazu genügend Foreneinträge!

von Cyblord -. (cyblord)


Lesenswert?

Sepp schrieb:
> Vorsicht!
>
> Nicht mit 1023 rechnen, sondern mit 1024!
> Macht zwar nicht viel aus, ist aber falsch!
> Es gibt dazu genügend Foreneinträge!

Richtig. Steht aber auch so im Datenblatt. Wer zu blöd ist, daraus die 
Formel abzumalen dem kann man halt auch nicht mehr helfen.

@adcfail:
Und was spricht dagegen, den Code als Textdatei(.c) hochzuladen und den 
Debugger als Screenshot?

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.