Thursday 9 November 2017

Gleitender Mittelwert Mikrocontroller


Eine der Hauptanwendungen für das Arduino-Board ist das Lesen und Protokollieren von Sensordaten. Zum Beispiel überwacht man den Druck jede Sekunde des Tages. Da hohe Abtastraten oft Spikes in den Graphen erzeugen, möchte man auch einen Mittelwert der Messungen haben. Da die Messungen nicht statisch in der Zeit sind, was wir oft brauchen, ist ein laufender Durchschnitt. Dies ist der Durchschnitt einer bestimmten Periode und sehr wertvoll bei der Trendanalyse. Die einfachste Form eines laufenden Durchmessers kann durch einen Code ausgeführt werden, der auf dem vorherigen laufenden Durchschnitt basiert: Wenn man keine Gleitkomma-Mathematik verwenden möchte - da dies Speicherplatz einnimmt und Geschwindigkeit sinkt - kann man das in der Integer-Domäne vollständig durchführen. Die Teilung durch 256 in dem Beispielcode ist ein Schiebe-Recht 8, das schneller ist als eine Teilung durch z. B. 100. Dies gilt für jede Potenz von 2 als Teiler und man muss nur darauf achten, dass die Summe der Gewichte gleich der Potenz von 2 ist. Und natürlich sollte man darauf achten, dass es keinen Zwischenüberlauf gibt (erwägen Sie unsigned long) Eine genauere laufende Durchschnitt, in concreto aus den letzten 10 Messungen, benötigen Sie ein Array (oder verkettete Liste), um sie zu halten. Diese Anordnung wirkt wie ein kreisförmiger Puffer und bei jeder neuen Messung wird die älteste entfernt. Der laufende Durchschnitt wird als die Summe aller Elemente geteilt durch die Anzahl der Elemente in dem Array berechnet. Der Code für den laufenden Durchschnitt wird etwa so aussehen: Nachteil dieses Codes ist, dass das Array, um alle Werte zu halten, ziemlich groß werden kann. Wenn Sie eine Messung pro Sekunde haben und Sie wollen einen laufenden Durchschnitt pro Minute benötigen Sie ein Array von 60 ein durchschnittliches pro Stunde würde ein Array von 3600 benötigen. Das könnte nicht auf diese Weise auf einem Arduino getan werden, da es nur 2K RAM hat. Allerdings kann durch den Bau eines 2-stufigen Durchschnitts kann es ganz gut angegangen werden (Disclaimer: nicht für alle Messungen). Im psuedo-Code: Da für jede runningAverage-Funktion ein neues internes statisches Array benötigt wird, wird dieses als Klasse implementiert. RunningAverage-Bibliothek Die RunningAverage-Bibliothek bildet eine Klasse der oben genannten Funktion, so dass sie mehrfach in einer Skizze verwendet werden kann. Es entkoppelt die add () - und die avg () - Funktion, um ein wenig flexibler zu sein, z. B. Kann man den Durchschnitt mehrmals nennen, ohne eine Sache hinzuzufügen. Beachten Sie, dass jede Instanz der Klasse ein eigenes Array hinzufügt, um Messungen zu halten, und dass dies die Speicherauslastung addiert. Die Schnittstelle der Klasse wird so klein wie möglich gehalten. Anmerkung: Bei Version 0.2 werden die Namen der Methoden beschreibender. Eine kleine Skizze zeigt, wie sie verwendet werden kann. Ein Zufallsgenerator wird verwendet, um einen Sensor nachzuahmen. In setup () wird der myRA gelöscht, so dass wir mit dem Hinzufügen neuer Daten beginnen können. In Schleife () wird zuerst eine Zufallszahl erzeugt und in einen Float umgewandelt, der zu myRA hinzugefügt werden soll. Dann wird das runningAverage auf den seriellen Port gedruckt. Man könnte es auch auf einem LCD-Display oder über ethernet etc. Wenn 300 Elemente hinzugefügt myRA ist gelöscht, um neu zu beginnen. Um die Bibliothek zu verwenden, machen Sie einen Ordner in Ihrem SKETCHBOOKPATHlibaries mit dem Namen RunningAverage und legen Sie die. h und. cpp dort. Fügen Sie optional ein Beispielunterverzeichnis hinzu, um die Beispielanwendung zu platzieren. 2011-01-30: Anfangsversion 2011-02-28: fester fehlender Zerstörer in der. h Akte 2011-02-28: entfernter Standardkonstruktor 2012--. TrimValue () Yuval Naveh hinzugefügt trimValue (gefunden im Web) 2012-11-21: refactored 2012-12-30: hinzugefügt fillValue () refactored für die Veröffentlichung 2014-07-03: hinzugefügt Speicherschutz-Code - wenn internen Array nicht zugeordnet werden kann Größe Wird 0. Dies ist, um das hier beschriebene Problem zu lösen - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Test ausführlich. Template-Klasse RunningAverage. h RunningAverage. cppForum: Digitale Signalverarbeitung DSP MOVING AVERAGE FILTER in FastAVR Dim-Index als Byte-Dim-Wert (4) als Byte-Dim-Durchschnitt als Word-Dim-Anzahl als Byte-Index 1 39arrays in bascom beginnen mit 1 :-( do value ( Index) getadc (x) 39messen incr Index wenn Index 5 dann Index 1 für Zählwert 1 bis 4 durchschnittlicher Mittelwert (Zählwert) next shift average, right, 2 39hh schneller als 4 loop Fastavr wird ja nicht sooo viel anders sein Anstatt do - Schlaufe Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst an Umfragen in diesem Forum nicht mitmachen : Index-1) Durchschnitt bei Index 5 dann Index 1 Durchschnitt 0 für Zählwert 1 bis 4 Durchschnittlicher Mittelwert (Zählerstand) Nächster Schichtdurchschnitt, rechts 2 39Höhe schneller als 4 Schleife Noch ne Idee zum gltten, ev. Etwas trge: - Wert messen als Anfang Dann immer: - neuen Wert messen Wert (3Wert neuer Wert) 4 Nur fällt es noch einen interessiert. Deutsch - Übersetzung - Linguee als Übersetzung von "." Vorschlagen Linguee - Wörterbuch Deutsch - Englisch Andere Leute übersetzten. Das macht diese Methoden aber langsamer mit steigernder Fensterlnge. Nachdem der Mittelwert linear ist, kann ich die Summe auch einfach zerlegen und spare mir so jedesmal die Summe ausgewerten. Define WindowSize 4 int samplesWindowSize int index 0 int average 0 while (1) Alten Wert abziehen. Durchschnitt - samplesindex Neuen Wert Zufgen. Beispieleindex input WindowSize Neuen Mittelwert bilden. Durchschnittliche Stichprobenindex Im Ringbuffer weiterstellen Indexindex WindowSize Der Code ist keinesfalls. Desweiteren muss man bei diesem Verfahren die Rundungsfehler beachten, d. h. Bei Benutzung von Integer-Arithmetik ist der gewonnene Mittelwert etwas ungenauer. Autor: Martin (Gast) Datum: 02.05.2009 03:29 Uhr mal ein ganz aus dem Grund: Warum erhhst Du nicht einfach die Sampling-Zeit am AD-Wandler. Also hast Du einen Hardware-Moving-Average-Filter Nimm einfach ne viermal so hohe Samplingrate, ist das gleiche, wie wenn Dein AD-Wandler vier Werte aufnimmt und Du sie dann wieder mittelst (Okay gesame Sampling - und Convert - Zeit betrachten) ) Die vier Einzelwerte interessiert Dich ja auch nicht und die Werte der AD-Wandler drfte auch noch. Nur so ein Gedanke. Mal ein ganz persönlicher: Warum erhhst Du nicht einfach die Sampling-Zeit am AD-Wandler. Also hast Du einen Hardware-Moving-Average-Filter N so hat man im besten Fall eine Unterabtastung. Wenn man vor dem ADC Eingang noch einen RC-Tiefpass hat. Ohne diesen schlug die SampleampHoldstufe des ADCs zu, wir reden ja vom AVR. Und die bentigt nur 1.5 ADC Takte um das Eingangssignal zu sampeln. Antwort schreiben Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail antworten. HTML-Codec avrasmAVR-Assembler-Codeavrasm codeCode in anderen Sprachen, ASCII-Zeichnungencode mathFormel in LaTeX-Syntaxmath Titel - Link zu Artikel Verweis auf anderen Beitrag einfgen: Rechtsklick auf Beitragstitel, Adresse kopieren und in den Text einfgen

No comments:

Post a Comment