ADC macht Probleme

Gast #3225254
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
Angehängte Dateien:
#3225312
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.
Gast #3225392
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
Gast #3225402
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
#3225410
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren