Inhaltsverzeichnis:
- Schritt 1: Demonstration
- Schritt 2: Verwendete Ressourcen
- Schritt 3: Blockdiagramm
- Schritt 4: Schema
- Schritt 5: LM386 - Pinning
- Schritt 6: AmpOp - Differential (Subtrahierer)
- Schritt 7: AmpOp - Inverter Adder
- Schritt 8: Ahorn Mini - Pinage
- Schritt 9: Maple Mini - Pinning - a / D beim Erfassen verwendet
- Schritt 10: Montage
- Schritt 11: Diagramm mit den erhaltenen Daten
- Schritt 12: Berechnung des RMS-Wertes
- Schritt 13: Quellcode
- Schritt 14: Dateien
2025 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2025-01-13 06:56
Heute verwenden wir den STM32 Maple Mini, um eine AC-Messung durchzuführen. In unserem Beispiel erhalten wir den RMS-Wert des Stromnetzes. Dies ist sehr nützlich für diejenigen, die das elektrische Netz für das Internet der Dinge überwachen möchten. Anschließend erstellen wir eine Anwendung mit der Rechenleistung des Maple Mini, wenden eine elektronische Schaltung an, die die Erfassung eines 127-Vac-Signals ermöglicht, sowie die Berechnung des Effektivwerts (RMS) auf die Samples.
Schritt 1: Demonstration
In unserer heutigen Baugruppe haben wir zusätzlich zu unserer analogen Schaltung den STM32, um den Eingang von 110 zu machen. Um Stöße zu vermeiden, isolieren Sie den Widerstand, der eingeht, um 110.
Die Schaltung ist recht empfindlich. Ich komme mit 110 rein, aber ich reduziere es mit dem Spannungsteiler auf das 168-fache und stecke es in den Operationsverstärker, der mehrere Funktionen hat.
Wir haben auch einige optionale Kondensatoren für die Quellenfilterung. Wenn Ihre Quelle von guter Qualität ist, müssen Sie sie nicht verwenden.
Der AD-Eingang wird durch das Oszilloskop berechnet, in dem Sie eine Sinuskurve sehen, die nicht 110 ist (aber gut geformt ist). Eine andere Sache ist, dass die Spannung in unserem Stromnetz nicht 110 beträgt (eigentlich sind es 127 Volt). Aber da wir einen Stabilisator durchlaufen, wird er sich auf 115 V einstellen.
Der auf dem seriellen Monitor angezeigte Wert wird in RMS berechnet, d. h. der vom Fluke Meter identifizierte Wert.
Schritt 2: Verwendete Ressourcen
• Jumper
• Ein Ahorn-Mini
• Protoboard
• Ein LM386-Verstärker
• Eine symmetrische Quelle (+ 5 V und -5 V)
• Ein 10k Multiturn-Trimpot (oder Potentiometer)
• Vier Kondensatoren aus 100nF Polyester
• Drei 10k Widerstände
• Vier 470k-Widerstände
• Ein 5k6 Widerstand
• Eine 1n4728A Zenerdiode
Schritt 3: Blockdiagramm
Schritt 4: Schema
Dies ist eine Schaltung, die ich basierend auf den Spezifikationen entwickelt habe, von denen ich glaube, dass sie die besten für diese Messung sind, aber es gibt mehrere andere Beispiele, die im Internet zu finden sind.
Schritt 5: LM386 - Pinning
Der LM386 verfügt über zwei Verstärker zur Aufbereitung oder Signalverstärkung.
Schritt 6: AmpOp - Differential (Subtrahierer)
Schritt 7: AmpOp - Inverter Adder
Schritt 8: Ahorn Mini - Pinage
Pins markiert auf:
Rot >> 3V3 tolerant
Grün >> 5V tolerant
Schritt 9: Maple Mini - Pinning - a / D beim Erfassen verwendet
Ich betone hier, dass der von mir verwendete Pin der D11 ist, der (in der Nomenklatur der STMicroelectronics) der PA0 ist.
Schritt 10: Montage
Für unsere Schaltung benötigen Sie eine symmetrische Quelle, wie wir sie für dieses Projekt erstellt haben. Andernfalls benötigen Sie zwei Quellen.
Schritt 11: Diagramm mit den erhaltenen Daten
Schritt 12: Berechnung des RMS-Wertes
Schritt 13: Quellcode
Quellcode - Definitionen und Konstanten
Zuerst haben wir den Pin-Wert als D11 definiert, sowie die verschiedenen Konstanten, die in den Berechnungen verwendet werden.
#define leituraTensao D11 //AD CH0 kein Pino PA0 //valor teórico divisor de tensão = 168.85714285714285714286 const float fatorDivisor = 168.40166345742404792461; //valor teórico do ganho de amplificação = 1.0 const float fatorAmplificador = 1.0; //Valor usado na multiplicação da leitura const float fatorMultiplicacao = fatorDivisor * fatorAmplificador; //Valor teórico da Tensão de alimentação Vcc = 3,3 V const float Vcc = 3,3; // Valor teórico tun Offset tun Verstärker = Vcc / 2,0; const float offSet = 1,66; // fator teórico da conversão do AD = 3,3 / 4095.0 const float fatorAD = Vcc / 4095.0; const int amostras = 71429; //resulta em 1, 027 segundos para cada atualização //const int amostras = 35715; //resulta em 0, 514 segundos para cada atualização
Quellcode - Globale Variablen
Nun definieren wir einige globale Variablen.
Schwimmer Vrms = 0,0; // Armazena o Valor RMS da Tensãofloat Vmax = 0.0; //armazena o valor máximo Detectado float Vmin = 10000.0; //armazena o valor minimo Detectado float Vmed = 0.0; //armazena o valor médio entre Vmáx e Vmín
Quellcode - Einrichtung ()
Starten Sie den seriellen Port mit 1 Mbit/s. Wir haben den AD-Port als Eingang eingestellt und 5 Sekunden gewartet, bevor wir mit der Datenerfassung begonnen haben. Standby-Zeit ist optional.
Void setup () { Serial.begin (1000000); // Initialisierung einer Porta Serial em 1Mbps PinMode (leituraTensao, INPUT); // ajusta a porta do AD como entrada delay (5000); //aguarda 5s antes de iniciar a coleta. (optional) }
Quellcode - Schleife () - Startet die Datenerfassungsvariablen
In der Schleife haben wir die Variable für die Iteration. Hier speichern wir auch die Messwerte von AD in 0.0 und starten die Variable VRMS ebenfalls in 0.0 neu.
Void Schleife () {int i = 0; //variável para iteração float leitura = 0.0; // Armazena als Leituras tun AD Vrms = 0.0; //reinicia a variável Vrms
Quellcode - Erfasst und führt die einzelnen Berechnungen für jede Probe aus
Wenn i in diesem Stadium kleiner ist als der Abtastwert, starten wir einen Abtastzyklus, bis i die Anzahl der Abtastwerte erreicht. Wir führen analogRead aus, um den analogen Port zu lesen und die Summe der Quadrate der gelesenen Spannungen zu berechnen. Schließlich inkrementieren wir den Iterator.
while (i <amostras) {//inicia um ciclo de amostragem até que i alcance o número de amostras leitura = analogRead (leituraTensao); //lê a porta analógica //Serial.println(leitura); //Descomente se quiser ver o sinal bruto do AD Vrms = Vrms + pow((((leitura * fatorAD) - offSet), 2.0); // berechne ein soma dos quadrados das tensões lidas i++; //Incrementa oder Iterador}
Quellcode - Allgemeine Berechnungen der Stichproben und Identifizierung von Maximum, Minimum und Durchschnitt
Wir wenden den Multiplikationsfaktor an, um den tatsächlichen Wert der Spannungen zu bestimmen. Wir erkennen, ob der Wert maximal oder minimal ist und berechnen den Durchschnitt der aktuellen Maximal- und Minimalwerte.
// Aplicando fator de multiplicação para determinar o valor real das tensões Vrms = (sqrt(Vrms / amostras)) * fatorMultiplicacao; // detecta se é um valor é máximo if (Vrms > Vmax) { Vmax = Vrms; } //detecta se é um valor minimo if (Vrms < Vmin) { Vmin = Vrms; aufrechtzuerhalten. // Berechnen eines Mediums dos valores máximo e minimo atuais Vmed = (Vmax + Vmin) / 2,0;
Quellcode - Ausgabeoptionen
Wir haben drei Möglichkeiten, den Ausgabewert zu "plotten". Wir haben die Ausgabe auf den seriellen Plotter Arduino IDE formatiert, wie CSV oder Jason.
// Formatada für Plotter serielle IDE Arduino Serial.print (Vrms, 3); Serial.print (", "); Serial.print (Vmax, 3); Serial.print (", "); Serial.print (Vmin, 3); Serial.print (", "); Serial.println (Vmed, 3); /* //saída formatada como json Serial.print("{"instante(ms)\":"); Serial.print (millis ()); Serial.print (", "); Serial.print("\"Vrms(V)\":"); Serial.print (Vrms, 3); Serial.print (", "); Serial.print("\"Vmax(V)\":"); Serial.print (Vmax, 3); Serial.print (", "); Serial.print("\"Vmin(V)\":"); Serial.print (Vmin, 3); Serial.print (", "); Serial.print("\"Vmed(V)\":"); Serial.print (Vmed, 3); Serial.println("}"); */ /* //saída formatada como CSV Serial.print (millis()); Serial.print (", "); Serial.print (Vrms, 3); Serial.print (", "); Serial.print (Vmax, 3); Serial.print (", "); Serial.print (Vmin, 3); Serial.print (", "); Serial.println (Vmed, 3); */ }
Schritt 14: Dateien
Laden Sie die Dateien herunter:
INO