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
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.
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
> 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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.