Forum: Mikrocontroller und Digitale Elektronik ADC Atmega88


von Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Jungs, habe ein Programm geschrieben, der mir 3 spannungegn misst und 
diese in einer Berechnung einbezieht und anschliessend an PC übertrage.
nun habe ich ich eine schwankende Messung, mal richtig mal falsch, 
obwohl meine Eigangsspannungen alle relativ konstant sind.

Nun habe ich die Bitte, ob jemand mal schauen kann, ob ich den 
integreirten Adc richtig verwende, besonders ob die Anweiseung für den 
ADMUX in der richtigen Stelle steht.Wäre auch dankbar für Andare 
Hinweise bezüglich des Programms.
Das Programm findt ihr im Anhang, ich verwende ein Atmega88

Danke im Voraus

Pedro

von Wolfgang (Gast)


Lesenswert?

Hallo!

Mein erster Gedanke war die Übertaktung des ADCs. Der Teiler steht auf 
32, was bei den im Quelltext angegebenen 3,072MHz richtig gewählt ist. 
Allerdings ist diese Frequenz ziemlich exotisch. Prüfe deshalb bitte 
zuerst, ob Du wirklich diese Taktung benutzt und nicht etwa den internen 
RC-Oszillator mit 8MHz, denn damit würdest Du übertakten und ein 
instabiles Wandeln provozieren.

Gruß - Wolfgang

von spess53 (Gast)


Lesenswert?

Hi

>was bei den im Quelltext angegebenen 3,072MHz richtig gewählt ist

Ist eine 'handelsübliche' Frequenz.

Wo kommen die Spannungen her? Quellimpedanz?

MfG Spess

von Pol (Gast)


Lesenswert?

Ich glaube nicht , ob das was mit der Quellimpedanz zu tun hat,da ich 
meine alte baugruppe auch an der gleichen spannungsversorgung 
anschliesse und es funktioniert.

von Pol (Gast)


Lesenswert?

hat das was mit der Signal() interrupt, weil diese schon veraltet ist??
MfG

von spess53 (Gast)


Lesenswert?

Hi

Sommerschlaf gehalten?

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Wie sieht deine Schaltung aus? Was hast du mit AREF gemacht?

Was bedeutet 'relativ konstant'?

Hast du dir schon mal die ADC Werte direkt ausgeben lassen, ohne 
Umrechnung? So wie du sie vom ADC erhältst.

von Karl H. (kbuchegg)


Lesenswert?

Du rechnest da

     a=1-(((Vml/Vms2)-1)/((Vml/Vms1)-1));

      b=((Vml/Vms2)-1)*((1/(Rsa*((Vml/Vms1)-1)))-(1/Rsi));

      c=((Rma*Rsa*((Vml/Vms2)-1))-Rsi*Rsa-Rsi*Rma)/(Rsi*Rma*Rsa);


      t=b+c;

        Rka=a/t;

ziemlich blauäugig drauf los.
Hast du schon versucht, ob du mathematisch diesen Formalismus noch 
vereinfachen kannst? Dinge zusammenziehn, Brüche auflösen, Doppelbrüche 
auflösen etc. Solange bis du alles in nur einer Formel beisammen hast.

Floating Point rechnen ist wie das Umschaufeln von Sand.
Mit jeder Operation verliert man ein bischen Sand und gewinnt ein 
bischen Schmutz dazu. Je weniger Operationen, desto reiner bleibt der 
Sand.

von Juergen G. (jup)


Lesenswert?

@Karl Heinz Buchegger

hast recht, auf den ersten Blick sieht das ziehmlich wuest aus.

Beim naeheren hinschauhen, sieht man das es schon zusammengefasst und 
c-Code optimiert ist.

@Anfänger

Das Datenblatt sagt, so in etwa,  dass man nach Aenderungen am MUX 
(Kanalwechsel) die erste Messung wegschmeissen soll.

So wie Du das machst, beziehst Du den Muell nach der Kanalumschaltung 
mit in Deine Mittelwertberechnung ein.
Keine Ahnung ob das bei 18 Messungen ins Gewicht faellt.

anderer Tip: bei 2^x Messungen reicht ein >> (right shift) fuer die 
Division.

Ju

von Karl H. (kbuchegg)


Lesenswert?

Juergen G. schrieb:
> @Karl Heinz Buchegger
>
> hast recht, auf den ersten Blick sieht das ziehmlich wuest aus.
>
> Beim naeheren hinschauhen, sieht man das es schon zusammengefasst und
> c-Code optimiert ist.

Ich weiss nicht, wie und wo du dir das angesehen hast. Aber diese 
Variablen sind durchgehend double und volatile. Wenn der Compiler da 
grossartig optimiert dann ist er fehlerhaft. Denn genau das darf er 
nicht.


> anderer Tip: bei 2^x Messungen reicht ein >> (right shift) fuer die
> Division.

Der Tip mit der 2-er Potenz ist gut. Aber den Shift lass besser den 
Compiler ersetzen.

von Juergen G. (jup)


Lesenswert?

Missverstaendnis

Das C-Code optimiert bezog sich auf die Formel, nicht auf die Wahl der 
Variablen.

Ju

von Karl H. (kbuchegg)


Lesenswert?

Juergen G. schrieb:
> Missverstaendnis
>
> Das C-Code optimiert bezog sich auf die Formel, nicht auf die Wahl der
> Variablen.

Ähm, das hängt zusammen.
Der Compiler darf die Formeln nicht verändern und zb gleiche Ausdrücke 
zusammenziehen, eben WEIL die Variablen alle volatile sind.

von Juergen G. (jup)


Lesenswert?

oben geschriebenes bezog sich auf folgende Aussage von Dir.

[schnipp]
>
> ziemlich blauäugig drauf los.
> Hast du schon versucht, ob du mathematisch diesen Formalismus noch
> vereinfachen kannst? Dinge zusammenziehn, Brüche auflösen, Doppelbrüche
> auflösen etc. Solange bis du alles in nur einer Formel beisammen hast.

Ju

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.