Monday, February 20, 2017

Moving Average Filter Msp430

Wie andere schon erwähnt haben, sollten Sie einen IIR (Endlosimpulsantwort) - Filter anstelle des FIR (Finite Impulse Response) Filter, den Sie jetzt verwenden. Es gibt mehr dazu, aber auf den ersten Blick werden FIR-Filter als explizite Windungen und IIR-Filter mit Gleichungen implementiert. Das besondere IIR-Filter, das ich viel in Mikrocontrollern verwende, ist ein einpoliges Tiefpaßfilter. Dies ist das digitale Äquivalent eines einfachen R-C-Analogfilters. Für die meisten Anwendungen haben diese bessere Eigenschaften als der Kastenfilter, den Sie verwenden. Die meisten Verwendungen eines Box-Filter, die ich begegnet bin, sind ein Ergebnis von jemand nicht Aufmerksamkeit in der digitalen Signalverarbeitung Klasse, nicht als Ergebnis der Notwendigkeit ihrer besonderen Eigenschaften. Wenn Sie nur wollen, um hohe Frequenzen zu dämpfen, dass Sie wissen, Rauschen sind, ist ein einpoliges Tiefpassfilter besser. Der beste Weg, um ein digitales in einem Mikrocontroller zu implementieren, ist in der Regel: FILT lt - FILT FF (NEW - FILT) FILT ist ein Stück persistenter Zustand. Dies ist die einzige persistente Variable, die Sie benötigen, um diesen Filter zu berechnen. NEU ist der neue Wert, den der Filter mit dieser Iteration aktualisiert. FF ist die Filterfraktion. Die die Schwere des Filters einstellt. Betrachten Sie diesen Algorithmus und sehen Sie, dass für FF 0 der Filter unendlich schwer ist, da sich der Ausgang nie ändert. Für FF 1 ist das eigentlich gar kein Filter, da der Ausgang nur dem Eingang folgt. Nützliche Werte sind dazwischen. Auf kleinen Systemen wählen Sie FF auf 12 N, so dass die Multiplikation mit FF als Rechtsverschiebung um N Bits erreicht werden kann. Beispielsweise könnte FF 116 sein und das Multiplizieren mit FF daher eine Rechtsverschiebung von 4 Bits. Andernfalls benötigt dieses Filter nur eine Subtraktion und eine Addition, obwohl die Zahlen in der Regel größer als der Eingangswert sein müssen (mehr über die numerische Genauigkeit in einem separaten Abschnitt weiter unten). Ich nehme in der Regel AD-Messwerte deutlich schneller als sie benötigt werden und wenden Sie zwei dieser Filter kaskadiert. Dies ist das digitale Äquivalent von zwei R-C-Filtern in Serie und dämpft um 12 dBoktave über der Rolloff-Frequenz. Allerdings für AD-Lesungen seine in der Regel mehr relevant, um das Filter im Zeitbereich zu betrachten, indem man seine Schrittantwort. Dies zeigt Ihnen, wie schnell Ihr System eine Änderung sehen wird, wenn die Sache, die Sie messen, ändert. Zur Erleichterung der Gestaltung dieser Filter (was nur bedeutet Kommissionierung FF und entscheiden, wie viele von ihnen zu kaskadieren), benutze ich mein Programm FILTBITS. Sie legen die Anzahl der Schaltbits für jede FF in der kaskadierten Filterreihe fest und berechnen die Schrittantwort und andere Werte. Eigentlich habe ich in der Regel laufen diese über mein Wrapper-Skript PLOTFILT. Dies führt FILTBITS, die eine CSV-Datei macht, dann die CSV-Datei. Beispielsweise ist hier das Ergebnis von PLOTFILT 4 4: Die beiden Parameter zu PLOTFILT bedeuten, dass es zwei Filter gibt, die von dem oben beschriebenen Typ kaskadiert sind. Die Werte von 4 geben die Anzahl der Schaltbits an, um die Multiplikation mit FF zu realisieren. Die beiden FF-Werte sind daher in diesem Fall 116. Die rote Spur ist die Einheit Schritt Antwort, und ist die Hauptsache zu betrachten. Dies bedeutet beispielsweise, dass sich der Ausgang des kombinierten Filters auf 90 des neuen Wertes in 60 Iterationen niederschlägt, falls sich der Eingang sofort ändert. Wenn Sie ca. 95 Einschwingzeit kümmern, dann müssen Sie etwa 73 Iterationen warten, und für 50 Einschwingzeit nur 26 Iterationen. Die grüne Kurve zeigt Ihnen den Ausgang einer einzelnen Amplitude. Dies gibt Ihnen eine Vorstellung von der zufälligen Rauschunterdrückung. Es sieht aus wie keine einzelne Probe wird mehr als eine 2,5 Änderung in der Ausgabe verursachen. Die blaue Spur soll ein subjektives Gefühl geben, was dieser Filter mit weißem Rauschen macht. Dies ist kein strenger Test, da es keine Garantie gibt, was genau der Inhalt der Zufallszahlen war, die als der weiße Rauscheneingang für diesen Durchlauf von PLOTFILT ausgewählt wurden. Seine nur, um Ihnen ein grobes Gefühl, wie viel es gequetscht werden und wie glatt es ist. PLOTFILT, vielleicht FILTBITS, und viele andere nützliche Dinge, vor allem für PIC-Firmware-Entwicklung ist verfügbar in der PIC Development Tools-Software-Release auf meiner Software-Downloads-Seite. Hinzugefügt über numerische Genauigkeit Ich sehe aus den Kommentaren und nun eine neue Antwort, dass es Interesse an der Diskussion der Anzahl der Bits benötigt, um diesen Filter zu implementieren. Beachten Sie, dass das Multiplizieren mit FF Log 2 (FF) neue Bits unterhalb des Binärpunkts erzeugt. Auf kleinen Systemen wird FF gewöhnlich mit 12 N gewählt, so daß diese Multiplikation tatsächlich durch eine Rechtsverschiebung von N Bits realisiert wird. FILT ist daher meist eine feste Ganzzahl. Beachten Sie, dass dies ändert keine der Mathematik aus der Prozessoren Sicht. Wenn Sie z. B. 10-Bit-AD-Lesungen und N 4 (FF 116) filtern, benötigen Sie 4 Fraktionsbits unter den 10-Bit-Integer-AD-Messwerten. Einer der meisten Prozessoren, youd tun 16-Bit-Integer-Operationen aufgrund der 10-Bit-AD-Lesungen. In diesem Fall können Sie immer noch genau die gleichen 16-Bit-Integer-Opertions, aber beginnen mit der AD-Lesungen um 4 Bits verschoben verschoben. Der Prozessor kennt den Unterschied nicht und muss nicht. Das Durchführen der Mathematik auf ganzen 16-Bit-Ganzzahlen funktioniert, ob Sie sie als 12,4 feste oder wahre 16-Bit-Ganzzahlen (16,0 Fixpunkt) betrachten. Im Allgemeinen müssen Sie jedem Filterpole N Bits hinzufügen, wenn Sie aufgrund der numerischen Darstellung kein Rauschen hinzufügen möchten. Im obigen Beispiel müsste das zweite Filter von zwei 1044 18 Bits haben, um keine Informationen zu verlieren. In der Praxis auf einer 8-Bit-Maschine bedeutet, dass youd 24-Bit-Werte verwenden. Technisch nur den zweiten Pol von zwei würde den größeren Wert benötigen, aber für Firmware Einfachheit ich in der Regel die gleiche Darstellung, und damit der gleiche Code, für alle Pole eines Filters. Normalerweise schreibe ich eine Unterroutine oder Makro, um eine Filterpol-Operation durchzuführen, dann gelten, dass für jeden Pol. Ob eine Unterroutine oder ein Makro davon abhängt, ob Zyklen oder Programmspeicher in diesem Projekt wichtiger sind. So oder so, ich benutze einige Scratch-Zustand, um NEU in die subroutinemacro, die FILT Updates, sondern auch lädt, dass in den gleichen Kratzer NEU war in. Dies macht es einfach, mehrere Pole anzuwenden, da die aktualisierte FILT von einem Pole ist die NEUE Der nächsten. Wenn ein Unterprogramm, ist es sinnvoll, einen Zeiger auf FILT auf dem Weg in, die auf nur nach FILT auf dem Weg nach draußen aktualisiert wird. Auf diese Weise arbeitet das Unterprogramm automatisch auf aufeinanderfolgenden Filtern im Speicher, wenn es mehrmals aufgerufen wird. Mit einem Makro benötigen Sie nicht einen Zeiger, da Sie in der Adresse passieren, um auf jeder Iteration zu arbeiten. Code-Beispiele Hier ist ein Beispiel für ein Makro wie oben für eine PIC 18 beschrieben: Und hier ist ein ähnliches Makro für eine PIC 24 oder dsPIC 30 oder 33: Beide Beispiele sind als Makros mit meinem PIC-Assembler-Präprozessor implementiert. Die mehr fähig ist als eine der eingebauten Makroanlagen. Clabacchio: Ein weiteres Thema, das ich erwähnen sollte, ist die Firmware-Implementierung. Sie können eine einpolige Tiefpassfilter-Subroutine einmal schreiben, dann mehrfach anwenden. Tatsächlich schreibe ich normalerweise solch ein Unterprogramm, um einen Zeiger im Gedächtnis in den Filterzustand zu nehmen, dann ihn voranbringen den Zeiger, so daß er nacheinander leicht aufgerufen werden kann, um mehrpolige Filter zu verwirklichen. Ndash Olin Lathrop Apr 20 12 at 15:03 1. Dank sehr viel für Ihre Antworten - alle von ihnen. Ich beschloss, dieses IIR-Filter zu verwenden, aber dieser Filter wird nicht als Standard-Tiefpaßfilter verwendet, da ich die Zählerwerte berechnen und sie vergleichen muss, um Änderungen in einem bestimmten Bereich zu erkennen. Da diese Werte von sehr unterschiedlichen Dimensionen abhängig von Hardware Ich wollte einen Durchschnitt nehmen, um in der Lage sein, auf diese Hardware spezifischen Änderungen automatisch reagieren. Wenn Sie mit der Beschränkung einer Macht von zwei Anzahl von Elementen zu durchschnittlich leben können (dh 2,4,8,16,32 etc), dann kann die Teilung einfach und effizient auf einem getan werden Low-Performance-Mikro ohne dedizierte Division, weil es als Bit-Shift durchgeführt werden kann. Jede Schicht rechts ist eine Macht von zwei zB: Der OP dachte, er hatte zwei Probleme, die Teilung in einem PIC16 und Speicher für seinen Ringpuffer. Diese Antwort zeigt, dass die Aufteilung nicht schwierig ist. Zwar adressiert es nicht das Gedächtnisproblem, aber das SE-System erlaubt Teilantworten, und Benutzer können etwas von jeder Antwort für selbst nehmen, oder sogar redigieren und kombinieren andere39s Antworten. Da einige der anderen Antworten eine Divisionsoperation erfordern, sind sie ähnlich unvollständig, da sie nicht zeigen, wie dies auf einem PIC16 effizient erreicht werden kann. Ndash Martin Apr 20 12 at 13:01 Es gibt eine Antwort für einen echten gleitenden Durchschnitt Filter (auch bekannt als Boxcar-Filter) mit weniger Speicher Anforderungen, wenn Sie dont mind Downsampling. Es heißt ein kaskadiertes Integrator-Kamm-Filter (CIC). Die Idee ist, dass Sie einen Integrator, die Sie nehmen Differenzen über einen Zeitraum, und die wichtigsten Speicher-sparende Gerät ist, dass durch Downsampling, müssen Sie nicht jeden Wert des Integrators zu speichern. Es kann mit dem folgenden Pseudocode implementiert werden: Ihre effektive gleitende durchschnittliche Länge ist decimationFactorstatesize, aber Sie müssen nur um Stateize Proben zu halten. Offensichtlich können Sie bessere Leistung erzielen, wenn Ihr stateize und decimationFactor Potenzen von 2 sind, so dass die Divisions - und Restoperatoren durch Shifts und Masken ersetzt werden. Postscript: Ich stimme mit Olin, dass Sie immer sollten einfache IIR-Filter vor einem gleitenden durchschnittlichen Filter. Wenn Sie die Frequenz-Nullen eines Boxcar-Filters nicht benötigen, wird ein 1-poliger oder 2-poliger Tiefpassfilter wahrscheinlich gut funktionieren. Auf der anderen Seite, wenn Sie für die Zwecke der Dezimierung filtern (mit einer hohen Sample-Rate-Eingang und Mittelung es für die Verwendung durch einen Low-Rate-Prozess), dann kann ein CIC-Filter genau das, was Sie suchen. (Vor allem, wenn Sie stateize1 verwenden und den Ringbuffer insgesamt mit nur einem einzigen vorherigen Integrator-Wert zu vermeiden) Theres einige eingehende Analyse der Mathematik hinter dem ersten Auftrag IIR-Filter, Olin Lathrop bereits beschrieben hat auf der Digital Signal Processing Stack-Austausch (Enthält viele schöne Bilder.) Die Gleichung für diese IIR-Filter ist: Dies kann mit nur Ganzzahlen und keine Division mit dem folgenden Code implementiert werden (möglicherweise benötigen einige Debugging, wie ich aus dem Speicher wurde.) Dieser Filter approximiert einen gleitenden Durchschnitt von Die letzten K Proben durch Setzen des Wertes von alpha auf 1K. Führen Sie dies im vorherigen Code durch die Definition von BITS auf LOG2 (K), dh für K 16 gesetzt BITS auf 4, für K 4 gesetzt BITS auf 2, etc. (Ill Überprüfung der Code hier aufgelistet, sobald ich eine Änderung erhalten und Bearbeiten Sie diese Antwort, wenn nötig.) Antwort # 1 am: Juni 23, 2010, um 4:04 Uhr Heres ein einpoliges Tiefpassfilter (gleitender Durchschnitt, mit Cutoff-Frequenz CutoffFrequency). Sehr einfach, sehr schnell, funktioniert super, und fast kein Speicher Overhead. Hinweis: Alle Variablen haben einen Bereich über die Filterfunktion hinaus, mit Ausnahme des übergebenen newInput Hinweis: Dies ist ein einstufiger Filter. Mehrere Stufen können zusammen kaskadiert werden, um die Schärfe des Filters zu erhöhen. Wenn Sie mehr als eine Stufe verwenden, müssen Sie DecayFactor anpassen (was die Cutoff-Frequenz betrifft), um sie zu kompensieren. Und natürlich alles, was Sie brauchen, ist die beiden Zeilen überall platziert, brauchen sie nicht ihre eigene Funktion. Dieser Filter hat eine Rampenzeit, bevor der gleitende Durchschnitt diejenige des Eingangssignals darstellt. Wenn Sie diese Rampenzeit umgehen müssen, können Sie MovingAverage einfach auf den ersten Wert von newInput anstelle von 0 initialisieren und hoffen, dass der erste newInput kein Ausreißer ist. (CutoffFrequencySampleRate) einen Bereich zwischen 0 und 0,5 hat. DecayFactor ist ein Wert zwischen 0 und 1, in der Regel in der Nähe von 1. Single-precision Schwimmer sind gut genug für die meisten Dinge, ich bevorzuge nur Doppel. Wenn Sie mit ganzen Zahlen bleiben müssen, können Sie DecayFactor und Amplitude Factor in Fractional Integers umwandeln, in denen der Zähler als Integer gespeichert wird und der Nenner eine Ganzzahl von 2 ist (so können Sie Bit-Shift nach rechts als die Nenner, anstatt sich während der Filterschleife teilen zu müssen). Zum Beispiel, wenn DecayFactor 0.99, und Sie Ganzzahlen verwenden möchten, können Sie DecayFactor 0.99 65536 64881. Und dann immer wenn Sie multiplizieren mit DecayFactor in Ihrer Filterschleife, nur verschieben Sie das Ergebnis 16. Für weitere Informationen über dieses, ein ausgezeichnetes Buch thats Online, Kapitel 19 auf rekursive Filter: dspguidech19.htm PS Für das Moving Average-Paradigma, einen anderen Ansatz für die Einstellung DecayFactor und AmplitudeFactor, die möglicherweise mehr relevant für Ihre Bedürfnisse, können Sie sagen, dass Sie wollen, dass die vorherigen, etwa 6 Artikeln gemittelt, es diskret tun, fügen Sie 6 Elemente und teilen durch 6, so Können Sie den AmplitudeFactor auf 16 und DecayFactor auf (1.0 - AmplitudeFactor) einstellen. Antwortete May 14 12 at 22:55 Jeder andere hat kommentiert gründlich über den Nutzen der IIR vs FIR, und auf Power-of-two-Division. Id nur, um einige Implementierungsdetails zu geben. Das unten genannte funktioniert gut auf kleinen Mikrocontrollern ohne FPU. Es gibt keine Multiplikation, und wenn Sie N eine Potenz von zwei halten, ist die gesamte Division ein-Zyklus-Bit-Verschiebung. Basic FIR-Ringpuffer: Halten Sie einen laufenden Puffer der letzten N-Werte und einen laufenden SUM aller Werte im Puffer. Jedes Mal, wenn eine neue Probe kommt, subtrahieren Sie den ältesten Wert im Puffer von SUM, ersetzen Sie ihn durch das neue Sample, fügen Sie das neue SUM zu SUM hinzu und geben Sie SUMN aus. Modifizierter IIR-Ringpuffer: Halten Sie einen laufenden SUM der letzten N-Werte. Jedes Mal, wenn ein neues Sample in SUM - SUMN kommt, fügen Sie das neue Sample hinzu und geben SUMN aus. Antwort # 1 am: August 28, 2008, um 13:45 Uhr Wenn Sie 399m lesen Sie Recht, you39re beschreiben ein erster Ordnung IIR-Filter der Wert you39re subtrahieren isn39t der älteste Wert, der herausfällt, sondern ist stattdessen der Durchschnitt der vorherigen Werte. Erstklassige IIR-Filter können sicherlich nützlich sein, aber I39m nicht sicher, was du meinst, wenn Sie vorschlagen, dass der Ausgang ist der gleiche für alle periodischen Signale. Bei einer Abtastrate von 10 kHz liefert das Einspeisen einer 100 Hz-Rechteckwelle in ein 20-stufiges Kastenfilter ein Signal, das für 20 Abtastungen gleichmäßig ansteigt, für 30 sitzt, für 20 Abtastungen gleichmäßig sinkt und für 30 sitzt. Ein erster Ordnung IIR-Filter. Ndash Supercat Aug 28 13 am 15:31 wird eine Welle, die scharf anfängt zu steigen und allmählich Niveaus in der Nähe (aber nicht auf) das Eingabe-Maximum, dann scharf beginnt zu fallen und allmählich in der Nähe (aber nicht auf) der Eingabe Minimum. Sehr unterschiedliches Verhalten. Ndash Supercat Ein Problem ist, dass ein einfacher gleitender Durchschnitt kann oder auch nicht nützlich sein. Mit einem IIR-Filter können Sie einen schönen Filter mit relativ wenigen Calcs erhalten. Die FIR Sie beschreiben kann Ihnen nur ein Rechteck in der Zeit - ein sinc in freq - und Sie können nicht die Seitenkeulen zu verwalten. Es kann lohnt sich, in ein paar ganzzahlige Multiplikatoren zu werfen, um es eine schöne symmetrische abstimmbare FIR, wenn Sie die Zeitschaltuhren ersparen können. Ndash ScottSeidman: Keine Notwendigkeit für Multiplikatoren, wenn man einfach jede Stufe der FIR entweder den Durchschnitt der Eingabe auf diese Stufe und ihre vorherigen gespeicherten Wert, und dann speichern Sie die Eingabe (wenn man hat Der numerische Bereich, man könnte die Summe anstatt den Durchschnitt verwenden). Ob das besser als ein Box-Filter ist, hängt von der Anwendung ab (die Sprungantwort eines Boxfilters mit einer Gesamtverzögerung von 1ms wird zum Beispiel eine nasty d2dt Spike haben, wenn die Eingangsänderung und wieder 1ms später, aber das Minimum haben wird Mögliche ddt für einen Filter mit einer Gesamtverzögerung von 1ms). Ndash supercat Wie mikeselectricstuff sagte, wenn Sie wirklich brauchen, um Ihren Speicherbedarf zu reduzieren, und Sie dont dagegen Ihre Impulsantwort ist eine exponentielle (anstelle eines rechteckigen Puls), würde ich für einen exponentiellen gleitenden durchschnittlichen Filter gehen . Ich nutze sie ausgiebig. Mit dieser Art von Filter, brauchen Sie nicht jeden Puffer. Sie brauchen nicht zu speichern N Vergangenheit Proben. Nur einer. So werden Ihre Speicheranforderungen um einen Faktor von N reduziert. Auch brauchen Sie keine Division für das. Nur Multiplikationen. Wenn Sie Zugriff auf Gleitpunktarithmetik haben, verwenden Sie Fließkomma-Multiplikationen. Andernfalls können ganzzahlige Multiplikationen und Verschiebungen nach rechts erfolgen. Allerdings sind wir im Jahr 2012, und ich würde Ihnen empfehlen, Compiler (und MCUs), mit denen Sie mit Gleitkommazahlen arbeiten können. Abgesehen davon, dass mehr Speicher effizienter und schneller (Sie dont haben, um Elemente in jedem kreisförmigen Puffer zu aktualisieren), würde ich sagen, es ist auch natürlich. Weil eine exponentielle Impulsantwort besser auf die Art und Weise reagiert, wie sich die Natur verhält, in den meisten Fällen. Ein Problem mit dem IIR-Filter fast berührt von Olin und Supercat, aber anscheinend von anderen ignoriert ist, dass die Rundung nach unten führt einige Ungenauigkeiten (und möglicherweise Biastruncation). Unter der Annahme, dass N eine Potenz von zwei ist und nur ganzzahlige Arithmetik verwendet wird, beseitigt das Shift-Recht systematisch die LSBs des neuen Samples. Das bedeutet, dass, wie lange die Serie jemals sein könnte, wird der Durchschnitt nie berücksichtigen. Nehmen wir z. B. eine langsam abnehmende Reihe (8,8,8,8,7,7,7,7,6,6) an und nehmen an, daß der Durchschnitt tatsächlich 8 ist. Die Faust 7 Probe bringt den Durchschnitt auf 7, unabhängig von der Filterstärke. Nur für eine Probe. Gleiche Geschichte für 6, usw. Jetzt denke an das Gegenteil. Die serie geht auf. Der Durchschnitt bleibt auf 7 für immer, bis die Probe groß genug ist, um es zu ändern. Natürlich können Sie für die Bias korrigieren, indem Sie 12N2, aber das nicht wirklich lösen, die Präzision Problem. In diesem Fall bleibt die abnehmende Reihe für immer bei 8, bis die Probe 8-12 (N2) ist. Für N4 zum Beispiel, wird jede Probe über Null halten den Durchschnitt unverändert. Ich glaube, eine Lösung für das implizieren würde, um einen Akkumulator der verlorenen LSBs halten. Aber ich habe es nicht weit genug, um Code bereit, und Im nicht sicher, es würde nicht schaden, die IIR Macht in einigen anderen Fällen der Serie (zum Beispiel, ob 7,9,7,9 würde durchschnittlich 8 dann). Olin, Ihre zweistufige Kaskade würde auch eine Erklärung brauchen. Halten Sie zwei durchschnittliche Werte mit dem Ergebnis der ersten in die zweite in jeder Iteration eingezogen halten. Was ist der Vorteil dieses MSP430 Low Cost PinOsc Kapazitive Touch Übersicht Einleitung Bei der Betrachtung der entsprechenden kapazitive Touch-Lösung, Kosten und Performance oft in den Sinn kommt. Doch jetzt fügen Sie Flexibilität und die gesamte Lösung wird noch komplizierter. Konventionelle Weisheit könnte sagen, verwenden eine feste Funktion kapazitive Touch-Lösung. Das Problem ist, dass diese Lösungen oft nicht flexibel sind oder zu teuer sind. Die MSP430 Value Series erfüllt alle diese Anforderungen mit einer Vielzahl von kostengünstigen MCU-Optionen. Speziell in diesem Anwendungsbericht verwendet, ist die MSP430G2553 mit PinOsc GPIOs für kapazitive Touch Sensing zusammen mit integrierten 16-Bit-Timer0A3 und Timer1A3 Module für Timing-Steuerung von Mess-und Scan-Intervall für Low-Power-und Low-Cost flexible kapazitive Touch-Lösungen. In den nächsten Abschnitten werden die Systemkomponenten eingeführt und diskutiert. Dazu gehören das Sensor-Element, die PinOsc-GPIO-Nutzung, der 160Timer0A3 für den Messbetrieb und der Timer1A3 für das Scanintervall.160Das wird in der Sensor Measurement Software diskutiert, die sich auf Sensorelementmessung, Sensorverarbeitung und Sensoranalyse konzentriert In der Sensor Measurement Software Diskussion werden wir auch die Filtertechniken160und Grundlinienanpassung, die in der Sensor Processing-Stufe verwendet wird, hervorheben.160 Als letztes Stück wird auch die Sensorelement-Kalibrierung adressiert. Als Folgemaßnahmen zu diesem Dokument finden Sie auch das Anwendungsbeispiel für die kostengünstige Anwendung des Typs MSP430 PinOsc Capacitive Touch Keypad. Systemübersicht Im Abschnitt Systemübersicht werden die Systemteilkomponenten detailliert angesprochen. Abbildung 1 zeigt ein Systembeispiel, das mehrere kapazitive Touch-Sensoren MSP430 PinOsc implementiert.160 Abbildung 2 zeigt die Implementierung eines Sensorelements für die kapazitive Tastvermessung von PinOsc. Abbildung 1. Beispiel PinOsc Kapazitives Touch-System Abbildung 2. Einzel-Sensor-Element PinOsc In diesem Abschnitt werden Einzelheiten zum MSP430G2553 diskutiert. Andere MSP430-Geräte haben auch die PinOsc-GPIO-Struktur, daher sollten Sie sich auf das entsprechende Gerätedatenblatt für den genauen Anwendungsfall beziehen. PinOsc Sensorelemente Die erste Benutzeroberfläche des Systems ist der Sensor. Wenn Sie die PinOsc-Funktion der MSP430-Familie verwenden, werden Sie einige wichtige Funktionen beachten. Es sind keine externen diskreten Komponenten erforderlich. Wie in Abbildung 1 gezeigt, ist jedes Sensorelement unabhängig mit jedem PinOsc GPIO Pin verbunden (am MSP430G2553 haben alle 24 GPIOs die PinOsc-Fähigkeit). Es gibt ein hohes Maß an Flexibilität in der Form und Größe des Sensorelements zusammen mit der Sensorkonfiguration. Dabei ist zu beachten, dass die Definition eines Sensors die funktionale Umsetzung der gewünschten kapazitiven Tastsensorik ist und ein oder mehrere einzelne Elemente umfassen kann. Ein Sensor könnte ein einzelner Elementknopf oder ein Mehrfachelementschieber oder - rad sein. Ein Sensor könnte auch ein einzelnes Element sein, das für die Näherungsdetektion oder eine Arraystruktur für ein Tastenfeld oder sogar ein Trackpad verwendet wird.160 Im Folgenden sind einige Beispiele von Sensortypen mit den einzelnen Elementen, die zum Erstellen des Sensors verwendet werden. Abbildung 3. Sensorbeispiele Obwohl die Sensorstruktur anders aussehen könnte, bleibt die MSP430 GPIO-Schnittstelle für jedes Sensorelement gleich. PinOsc GPIO (Frequency Generation) Der PinOsc (Pin Oscillator) GPIO, der mit einem externen Sensorelement verbunden ist, ist ein sehr einfacher Aufbau für bestimmte MSP430-Geräte, die eine kostengünstige kapazitive Berührung ohne externe Komponenten ermöglichen. Wenn die PinOsc-Struktur im GPIO aktiviert ist, erzeugt die interne Struktur in Kombination mit einer externen Sensorkapazität einen internen Oszillator. Diese Oszillation steht in direktem Zusammenhang mit der Kapazität des externen Sensorelements. Diese Frequenz wird gemessen. Abbildung 4. PinOsc GPIO Block Timer0A3 (PinOsc Messung) Zur Durchführung der Sensormessung wird der in Abbildung 1602 gezeigte Timer0A3 verwendet. TA0CLK ist intern mit dem PinOsc verbunden und versorgt den Taktgeber mit der Taktquelle. Der TA0CLK PinOsc in Verbindung mit einer Niederfrequenzquelle (interner VLO oder externer LFXT1), die an den TA0CCR0-Eingang angeschlossen ist, ermöglicht die Messung der PinOsc-Frequenz. In diesem Beispiel wird das Gerät MSP430G2553 verwendet, aber es ist wichtig, sich auf das entsprechende Geräte-Datenblatt zu beziehen, da interne Verbindungen und Timer-Module sich unterscheiden können.160 Abbildung1605. PinOsc Timer0A3 Block Timer1A3 (Abtastintervall) Für die Abtastintervallperiode wird eine zweite Timerressource am MSP430G2553 verwendet. Während es möglich ist, auch das gleiche Timer0A3-Modul wieder zu verwenden, ermöglicht das in Fig. 1 gezeigte Timer1A3 separat die einfachste Steuerung für das periodische Sensorabtastintervall. Dieses Intervall hilft, die Erfassungsrate und den Leistungsverbrauch des Systems zu steuern. Abbildung 6. PinOsc TimerA3 Bausteinsensor-Messung Software-Implementierung Unabhängig vom Sensortyp gibt es 3 gemeinsame Stufen des kapazitiven Messprozesses. Die erste ist die Sensormessung selbst, die zweite die Messverarbeitung und die dritte die Datenanalyse. Abbildung 7. Sensor-Mess-Flussdiagramm Die Messung der Frequenz des PinOsc beinhaltet das individuelle Scannen der Sensorelemente, um für jedes Element einen Raw-Count zu erzeugen. Dieser Raw Count wird dann für jedes Element des Sensors gespeichert. Diese Funktion ist für jeden Sensortyp identisch. Die Erzeugung dieser Raw Count erfolgt unter Verwendung des Sensorelements PinOsc als Taktquelle für den Timer0A3 (TA0CTL. TASSEL3PinOsc) 160 und das Zählen über eine feste Periode (Akkumulationszyklus) gesteuert durch einen Erfassungseingang an den Timer0A3 (TA0CCTL0.CCIS1ACLK). Der Raw Count160 ist die Zählreferenz der PinOsc-Frequenz zum Accumulation Cycle (kontrolliert durch ACLK). Abbildung 8.160Messdurchflussdiagramm Prozessmessung Nach Durchführung der Messstufe werden die resultierenden Sensorelemente Raw Data analysiert. Mehrere Teilschritte werden in den folgenden Abschnitten näher beschrieben. Raw Data wird relativ zu den Sensorelementen Baseline-Wert (basecnt) verglichen, um einen Delta-Count-Wert (deltacnt) zu erzeugen.160 Nach Erzeugen des deltacnt-Wertes für jedes Sensorelement wird eine Filterstufe angewendet (optional, aber empfohlen) .160 Einmal gefiltert , Werden die Sensorelementdaten mit den Sensorelementschwellensenseebenen verglichen.160 Damit wird festgestellt, ob ein Sensor aktiv oder inaktiv ist.160 Wenn inaktiv, kann eine Grundlinienanpassung erfolgen.160As ändern sich die Kapazitätsänderungen an jedem Element, ebenso die resultierende PinOsc-Frequenz. Es ist wichtig, sich daran zu erinnern, dass Temperatur und Spannung auch die PinOsc-Frequenz beeinflussen, so dass die Anpassung des Baseline-Wertes während des Betriebs immer erforderlich ist (siehe Baseline Setting and160Adjustment unten). Nachdem alle Sensorelemente verarbeitet sind, wird der resultierende Sensorstatus zurückgeführt. Abbildung 9. Ablaufdiagramm Analyse Sensor Sensor Datenanalyse kann zahlreiche Bedeutungen annehmen. Dies könnte ein einfaches Tastendecodieren, eine Position auf einem Schieberegler oder ein Rad, eine bestimmte Gestenart oder etwas anderes sein. Es folgt eine einfache Analyse der einzelnen Sensorelementzustände, die durch den Eingangsparameter sensorpress definiert werden.160 Der Sensorpresswert wird aus dem Prozessfunktions-Sensorstate-decodierten Wert genommen. Abbildung 10. Analysieren von Flußdiagramm-Filtertechniken Bevor Sie mit der Verwaltung der Baseline fortfahren, möchten wir vielleicht unsere Rohdatenerfassungsdaten untersuchen.160 Es gibt viele Anwendungen, bei denen es zu Störungen oder anderen Störungen kommt.160 Diese Einflüsse können die Zuverlässigkeit der Daten beeinträchtigen Interpretiert.160 In vielen Fällen kann jedoch eine einfache Software-Filterung die Messinterpretation mit geringem Einfluss auf die gesamte Systemleistung (Leistung und Geschwindigkeit) unterstützen. Normalerweise findet dieser Schritt in der Prozessmessung statt. Die drei Methoden sind ein IIR-Filter, ein Summing-Filter und ein kumulativer Moving Average Filter (Nominalized Summing Filter) .160 Wenn wir das verstärkte Signal nutzen, können wir den CMA-Filter vernachlässigen. Es gibt Vorteile und Nachteile für jede Methode, aber die Umsetzung entweder kann die Erkennung von Ereignissen robuster und immun gegen Interferenzen. Abbildung 11. Analysieren des Flussdiagramms Der Summing-Filter (C2SUM) reagiert schneller als der IIR-Filter (C2IIR) .160 In diesem Fall benötigt der Summing Filter jedoch den Speicherbedarf für den deltacntvalue (16-Bit-Integer) Wert). Für einen Sensor mit vielen Elementen können die Anforderungen des Summing-Filter160-Speichers ein limitierender Faktor für kostengünstige Lösungen sein.160 Unter Berücksichtigung dieser Erwägungen und160 abhängig von den IIR-Gewichtungsfaktor-Verstärkungserfordernissen könnte der Response-vs.-Speicher-Kompromiß in Betracht gezogen werden. Baseline-Einstellung und - Anpassung Bei der Fortsetzung der Komponenten der Prozessstufe muss die Basislinie besprochen werden.160160A Grundlinie ist einfach der unberührte Bezugspunkt des Systems, von dem aus die Berührung bestimmt wird. Daher muss der Baseline - (basecnt) - Wert für jedes Sensorelement initialisiert und gewartet werden. Die Beibehaltung der Grundlinie ist äußerst wichtig, da das System durch äußere Kräfte (Temperatur, Feuchtigkeit, Feuchtigkeit) sowie Systemparameter (Spannung) beeinflusst wird.160 Diese Faktoren160 können dazu führen, dass die unberührten Referenzen160baseline160resultate driften. Wenn diese Drift nicht berücksichtigt wird, können Fehler mit unvorhergesagten Effekten auftreten. Daher findet als Teil der Prozessstufe auch eine Anpassung der Grundlinie (basecnt) statt. Für die kapazitive Berührungserkennung gibt es drei Schlüsselfehlerzustände, die möglicherweise durch die Grundlinienanpassung beeinträchtigt werden. 1) Falsche Positives - Wenn ein Sensorelement als aktiv interpretiert wird, wenn es in Wirklichkeit nicht aktiv ist. False Positives können aus zwei Gründen auftreten.160 Das erste ist, dass Systemrauschen zu einer oder mehreren fehlerhaften Messungen geführt hat, die den Dateninhalt beschädigen.160160Die zweite ist, dass die Grundlinie fehlerhaft in einen Zustand angepasst wurde, in dem Messdaten interpretiert werden Ein ungültiger Zustand.160 Diese beiden Gründe werden durch die Verwendung der PinOsc (eingebaute Hardware-Filterung aufgrund der Messtechnik) und eine entsprechende Baseline-Handhabung gemildert. 2) Locked Positives -160 Wenn ein Sensorelement als aktiv interpretiert wird, bleibt aufgrund von Baleline-Korruption im aktiven Zustand gesperrt.160 Locked Positives bezieht sich auf die zweite160 Ursache der False Positives.160 Wenn die Baseline irrtümlich geändert wird, werden Meaurement-Messwerte immer Fallen in einen positiven Erfassungsbereich.160 Dies ist auf eine schlechte Behandlung der Grundlinienanpassung zurückzuführen und wird am häufigsten mit dem Wunsch verbunden, eine sehr schnelle Aufwärtsbewegung in der Grundlinie aufgrund eines großen negativen Wertes durchzuführen.160 Wenn ein Basislinien-Dithering angewendet wird , Große Negative sind mst oft nie erlebt. 3) Missed Positives - Wenn ein Sensorelement nicht als aktiv interpretiert wird, wenn es in Wirklichkeit aktiv ist. Missed Positives (manchmal auch Finger Creep genannt) tritt auf, wenn die Baseline-Einstellung zur Kompensation envirnomentaler Zustände auf das Vorhandensein eines menschlichen Fingers angewendet wird.160 Wenn ein sehr langsamer Ansatz für das Sensorelement auftritt, kann dies als sehr langsam verwechselt werden Änderung der Sensorelementkapazität.160 Dies führt dazu, dass die Grundlinienanpassung auftritt und die Bewegung des Fingers näher zum Sensorelement verläuft.160 Wenn der Finger mit dem Sensorelement in Kontakt ist, befindet sich die Basislinie auf der gleichen Höhe wie die Messung Beachten Sie, dass Missed Positives typischerweise zwei Parameter beinhalten (Sensorelement-Abtastrate und Baseline-Anpassungstechnik) .160 Mit einigen einfachen Techniken können Missed Positives einfach vermieden werden. Sensorelement-Schwellenwerte Vor dem Abschluss der MSP430 Low Cost PinOsc-Kapazitiv-Touch-Übersicht ist ein letzter Punkt160die Adresse die Einstellung der Sensorelementschwellen. Bei der Dateninterpretation ist zu beachten, dass bei einem gegebenen Sensorelement der deltacntvalue (basecnt - Messung für das PinOsc - Verfahren )160 mit einem bestimmten Grenzwert übereinstimmt.160 Dies stellt die Frage, wie I160 das gewünschte Sensorelement bestimmt Grenzwerte. Die einfache Antwort ist es zu messen. Die bessere Antwort ist, dass Ihr Messprozess automatisiert ist.160 Im Folgenden finden Sie ein Beispiel für die Messung des max deltacntvalue für jedes Sensorelement. Wie Sie sehen können, zeigen die schwarzen Balken den relativen deltacntvalue mit dem aktuellen Maximalwert an. Da es sich hierbei um das MAX160reading handelt, sollte normalerweise ein Level unterhalb dieses Punkts für die Festlegung der Erkennungsgrenzwertgrenze verwendet werden.160 Im Beispiel für die kapazitive Tastatureingabe des Typs MSP430 Low Cost PinOsc sind diese Werte im Ordner "CapTouchLib" auf160a160boardxxx. h eingeschlossen Structure. c Element konstruieren.160160Each Sensorelement160define xxxMAXVALUE160is160apply160to160die. thresholdcal. Thresholdsense und. maxResponse. In der Struktur. c werden diese Pegel für jedes Sensorelement (const struct Element type) wie folgt gesetzt: thresholdcal 0.1160 xxxMAXVALUE (oder 10 des xxxMAXVALUE-Pegels) Pegels, auf den die Sensorelement-Grundlinienanpassung aufgrund von Temperaturdrift erfolgt. Thresholdsense160 0,3 xxxMAXVALUE (oder 30 des xxxMAXVALUE-Pegels), über dem das Sensorelement als aktiv erkannt wird. Diese Ebenen können bei Bedarf geändert werden. ReferenzenTag: MSP430 Froh zu verkünden, ich endlich ein paar Fortschritte bei der Verwendung von FreeRTOS In diesem Beitrag Ill schreiben, wie man den Beispiel-Code für MSP430F5438, die eine Evaluation-Board mit reichlich Peripheriegeräten, auf MSP430F5529, die eine sehr beliebte Launchpad-Board zu bearbeiten ist zu ändern. First, Ill reden darüber, wie die Hello World mit FreeRTOS laufen, die eine einfache blinkende LED-Programm ist. Dann Ill Upgrade der Code in meinem Sensor-Projekt verwendet und machen es auf FreeRTOS laufen. In diesem Projekt wurde eine Firmware entwickelt, um Daten von mehreren Sensoren, wie MPU9150, BMP180, SHT21, SIL29023 und TMP006, zu erfassen. Ein einfaches I2C-Schnittstellenprotokoll wurde entwickelt, um mit Sensoren zu kommunizieren. Several Filter-Algorithmen verwendet werden, um Sensor-Rauschen, einschließlich der gleitenden mittleren Filter, Mittelwertfilter, FIR-Tiefpassfilter. Device-Winkel wurde mit Atan (Arc-Tangente) - Funktion und Datenfusion von Gyroskop und Beschleunigungsmesser. Ein Benutzeroberfläche bestand aus Schaltern, Und PC-Textausgabe wurde gebaut, um verschiedene Sensoren auszuwerten und zwischen Niedrigleistungsmodus und Arbeitsmodus umzuschalten. Schließlich wurden alle Rohsensordaten und gefilterten Daten über UART zum PC gesendet und in Echtzeit aufgezeichnet. Lesen Sie weiter 8220Evaluating Sensor Hub mit Launchpad MSP4308221 Aktuelle Beiträge Kategorien


No comments:

Post a Comment