ADC macht Probleme

Gast #3225254
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.