Forum: Mikrocontroller und Digitale Elektronik ADC macht Probleme


von Guenther K (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich benötige Eure Hilfe. ich arbeite mich seit einigen Tagen in MSP430 
ein und verwende dafür ein MSP430 Launchpad und den G2553. Ich möchte 
eine Spannung einlesen und diese "glätten". Dafür habe ich die Funktion 
getfilteredvalue(unsigned int channel). Diese ruft die Routine 
analogRead() auf. Jedoch werden die Werte nicht geglättet sondern 
wachsen bis die Variable überläuft. Ich hab das Problem mal isoliert in 
der beigefügten Datei. So wie sie ist, ist sie mit dem Code Composer 
Studio (5.3) kompilierbar. Das Problem besteht in dieser Datei 
ebenfalls.
Hoffentlich könnt Ihr mir bei dem helfen.
Danke schonmal

Guenther

von Wusel D. (stefanfrings_de)


Lesenswert?

1
vcc = vcc + ((adcval - vcc)* 16 / 32);
Kein Wunder, denn hier wird ständig etwas aufaddiert.

Mit glätten meinst Du wohl den Mittelwert von mehreren Messungen. Ich 
glaube, dass heisst Integral. Du könntest die letzten 4 Messungen in ein 
Array speichern und nach jedem Update den Mittelwert bilden:
1
vcc[3]=vcc[2];
2
vcc[2]=vcc[1];
3
vcc[1]=vcc[0];
4
vcc[0]=analogRead(INCH_5);
5
return (vcc[0]+vcc[1]+vcc[2]+vcc[3])/4;
Für gute Performance sollte das Aray nicht allzu groß sein und aus 
binärer Sicht "runde" Größe haben, also 2, 4, 8, 16 ...

Bei mehr als 4 würde ich darüber nachdenken, einen Ringpuffer zu 
verwenden, mit Pointer auf Anfang und Ende. Dann entfällt das Umkopieren 
der einzelnen Werte.

von Guenther K (Gast)


Lesenswert?

Hallo,

danke schonmal für deine Hilfe Stefan. Die von dir zitierte Zeile war 
eigentlich so gedacht, dass da auch was abgezogen werden kann, nämlich 
dann, wenn der neue Wert (adcval) kleiner ist, als der bisherige Wert 
(vcc). Irgendwas klemmt an der ganzen Sache aber, muss ich da evtl. 
irgendwo einen cast machen?

Gruß

Guenther

von Wusel D. (stefanfrings_de)


Lesenswert?

> nämlich dann, wenn

Also brauchst Du eine if-Abfrage, wenn Du das so machen willst. Ich 
denke jedoch, dass dieser Ansatz nicht zielführend ist.

von Guenther K (Gast)


Lesenswert?

Warum benötige ich dafür eine if-Abfrage? Es wird doch die Differenz 
(adcval - vcc) negativ, wenn adcval kleiner ist als vcc. Etwas negatives 
zu addieren führt doch zum Subtrahieren. Oder funktioniert das hier so 
nicht?
Danke für deine Hilfe

von Karl H. (kbuchegg)


Lesenswert?

Guenther K schrieb:
> Hallo,
>
> danke schonmal für deine Hilfe Stefan. Die von dir zitierte Zeile war
> eigentlich so gedacht, dass da auch was abgezogen werden kann, nämlich
> dann, wenn der neue Wert (adcval) kleiner ist, als der bisherige Wert
> (vcc).

Da aber sowohl adcval als auch vcc vom Datentyp her jeweils ein 
'unsigned int' sind, kann
1
    adcval - vcc
aber niemals negativ werden. Denn
1
   unsigned int - unsigned int
wird als vorzeichenlose Subtraktion durchgeführt und liefert wiederrum 
einen unsigned int, also etwas ohne Vorzeichen.

> Irgendwas klemmt an der ganzen Sache aber, muss ich da evtl.
> irgendwo einen cast machen?

Man könnte.
Einfacher ist es aber du benutzt für deine Variablen ganz einfach den 
richtigen Datentyp. Dann regeln sich die Datentypen in den 
arithmetischen Operationen und auch die der Zwischenergebnisse ganz von 
alleine richtig.

von Guenther K (Gast)


Lesenswert?

Klasse, das wars. Ich verwend jetzt signed int und das Programm verhält 
sich, wie ich es erwarte.
Danke euch!

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.