Was ist der schnellste Weg, um ein analoges Signal zu lesen - Arduino / Raspberry Pi + ADC / Arduino + ADC?

Ich muss 50-Hz -Spannungssignale von vier CT-Stromsensoren abtasten und die Wellenformen mit einem Spannungssignal aus dem Netz vergleichen (untersetzt und versetzt für ADC), um den Stromverbrauch von vier Geräten genau zu messen.

Ich möchte mindestens 360 Samples für jede Wellenform pro Periode erhalten, was insgesamt 1800 Samples pro Sekunde bedeutet. Da die Signalfrequenz 50 Hz beträgt, bedeutet dies eine Lesegeschwindigkeit von 90 kHz .

Ich habe einen MCP3008 10-Bit-ADC zur Verfügung, der eine SPI-Schnittstelle, ein Arduino Uno-Board und einen Raspberry Pi 2 verwendet.

Der MCP3008 hat eine maximale Abtastrate von 200ksps ( Datenblatt ).

Die analogen Eingangspins des Arduino Uno können mit 10 kHz gelesen werden ( offizielle Dokumente ).

Der Raspberry Pi kann mit SPI-Schnittstellen bei 20 kHz mit dem Standard-Linux-Treiber arbeiten, wie hier erwähnt, obwohl er durch Umgehung des Standard-Linux-Treibers angeblich schneller arbeiten kann (ich weiß nicht, wie viel schneller - es gibt viele verschiedene Zahlen). online herumgeworfen).

Der Arduino Uno kann mit SPI-Schnittstellen mit viel höheren Geschwindigkeiten arbeiten als der Raspberry Pi.

Nach dem, was ich sammeln kann, gibt es drei Setups zur Auswahl:

  1. Lesen der 5 Werte direkt mit analogRead() des Arduino (funktioniert eindeutig nicht)
  2. Verwendung des MCP3008 ADC mit dem Raspberry Pi (ist es möglich, ihn mit einigen Modifikationen schnell genug zu machen?)
  3. Verwendung des MCP3008 ADC mit dem Arduino

Kann die erforderliche Geschwindigkeit mit einem der oben genannten Setups erreicht werden? Wenn nicht, was wäre wahrscheinlich die maximal erreichbare Geschwindigkeit?

Ihre Aussage zur erforderlichen Abtastrate ist nicht eindeutig, vielleicht meinen Sie 360 ​​Abtastungen pro Periode ? Wie auch immer, 10 Bit bei 200 KSPS implizieren ein Minimum von 2 MHz SPI-Takt. Ich bin mir nicht sicher, ob Sie den Arduino schneller als etwa 1 MBP asynchron seriell mit dem Pi verbinden können, es sei denn, Sie finden eine Möglichkeit, eine parallele Schnittstelle zu erstellen, sodass dies möglicherweise ein Engpass ist. Vielleicht möchten Sie sich etwas wie eine FT2232-USB-Schnittstellen-Engine oder eine ARM-Cortex-MCU ansehen, vielleicht den STM32F303 mit USB, einem ADC, der viel schneller ist als Sie benötigen, und mehr verfügbarem RAM zum Puffern.
Entschuldigung, mein Fehler mit den Samples pro Sekunde. Außerdem muss ich die Wellenformen nicht ständig überwachen – nur eine Reihe von Messwerten pro Minute oder so, also denke ich, dass die Übertragung der Daten kein großes Problem sein wird.
Viele ARM-Cortex-Teile könnten Ihre Samples hervorragend über ihren internen ADC und DMA erfassen und sie dann über seriell (oder USB) mit einer langsameren Rate an den Pi wiedergeben. Sie müssen sehen, ob der ATMega328p die SPI-Leitungen schnell genug takten und das vollständige Ergebnis vor der Übertragung puffern kann (wahrscheinlich nicht, wenn Sie jedem Ergebnis 16 Bit geben, nur knapp, wenn Sie 10 Bit vollständig über Bytes packen).
Hmm .. Also ist die Anbindung des ADC an den Rasbperry Pi der bevorzugte Ansatz? Glauben Sie, dass es in der Lage sein wird, den ADC mit den entsprechenden Optimierungen schnell genug zu takten?
Ich würde den Arduino ADC nicht so schnell ausschließen. Der μC im uno ist der ATmega328 , der über einen 10-Bit-ADC verfügt, der im Freilaufmodus 13 ADC-Taktzyklen für jede Probe benötigt. Während die 10-Bit-Präzision nur gültig ist, wenn die ADC-Taktfrequenz zwischen 50 und 200 kHz liegt, könnten Sie den ADC mit 1 MHz takten, was 76,9 kSa/s bei etwa 8 Bit Genauigkeit ermöglicht. Zum Ändern des ADC-Kanals würden Sie den ADC-Umwandlungsabschluss-Interrupt verwenden.
@M.Hassaan - Ich würde nicht empfehlen, die Samples mit dem Pi zu erfassen - es sei denn, Sie haben eindeutige Beweise dafür, dass dies möglich ist, und bei geringem Taktjitter ist Echtzeit-Sampling im Allgemeinen eine Aufgabe, die für ein eigenständiges Mikro viel besser geeignet ist B. mit einer DMA-fähigen SPI-Engine oder einem internen ADC.
Eine Verringerung der Genauigkeitsanforderung auf 8 Bit würde auch das ATmega-Pufferungsproblem vereinfachen. Noch besser wäre es, wenn Sie feststellen würden, dass Sie nicht alle verschachtelten Kanäle gleichzeitig abtasten müssen, sondern nur einen vollständigen Datenblock für jeden (oder jeden und die Referenz) nacheinander sammeln könnten würde sowohl Ihre Abtastrate als auch Ihren Speicherbedarf senken.
Sind das 360 Stromabtastungen pro Netzzyklus oder 360 Strom- und Spannungsabtastungen? IOW, ist die Spannungsabtastung in diesen 90 kHz enthalten?
Ja, Spannungsabtastungen sind in den 90 kHz enthalten. @Chris Stratton - Jetzt, wo Sie es erwähnen, könnte ich die Spannung und nur eine der Stromwellenformen gleichzeitig messen, die Daten übertragen und dann das nächste Paar messen. Dies würde die Anforderung auf 36.000 Abtastungen pro Sekunde senken. Dann könnte ich die Idee von jms ausprobieren. Danke schön!
Dann könnten Sie den ADC-Vorteiler auf 32 einstellen, was Ihnen eine ADC-Taktfrequenz von 500 kHz aus dem 16-MHz-Takt gibt. 500 kHz / 13 = 38,5 kSa/s, aber mit wesentlich weniger Rauschen bei den niederwertigsten Bits als bei einer ADC-Taktfrequenz von 1 MHz. Wenn Sie nur die 8 höchstwertigen Bits benötigen, können Sie das ADLAR-Bit (ADC left adjust result) im ADMUX-Register setzen, das die 8 höchstwertigen Bits in das ADCH-Register verschiebt, wodurch die Notwendigkeit von Bitverschiebungs- und Maskierungsoperationen in Ihrem Code entfällt .
Danke schön. Ich werde beide Werte ausprobieren und die Genauigkeit vergleichen.
Klingt so, als wären Sie auf dem Weg zu einer Lösung. Eine andere zu berücksichtigende Sache ist, ob der kleine Phasenfehler beim Abtasten von Strom und Spannung nacheinander und nicht parallel eine Rolle spielt oder ob er sich tatsächlich über eine vollständige Wellenform auslöscht (obwohl dies eine Symmetrie voraussetzt, die bei einigen Lasten möglicherweise nicht vorhanden ist - ein Tourist mit einem Gleichrichter-Spannungsadapter als extremes Beispiel)
Ich habe darüber nachgedacht, dieses Problem zu lösen, indem ich die Verzögerung zwischen zwei Lesevorgängen zeitlich einschätze und eine der Wellenformen um diesen Betrag verschiebe. Diese Verarbeitung wird wahrscheinlich im Rasbperry Pi durchgeführt, nachdem jeder Satz von Messwerten erhalten wurde.
Sie müssen es nicht zeitlich einstellen, bei einer ADC-Taktfrequenz von 500 kHz und mit dem ADC im freilaufenden Modus wird durch das Datenblatt garantiert , dass die Abtastungen alle 26 μs auftreten. Wenn Sie bei jedem Sample zwischen zwei Eingängen wechseln, beträgt die Verzögerung immer 26 μs und die aufeinanderfolgenden Samples für jeden Kanal liegen immer 52 μs auseinander.

Antworten (2)

Wenn Sie den skalierten Signalspannungshub innerhalb von 1 Vpp erhalten, können Sie wahrscheinlich einfach die Soundkarte Ihres Computers verwenden. Drei USB-Soundkarten, die jeweils eine Abtastrate von 192 kHz unterstützen, und Sie können loslegen.

Schlau :) Gefällt mir! Aber es müssen 5 Kanäle vorhanden sein. Ich bin mir nicht sicher, ob es einfach ist, eine Soundkarte mit 5-Kanal-Eingangsfunktion zu finden. Natürlich könnten mehrere Soundkarten eine Lösung sein :) Ich mag diese Idee, da Spannungs- und Strommessung an einem Stereoeingang genau synchron sind.
@GeeBee Jede Soundkarte hat 3 Eingangskanäle, einen im Mikrofon, zwei in Line-in. Außerdem hindert Sie nichts daran, mehrere billige USB-Soundkarten an einen Computer anzuschließen.
Ich fürchte, es gibt nur einen Stereo-ADC. Obwohl Sie mehrere Eingänge haben, können Sie nicht alle gleichzeitig ADC machen. Das Problem bei mehreren Karten besteht darin, sie praktisch ohne Jitter synchron zu halten. Ein Jitter von weniger als 55 Mikrosekunden ist akzeptabel. Obwohl ich in der Vergangenheit den Spaß hatte, Soundkarten in Assembler zu programmieren und die DMA-Kanäle einzurichten, habe ich wirklich das Gefühl, dass es eine echte Herausforderung wäre, mehrere Soundkarten in dieser harten Synchronisierung zu halten. Hast du dafür eine Lösung?
@GeeBee Sie können immer noch mehr als eine USB-Soundkarte auf einem Computer verwenden.
@Maxton Chan Ich stimme zu, dass Sie können. Das Problem ist, dass wir die Leistung berechnen müssen und dafür die Strom- und Spannungswellenformen miteinander multiplizieren müssen. Daher müssen alle 5 Kanäle wirklich hart synchron sein (z. B. der linke und der rechte Kanal eines Stereo-ADC). Ihre Lösung könnte in Studio-Soundkarten mit 6-Kanal-ADC gut funktionieren - was wahrscheinlich viel komplizierter ist als die Verwendung eines MCP3909-Chips, oder? :)
Da Sie 4 Ausgänge haben, können Sie die Line-In-Signale von 4 USB-Soundkarten verwenden. Alle linken Kanäle sind parallel geschaltet und werden als Spannungserfassungssignal verwendet; und rechte Kanäle werden als Stromrichtung für jeden Ausgang verwendet. Dadurch erhalten Sie 4 unabhängige phasenangepasste digitale Lesesätze. Übrigens, da Sie bereits einen Computer verwenden, können Sie die Multiplikation (und FFT, falls erforderlich) der GPU überlassen, da sie massiv parallel ist und keine Verzweigung aufweist.
Jetzt reden wir :) Dein Kommentar wurde positiv bewertet. Mit 4 separaten Spannungs- und Strom-ADCs funktioniert es wie ein Zauber! Es ist keine GPU-Magie erforderlich, FFT ist so einfach, dass die CPU es vor dem Frühstück erledigen kann :) (Die Daten werden nicht in Echtzeit auf dem PC verarbeitet, wir haben sie als Blöcke von sagen wir 20 ms vom Treiber erhalten, Es bleibt also genügend Zeit für Berechnungen.)

Was ist mit der Verwendung eines Meterig-Chips wie MCP3909?

Unter http://www.microchip.com/design-centers/utility-metering-solutions/electric-meter/overview finden Sie umfangreiche Informationen zu diesem Thema

Die richtige Leistungsmessung ist kein einfaches Thema. Sie müssen nicht nur Leistung und Strom mit einer sehr hohen Abtastrate und Auflösung messen, sondern auch die Multiplikationen in Echtzeit durchführen. Diese speziellen Utility-Metering-Chips erledigen dies alles für Sie, und einige von ihnen bieten auch zusätzliche Leistungsinformationen wie den Leistungsfaktor.

Leider habe ich im Moment keine Zeit sie zu bestellen. Der Versand in die Vereinigten Arabischen Emirate dauert zu lange.
Ein dedizierter Chip könnte ohne dieses Versandproblem tatsächlich eine Überlegung wert sein (zumal die Möglichkeit, dass ein Pi darauf hinweist, dass es sich um ein einmaliges oder geringvolumiges und nicht um ein kostenoptimiertes Projekt handelt). Der Kommentar zur Echtzeit-Multiplikation ist jedoch falsch. Es ist erforderlich, Spannungs- und Strommesswerte vom selben Zeitpunkt zu multiplizieren, die eigentliche Berechnung kann jedoch asynchron zu einem späteren Zeitpunkt erfolgen, solange die Werte so erfasst, gespeichert und multipliziert werden, dass ihre zeitliche Entsprechung erhalten bleibt.
Nun ... das Problem ist gleichzeitig . Mit ADCs mit Multiplexeingang können Sie Strom und Spannung nicht gleichzeitig messen - dies selbst kann zu einigen (minimalen) Messfehlern führen. Das Speichern der Messungen kann problematischer sein als das Ausführen der Multiplikation. 10 Kilobyte werden für 1 Sekunde Daten benötigt, und wenn wir mehr Daten benötigen, müssen wir zu einem Flash oder externen RAM gehen (das serielle Schreiben ist tatsächlich langsamer als die Multiplikation, oder?)
@M.Hassaan, kannst du etwas von den Spezifikationen aufgeben? Wenn die Last beispielsweise ohmsch ist (oder eine Leistungsfaktorkorrektur hat), sehen Sie sowohl bei Strom als auch bei Spannung schöne Sinuswellen. Sie können dann akzeptable Messungen mit viel geringerer Smaling-Rate durchführen, z. B. 100 Abtastungen pro 20-ms-Periode oder sogar weniger. Wenn Sie Sinuswellen haben, ist es in der Tat in Ordnung, den Nulldurchgang von Strom und Spannung zu finden, um einen Leistungsfaktor zu berechnen. Dann können Sie nur den Stromsensor für etwa 20 ms lesen, um ein Maximum zu erhalten, dasselbe gilt für den Spannungssensor. Dann können Sie eine mathematische Annäherung an die ...
Ich bin mir nicht sicher, wie hoch die Last sein wird, da ich möchte, dass der Benutzer jedes Gerät <10A anschließen und den Stromverbrauch messen kann. Ich glaube jedoch nicht, dass ich 1 Sekunde an Informationen speichern muss. 1-2 Perioden reichen aus, und ich werde eine der Wellenformen zeitlich verschieben, nachdem ich die Zeit ermittelt habe, die zum Abschließen eines Lesevorgangs erforderlich ist. Hoffentlich reduziert das den Phasenfehler und hilft, eine parallele Lesung anzunähern.
...Verbrauch. Wenn Ihre Last wirklich ohmsch ist, können Sie eine gute Schätzung abgeben, indem Sie einfach das Maximum von den Stromsensoren ablesen. Das machen die billigen "clip it to your cable" Leistungsmesser, da sie von einer festen Wechselspannung und keiner Phasenverschiebung zwischen Strom und Spannung ausgehen.
Die Verwendung eines Raspberry ist keine gute Wahl, da Sie mit Software-Herausforderungen herumspielen müssen (Lese-Jitter aufgrund der Interrupt-Behandlung). Ich schlage vor, mit Arduino zu gehen. Wenn Sie dennoch die hohe Abtastrate benötigen, versuchen Sie, Ihre Messwerte zu „verschachteln“. Das heißt, zuerst 180 Samples in 20 ms erhalten - "gerade" Samples -, dann nach 55 Mikrosekunden einen weiteren Lesevorgang starten - "ungerade" Samples. Dies halbiert Ihre tatsächliche ADC-Abtastrate. Möglicherweise benötigen Sie Daten von mehreren Sekunden, um gute Ergebnisse zu berechnen. Die meisten Lasten haben beim Einschalten ein seltsames Übergangsverhalten.
Interessante Idee! Die Arduino-Referenz besagt, dass die Funktion delayMicroseconds() genaue Ergebnisse für Verzögerungen von mehr als 3 us liefert: arduino.cc/en/Reference/DelayMicroseconds . Trotzdem könnte ich eine zusätzliche Periode hinauszögern: 20 ms + 55 us, nur um auf der sicheren Seite zu sein ...
Ich habe an einer Messschaltung gearbeitet. Ich habe BL0921 verwendet. Schaltung ist ziemlich einfach. Sobald Sie die komplette Schaltung erstellt haben, müssen Sie sie mit einem Standardmessgerät kalibrieren. Ich habe einen anderen Energiezähler vom Markt verwendet, da ich keine sehr hohe Genauigkeit benötigte. Sie können den IC innerhalb einer Woche aus China erhalten, wenn Sie einen schnellen Kurier wählen. Ich habe DHL verwendet. Ich habe Alibaba verwendet, um nach Anbietern zu suchen.