Forum: Mikrocontroller und Digitale Elektronik AD-Werte zeigen komisches Verhalten?


von Thorben (Gast)


Lesenswert?

Habe mit meinem STK525 und AT90USB, einen AD-Wandler in Betrieb, der die 
Werte dann über RS232 ans HYper Terminal sendet.
Was ich komisch finde:
1. die Werte stimmen nicht mit den gemessenen Werten überein
2. die Abweichungen sind nicht konstant
hier ein paar Beispiele:

               Multimeter         AT90USB           Differenz
                2791mV             2244mV              547
                3209mV             2586mV              623
                3824mV             3110mV              714
                4243mV             3460mV              783

Kann es sein, dass es was mit der Umrechnung Digitalwert in 
Spannungswert zu tun hat(Rundungsfehler..?)

hier mein Code:       val=val*(5000/1023);
               itoa(val,string,10);

Vielleicht hatte ja schon jemand ähnliche Probleme!
MfG Thorben

von Falk B. (falk)


Lesenswert?

@ Thorben (Gast)

>Kann es sein, dass es was mit der Umrechnung Digitalwert in
>Spannungswert zu tun hat(Rundungsfehler..?)

Kann sein.

>hier mein Code:       val=val*(5000/1023);
>               itoa(val,string,10);

Erst alle Multiplikationen, dann erst dividieren.

Festkommaarithmetik

MFG
Falk

von Johannes M. (johnny-m)


Lesenswert?

5000/1023 = 4
Bei Dir steht also Klartext val = val * 4. Wenn Du schon so klammerst, 
brauchst Du Dich über gar nichts zu wundern...

von Thorben (Gast)


Lesenswert?

wenn ich erst multipliziere komm ich aber außerhalb meines 
Wertebereichs!
val ist bei mir eine 16bit Variable.

Gruß Thorben

von GSP (Gast)


Lesenswert?

Weshalb div 1023 und nicht div 1024, das waere ein stueck einfacher ?

von Falk B. (falk)


Lesenswert?

@ Thorben (Gast)

>wenn ich erst multipliziere komm ich aber außerhalb meines
>Wertebereichs!
>val ist bei mir eine 16bit Variable.

Schon mal was von Zwischenergebnissen gehört? Ne 32 Bit variable ist fix 
angelegt.

MFG
Falk

von Johannes M. (johnny-m)


Lesenswert?

Thorben wrote:
> wenn ich erst multipliziere komm ich aber außerhalb meines
> Wertebereichs!
Ja, aber val*4 liefert trotzdem das falsche Ergebnis. Du wirst Dir also 
was anderes einfallen lassen müssen. Außerdem fehlen Dir anscheinend 
einige Grundlagen, was Arithmetik mit Integer-Werten angeht. Falk hat ja 
den Artikel zur Festkommaarithmetik bereits angeführt. Allerdings 
scheint Dir auch nicht klar zu sein, dass eine Division zweier 
Integer-Werte auch einen Integer-Wert zurückliefert. Außerdem musst Du 
bei einer Division selbst für eine Rundung sorgen. Sonst gibts nur den 
ganzzahligen Teil zurück (und deswegen ist 5000/1023 auch 4 und nicht 
5).

von Johannes M. (johnny-m)


Lesenswert?

GSP wrote:
> Weshalb div 1023 und nicht div 1024, das waere ein stueck einfacher ?
Das kommt noch hinzu. Die effektive Abweichung wäre unter 1 Promill...

von Karl H. (kbuchegg)


Lesenswert?

Thorben wrote:
> wenn ich erst multipliziere komm ich aber außerhalb meines
> Wertebereichs!
> val ist bei mir eine 16bit Variable.

macht ja nichts.
Du musst nur dafür sorgen, dass die Berechnung nicht 16 Bit
sondern 32 Bit ausgeführt wird. Das Ergebnis ist ja dann wieder
16 Bit.

C-Regel: Ist einer der Operanden in einer Berechnung ein
32 Bit Wert, dann wird auch der andere zu einem 32 Bit Wert
und die Berechnung wird als 32 Bit Arithmetik ausgeführt.

Genau das machst du mal, indem du die 5000 zu einem long
machst.
1
   uint16_t val;
2
3
   val = (uint16_t)( ( val * 5000UL ) / 1023 );

 5000 ist in 32 Bit, also wird auch val zu 32 Bit
hoch-'gehoben' und die Multplikation wird als 32 Bit Mult.
ausgeführt. Für die Division steht dann links ein 32 Bit
Zwischenergebnis und rechts eine 16 Bit Zahl. Diese wird
daher ebenfalls auf 32 Bit hoch-'gehoben' und die Division
in 32 Bit durchgeführt.
Das Ergebnis aus der ganzen Berechnung hat daher dann auch
32 Bit. Da wir aber wissen, dass es vom Wertebereich her
auch in 16 Bit passen wird, casten wir das mal zurecht
und weisen zu.

von Thorben (Gast)


Lesenswert?

Vielen Dank, werd ich gleich ausprobieren!
MfG Thorben

von Thorben (Gast)


Lesenswert?

Hallo,

ich habe jetzt die Umrechnung soweit im Griff, jedoch weichen die Werte 
doch noch immer erheblich vom eigentlichen Wert ab, und bei höherer 
Spannung wird auch die Sp.-differenz/der Fehler größer.
Habe den Eingangspin mal auf Masse gelegt, um zu sehen ob es einen 
Offset gibt, der ist aber gerade mal 5xLSB, also kann's daran ja nicht 
liegen.


Das Verwundernde, danach zeigte mir der Controller die korrekte Spannung 
an..., kann es sein dass sich der irgendwie nach einiger Zeit auflädt, 
oder so, und das Ergebnis verfäscht?


Gruß Thorben

von Ralph (Gast)


Lesenswert?

Poste mal das Schaltbild.
Solche Abweichungen sind oft die Folge einer "schlechten" Beschaltung.

von Thorben (Gast)


Lesenswert?

Beschaltung...
Ich verbinde den Eingangspin mit einem Spannungsteiler(mit Poti) und 
einer Batterie, und das wars auch schon.
Hab's gerade wieder probiert und es gibt schon wieder Abweichungen, 
obwohl ich nichts geändert habe, und gestern funktionierte es noch gut.
Wie kann das sein / Was ist da falsch ?
Und den Pin kurz auf Masse legen bringt es doch nicht!

Ich brauche bitte dringend Hilfe!

Gruß Thorben

von M. M. (miszou)


Lesenswert?

Hi

ist die Masse der Batterie auch mit der Masse deines MCs verbunden?

Gruß MISZOU

von Thorben (Gast)


Lesenswert?

Ja, ist sie.

Ich messe auch direkt am Pin die Spannung die reingeht, aber das 
Terminal gibt einen anderen Wert aus.

Könnte das evtl. an irgendwelchen Störungen liegen(elektromagn. 
Strahlung...) die auf den Controller einwirken?

MfG Thorben

von D. W. (dave) Benutzerseite


Lesenswert?

Lass mal die Rohwerte des ADC ausgeben, also vielleicht nur das 
höherwertige Byte.

von Thilo M. (Gast)


Lesenswert?

Nur so zur Sicherheit:
hast du den richtigen Eingangspin benutzt? Ich meine den, an dem du 
misst.
Durch Übersprechen auf einen offenen Nachbarpin (an dem gemessen wird) 
kann das passieren.

von Thorben (Gast)


Lesenswert?

Der Pin ist der Richtige, und die Rohwerte sind auch OK(also an der 
Umrechnung liegt es nicht).

Ich habe gerad an den benachbarten Pins mit einem DMM gemessen;
an drei Pins liegt Betriebsspannung, ob die darauf eine Auswirkung 
haben?
Aber ich glaube die kann man auch nicht abstellen.
Auf dem STK525 sind die PortPins vom AD-Wandler u.a. auch die 
Schnittstelle für ein JTAG-Interface.

Ich weiß wirklich nicht mehr weiter...

von Karl H. (kbuchegg)


Lesenswert?

Du beschreibst da seltsame Effekte. zb.

> Habe den Eingangspin mal auf Masse gelegt, um zu sehen ob es einen
> Offset gibt, der ist aber gerade mal 5xLSB

5xLSB ist schon heftig.
Wenn du den Pin auf Masse legst, dann müsste der Eingang wie
angenagelt auf 0 stehen.


Also: Schaltbild, ev. Foto vom Aufbau, Programm
Ansonsten ist das alles ein Stochern im Nebel.

von Thorben (Gast)


Angehängte Dateien:

Lesenswert?

Das mit den 5LSB war auch ein Irrtum.

Habe jetz mal den Aufbau angehängt, ist wohl nicht optimal, sollte aber 
seinen Zweck erfüllen, ich weiß auch nicht genau, was man beachten muss.
hier meine Umrechnung:(10bit Wandler)

adc_val=(U16)((adc_val*((U32)50000))/1023);


Ich hoffe ihr könnt damit was anfangen..

Thorben

von Thorben (Gast)


Angehängte Dateien:

Lesenswert?

Und hier noch der Schaltplan zum Interface, wo auch die AD-Pins(PortF) 
dran sind.
Als Eingang benutze ich PF4

von Thorben (Gast)


Lesenswert?

Falls euch das aufgefallen ist.. die Batterie ist abgeklemmt, Kabel vom 
+ hat gelöst, schlecht gelötet! Werd ich gleich mal neu machen.

Guß Thorben

von Vorteiler (Gast)


Lesenswert?

Wieso geht das minus Kabel der Batt. an einen Widerstand und nicht an 
Masse?

von steve (Gast)


Lesenswert?

Ich denke die Qiderstände im Spannungsteiler sind zu groß im Verhältnis 
zum internen R aus dem RC vom AD. Wenn das der Fall ist, musst Du 
"langsamer" messen. Also mal den Takt vom ADC absenken, bzw Teiler 
erhöhen.

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.