Ist eine Kurvenanpassung an eine Sinusfunktion mit Mikrocontroller möglich?

Ich habe 2 Sinuswellen mit einer Frequenz von 2 kHz gleichgerichtet und mit 50 kHz von zwei ADC-Kanälen (10 Bit) eines PIC18F26K22 abgetastet.

Ich möchte die Messung der Amplitude jedes Sinus und der Phasendifferenz untereinander finden. Ich könnte ZCD verwenden, um die Phasendifferenz zu erkennen und den Adc nur zum Abtasten der Amplitude verwenden, aber ich suchte nach einem intelligenteren und umfassenderen Ansatz.

Meine Frage ist, ob der uController die Rechenleistung hat und ob es möglich ist, eine Kurvenanpassung mit einem anderen uController durchzuführen, um diese beiden Parameter zu extrahieren. Einen ADC mit höherer Abtastrate und Auflösung zu bekommen, ist natürlich eine offene Möglichkeit.

Bearbeiten: Um meiner Frage einen Kontext / Rahmen zu geben, suche ich nach einer Impedanzmessung. Ich habe das Signal, das dem Spannungsabfall in der Impedanz entspricht, und ich habe ein anderes Signal, das der Stromerfassungsschaltung entspricht. Also muss ich beide abtasten, um jeweils eine Amplituden- und Phasendifferenz zu messen.

Mit 16 MIPS, 64 kB Flash, 3.896 kB RAM und einem Hardware-Multiplikator liegt das durchaus im Bereich des Machbaren. Wenn Sie Ihre Abtastrate auf 10 kHz pro Kanal reduzieren, können Sie 400 Anweisungen für die Verarbeitung jedes Samples widmen. Vergessen Sie Gleitkomma-Mathematik, aber Sie können Nachschlagetabellen verwenden, um schnell zB die Sinus-, Umkehrsinus- oder Exponentialfunktion eines Wertes zu bestimmen. Ich würde die beiden niederwertigsten Bits jedes Samples verwerfen, damit jedes Sample in ein einzelnes Byte passt, was kleinere Nachschlagetabellen und eine schnellere Verarbeitung ermöglicht.
Amplituden- und Phasendifferenz legen nahe, dass Sie eine reaktive Impedanzänderung oder einen LVDT-Signalaufbereiter erfassen möchten, der für ein bestimmtes Klassenniveau ausgelegt ist. Bitte geben Sie den Zweck und/oder das Erforderliche an; 1) Auflösung 2) Genauigkeit und 3) SNR oder Spektren von möglichem Rauschen und Dynamikbereich des Signals?
Der Grund, warum ich frage, ist, dass es trivial ist, eine präzise Pseudo-Sinuswelle mit einer R-gewichteten Leiter aus einem Zähler oder einem langen Schieberegister zu erzeugen. Und dann ist es möglich, einen A log DAC zu verwenden, um eine Sinuswelle mit >70 dB SNR zu erzeugen, oder sogar jeden PC mit Audacity zu verwenden, um eine reine Sinuswelle mit festem Pegel zu erzeugen. Es hängt alles davon ab, was Sie erkennen müssen?
Sie könnten eine digitale PLL konstruieren. Dies wird eine kontinuierliche Phasenschätzung beider Signale erzeugen. Subtrahieren Sie einfach die beiden Phasen, um die Phasendifferenz abzuschätzen.
@TonyStewart, Ja, ich möchte eine Impedanz messen. Nämlich die elektrische Leitfähigkeit von Meerwasser, die durch Messung der Flüssigkeitsimpedanz zwischen zwei Sonden gemessen wird. Aber ich möchte eine Sinuswelle abtasten (messen) und nicht erzeugen. Meine Signalkonditionierung ist eine Strommessung und eine Voltmessung, beide geben zwei Sinuswellen mit derselben Frequenz, aber unterschiedlicher Phase aus. Die Impedanzauflösung, die ich suche, ist: 0,1 Ohm und kann eine Genauigkeit von +/- 5% haben. Dies bedeutet in Spannung etwa eine Genauigkeit von 1 mV und +/-5 %. Hilft meine Information?
@mkeith, danke, ich habe noch nie von PLL gehört, lass mich darüber lesen und sehen, ob es meinen Bedürfnissen entspricht.
Es scheint, dass Sie keine Zeitbeschränkung haben, also ist es eher eine Frage des Gedächtnisses. Ich bin zuversichtlich, dass Sie die Daten anpassen können, aber für eine schnelle und präzise Anpassung müssen Sie Startparameter festlegen, die Sie erhalten, indem Sie mit anderen Methoden die maximale Amplitude und Phase ermitteln. Es wird also nicht einfacher und keinesfalls schneller.

Antworten (5)

Ich habe keine Ahnung, warum Sie dieses Zeug wollen. Und Tony fragt und du antwortest nicht. Also werde ich Sie einfach wörtlich nehmen und darauf antworten.

Ein allgemeines Verfahren zum Auffinden der Phasendifferenz zwischen zwei identischen Signalen ist die Verwendung eines Korrelators. Dies funktioniert sogar für Sprache und Musik. Im digitalen Bereich korrelieren Sie sie einfach. Das lokale Maximum in der Korrelationsfunktion liegt bei der Zeitverzögerung δ . Wenn Sie ein Referenzsignal haben, können Sie auch mit diesem korrelieren. Die Korrelation ist auch kinderleicht. Sie können eine sehr einfache Routine dafür fast überall finden, wo Sie hinschauen. Eigentlich nur ein paar Zeilen Code.

Es gibt eine alte Arbeit aus dem Jahr 1963 mit dem Titel "The Quefrency Analysis of Time Series for Echoes: Cepstrum, Pseudo-autovariance, Cross-Cepstrum, and Saphe Cracking" von Bogert et al. Vielleicht finden Sie es auch lesenswert.

Auch ich mag die Methoden des "rahmonic liftering", die in diesem Artikel verwendet werden.
@jonk ich mag deine idee, aber kann ich das trotzdem machen, wenn ich die zwei verschiedenen wellen zu verschiedenen momenten abtaste?
Das sollte Ihnen nur einen kleinen, festen Phasenversatz geben, den Sie subtrahieren können.
Die Korrelation ist im Wesentlichen eine Faltung. Es erfordert eine Anzahl von Multiplikations-Akkumulationen jeder Probe . Es mag mathematisch einfach und einfach zu beschreiben sein, aber es wird viele Zyklen dauern, insbesondere für einen PIC 18, der keine Multiplikations-Akkumulations-Hardware hat.
@jonk, weißt du, wo ich das Papier zur Quefrency-Analyse von Bogert herunterladen kann? Danke
@NicholasTJ Wenn ich keine Kopie hätte, würde ich wahrscheinlich in die Bibliothek gehen. Das vollständige Zitat ist Bruce P Bogert, Michael JR Healy und John W Tukey. The Quefrency Analysis of Time Series for Echoes: Cepstrum, Pseudo-Autocovariance, Cross-Cepstrum and Saphe Cracking , Proceedings of the Symposium on Time Series Analysis, Band 15, Seiten 209–243, 1963. Ich weiß nicht, ob ein DOI war zugewiesen. Aber das Proceeding ist ein veröffentlichtes Werk, also sollte es irgendwo in gedruckter Form erhältlich sein.

Sie können dies mit dem PIC tun, aber es wäre sehr hilfreich, mit der richtigen Hardware vor dem A/D zu beginnen. Die Signale zu korrigieren ist eine schlechte Idee. Das macht es schwieriger, sowohl die Amplitude als auch die Phase zu finden. AC-koppeln Sie die Signale und fügen Sie eine DC-Vorspannung von der Hälfte des A/D-Bereichs hinzu. Skalieren Sie es so, dass die maximale Amplitude nicht ganz die minimalen und maximalen Grenzen des A / D-Bereichs erreicht.

Sie können die beiden 50-kHz-Sample-Streams verwenden, um sowohl die Amplituden als auch die Phase zwischen den Signalen zu finden.

Wenn Sie wissen, dass beide Signale wirklich Sinussignale sind, kann die Amplitude aus der durchschnittlichen Differenz zum langfristigen Durchschnitt abgeleitet werden. Jedes Signal wird stark tiefpassgefiltert, um die DC-Komponente zu erhalten. Subtrahieren Sie jeden Messwert von dieser DC-Komponente, nehmen Sie dann den absoluten Wert davon und mitteln Sie diesen. Das Ergebnis ist proportional zur Amplitude. Auch dies funktioniert nur, wenn Sie wissen, dass es sich bei den Signalen um Sinussignale handelt (niedriger Oberwellengehalt).

Um die Phasenverschiebung zu finden, detektieren Sie die Nulldurchgänge. Suchen Sie nach dem ersten positiven Messwert, nachdem Sie beispielsweise eine Mindestanzahl negativer Messwerte hintereinander gesehen haben. Berechnen Sie bei jedem Zyklus eines der Signale, wie viele Zyklen zurück liegen, als das andere zuletzt einen Nulldurchgang hatte. Es wird wahrscheinlich etwas Rauschen auf diesem Signal geben, nicht zuletzt Quantisierungsrauschen. Bei einer Abtastrate von 50 kHz haben Sie nur 25 Abtastungen pro Zyklus. Tiefpassfiltern Sie diese 0-24-Zahl mit ein paar zusätzlichen Bits unter dem Binärkomma. Es ist hilfreich, wenn die Abtastrate kein genaues Vielfaches der interessierenden Frequenz ist.

Wenn das Obige immer noch zu viel Quantisierungsrauschen ergibt, dann interpolieren Sie zwischen den zwei Abtastwerten, wo der Nulldurchgang auftrat, um ihn genauer zu bestimmen. Dies dauert mehr Rechenzyklen.

Alles in allem würde ich dies mit einem der 16-Bit-PICs oder dsPICs mit einem 12-Bit-A/D tun. Der 18F26K22 scheint dafür eine seltsame Wahl zu sein. Ein 16-Bit-Teil würde eine Tiefpassfilterung der eingehenden Streams ermöglichen, bevor irgendetwas anderes mit ihnen gemacht wird, und der 12-Bit-A/D gibt Ihnen eine bessere Abtastauflösung, um zu beginnen. Dies sollte eine echte RMS-Messung ermöglichen (obwohl dies möglicherweise nicht erforderlich ist) und mehr Zyklen ermöglichen, um die Nulldurchgänge besser zu finden, was bessere Phasenmessungen ermöglicht.

Konstruktionsplan: (Impedanz von Meerwasser messen)

  • Frequenz von 2kHz
  • Die Impedanzauflösung: 0,1 Ohm
  • Genauigkeit von +/- 5%.
  • Dies bedeutet in Spannung etwa eine Genauigkeit von 1 mV und +/-5 %.

Wasser:

  • Dielektrizitätskonstante von 80 +/-10 %
  • Leitfähigkeit: Seine Einheiten sind Siemens pro Meter [S/m] in SI und Millimhos pro Zentimeter [mmho/cm] in US (nicht empfohlen)

Lesen Sie mehr: http://www.lenntech.com/applications/ultrapure/conductivity/water-conductivity.htm#ixzz4KzOtwJlE

  • (Trivia: Ultrareines Wasser ist aufgrund des Fehlens gesunder gelöster Mineralien keine gesunde Trinkflüssigkeit.)

  • Total Dissolved Solids (TDS) und Electrical Conductivity (EC) sind fast äquivalent, da die Anzahl der gelösten Ionen das Wasser leitfähig macht.

  • Reinstwasser 5,5 · 10-6 S/m

  • Trinkwasser 0,005 – 0,05 S/m
  • Meerwasser 5 S/m

Lesen Sie mehr: http://www.lenntech.com/applications/ultrapure/conductivity/water-conductivity.htm#ixzz4KzOEKC3V

  • Hintergrunderfahrung

Typischerweise messen Präzisions-LCR-Messgeräte die Impedanz unter Verwendung einer Konstantstrom-Frequenzquelle mit automatischer Bereichswahl bei einer festen Frequenz wie 120 Hz, 1 kHz, 100 kHz, 1 MHz und messen dann direkt die Spannung, um den Widerstand und die reaktiven Komponenten und andere Parameter zu erhalten.

Präzise, ​​hochempfindliche Instrumentendesigns verwenden eine duale PLL, um das Signal-Rausch-Verhältnis (SNR) zu verbessern, und somit ist eine Auflösung von 10 ppm möglich { was ich in Wirbelstromdesigns zur Erkennung von metallurgischen Fehlern erreicht habe} relativ zu normalisierten Werten (Auto-Null )

Dies ist weder eine Lösung noch ein Kommentar, sondern eine Referenzinformation, um einen besseren Instrumentendesignplan oder eine bessere Frage auszuwählen. Elektrodengröße und -materialien sind ebenfalls ein wichtiger Aspekt dieses Designs, da Korrosion die Wiederholbarkeit der Probenahmetests beeinflussen kann.

Ich lasse Sie entscheiden, ob dies hilfreich ist.

Hallo Tony, das wusste ich bereits und ich verstehe nicht, wie es hilft, eine Kurvenanpassung von zwei Signalen in einem Mikrocontroller durchzuführen. Danke für die Hilfe.
Kurvenanpassung ist nicht, wie ich die reaktive Impedanz messen würde. Es gibt bessere Verfahren für Phasen- und Amplitudendetektoren.
Ok, kannst du mir einen Tipp geben, wie dein Ansatz aussehen würde?

Vorgeschlagene Lösung Relaxation Oscillator Time Interval > 2KHz

Da die Leitfähigkeit von Wasser von der Wassertemperatur abhängt, kann diese mit dem Temperatursensor IC für die Lookup-Table-Korrektur bei 20 °C gemessen werden.

Die Dielektrizitätskonstante von Wasser beträgt 80 +/-5 und die Elektrodenkapazität hängt von der Oberfläche und dem Abstand der Elektroden ab. Damit dies effektiv funktioniert, möchten wir C von Wasser viel kleiner als einen präzisen C-Wert im Kreislauf machen, um Cwater effektiv zu ignorieren und nur die Leitfähigkeit in Siemens/Meter zu messen. Daher sind kurze Elektroden mit einem präzisen Abstand erforderlich.

Einigen Forschern ist auch bekannt (Zitieren erforderlich), dass kontaminiertes Wasser innerhalb von 1 ms mit der Ionisierung beginnen und die Elektrodenoberfläche mit Gleichstrom beschichten kann, wenn mehr als 1,5 V, also eine Frequenz >> 1 kHz erwünscht ist.

Das hier vorgeschlagene Verfahren nutzt den Widerstand von Wasser, um einen Präzisionskondensator mit geringem Leckstrom für einen Relaxationsoszillator aufzuladen. Das Prinzip aller Schmitt-Trigger-Designs besteht darin, Rauscheingänge zu ignorieren, aber in diesem Fall soll es einen Takt mit negativer Rückkopplung erzeugen, und die eingebaute Schwelle von 1/3 bis 2/3 hat eine große Toleranz, also einen Präzisionskomparator mit R Eine Verhältnisrückkopplung von 3:1 wird bevorzugt, wobei die Genauigkeit von der Toleranz und den Werten des Widerstandsverhältnisses abhängt.

Designdetails

  • C >>100x C der Elektroden.
  • C wird halbiert auf Vcc und Vdd, so dass der Start des Oszillators sofort mit V/2 am Eingang erfolgt. (Optional)
  • Der C-Wert wird mit der Elektrodenform und dem Spalt gewählt, um f > 2 kHz zu erzeugen
  • T = RC wird normalerweise bei ~ 60% einer 5-V-Halbzyklus-Dreieckswelle durchgeführt.

    • Dies ist nur 1/3 Schwingung am Eingang des Schmitt-Wechselrichters, kann aber (diskreter Operationsverstärker mit voller Schwingung) auf genau 30 % Hysterese eingestellt werden, wenn RC=T=1/f aus irgendeinem Grund wünschenswert war.
  • 50 Ohm Ausgang ist die interne Impedanz von HCxx-Gattern bei 5 V ca. wird zur Verdeutlichung angezeigt.

    • Komparatoren mit offenem Kollektor erfordern einen Pull-up R., der Schwellen beeinflusst. Rail to Rail ist an einem stabilen oder zumindest kalibrierten 5,00V-Regler erwünscht

Java-Falstad-Simulation

Screenshot untenGeben Sie hier die Bildbeschreibung ein

Sie können die FFT auch auf beide Signale anwenden und die Amplitude und Phase mit der Komponente mit größerer Amplitude extrahieren.

Für die Phase könnten Sie auch die Nulldurchgangserkennung durchführen und nicht das gesamte Signal an die Kurve anpassen, sondern nur nahe der Null, wo es fast linear ist (sin (Theta) ist ungefähr Theta für kleines Theta).