Wie finde ich den RMS auf dem ARM 7 LPC-Mikrocontroller richtig?

Ich versuche, den Effektivwert einer Eingangssinuswelle mit dem Mikrocontroller ARM 7 LPC 2119 zu finden. Ich kenne die Theorie hinter dem Finden des RMS einer solchen Wellenform, aber ich habe Probleme, dies im Code zu implementieren, insbesondere das Abtasten bei gleich beabstandeten Mittelwerten. Ich habe auch gerade Timer-Interrupts verwendet, um die Frequenz einer Sinuswelle mithilfe von Capture-Eingängen zu ermitteln, sodass ich mir der grundlegenden Funktionalitäten in Bezug auf die Programmierung eines ARM 7 LPC 2119-Mikrocontrollers bewusst bin.

Geben Sie hier die Bildbeschreibung ein

Ich teste diese Funktionalität mit einer 3-V-Spitze-zu-Spitze-Sinuswelle mit einer Frequenz von 50 Hz. Ich habe die Wellenform um 1,5 V nach oben verschoben, um zu vermeiden, dass negative Werte in die ADC-Pins des Mikrocontrollers gelangen.

Um in gleichmäßigen Abständen abzutasten, verwende ich Timer-Interrupts, ähnlich wie in diesem Beispiel hier . Anstatt eine LED einzuschalten, mache ich eine ADC-Wandlung.

Bevor Sie die folgende Formel verwenden:

Geben Sie hier die Bildbeschreibung ein

Ich muss sicherstellen, dass ich in bestimmten Intervallen abtaste, und um dies zu testen, habe ich meine Zeitschaltuhr so ​​eingestellt, dass sie eine Verzögerung von 20 ms bietet, bevor sie auf die ADC-Funktion eintritt, indem ich dies tue:

T0CTCR = 0x0; //Set Timer Mode
T0PR = 60000-1; //Increment T0TC at every 60000 clock cycles
//60000 clock cycles @60Mhz = 1 mS

T0MR0 = 21-1;   //Zero Indexed Count-hence subtracting 1
T0MCR = (1<<0) | (1<<1);//Set bit0 & bit1 to Interrupt & Reset TC on MR0  

Sobald dies erledigt ist, aktiviere ich meinen Timer-Interrupt:

  VICVectAddr0 = (unsigned )timer0ISR; //Pointer Interrupt Function (ISR)
  VICVectCntl0 = (1<<5) | 4; //(bit 5 = 1)->to enable Vectored IRQ slot 
  VICIntEnable = (1<<4); // Enable timer0 interrupt

Der obige Code ergibt eine Verzögerung von 20 ms. Bei einer Sinuswelle mit 50 Hz sollte dies bei jeder Messung den gleichen Wert ergeben, da die Periode einer solchen Sinuswelle ebenfalls 20 ms beträgt. Dies ist jedoch nicht der Fall und ich kann in meinen Ergebnissen kein sichtbares Muster erkennen.

Die von mir verwendete ADC-Funktion funktioniert gut mit Gleichspannungen und ich kann auch bestätigen, dass der Timer tatsächlich eine Verzögerung von 20 ms gibt, bevor er in die ADC-Funktion eintritt.

Übersehe ich hier etwas Offensichtliches oder könnte es einige andere Variablen geben, die ich nicht berücksichtige? Irgendwelche Ideen würden geschätzt.

Antworten (1)

Der obige Code ergibt eine Verzögerung von 20 ms. Bei einer Sinuswelle mit 50 Hz sollte dies bei jeder Messung den gleichen Wert ergeben, da die Periode einer solchen Sinuswelle ebenfalls 20 ms beträgt. Dies ist jedoch nicht der Fall und ich kann in meinen Ergebnissen kein sichtbares Muster erkennen.

Hmm...

Übersehe ich hier etwas Offensichtliches oder könnte es einige andere Variablen geben, die ich nicht berücksichtige? Irgendwelche Ideen würden geschätzt.

Eine Intersample-Zeit von 20 ms ist für 50-Hz-Messungen nicht gut, und ja, da die Wechselstromfrequenz nicht konstant ist (und Ihre Uhr auch nicht), können die durchgeführten Messungen scheinbar zufällig in einer Phasenverschiebung driften.

Sehen Sie sich diese Sinuswelle an, die fast zur gleichen Zeit abgetastet wurde: -

Geben Sie hier die Bildbeschreibung ein

Es erzeugt Aliasing, dh die blaue Ausgabe sollte konstant sein, aber geringfügige Unterschiede in der Abtastfrequenz und der Sinuswelle bewirken, dass die blaue Wellenform bei der "Differenz" -Frequenz auf und ab wellt.

Wenn Sie den Effektivwert durch Abtasten richtig messen möchten, sollten Sie mit etwa 1 kHz oder mehr abtasten, insbesondere wenn Sie versuchen, den Effektivwert eines Wechselstroms zu messen (harmonische Verzerrungen können erheblich sein).

Hervorragende Beschreibung ... Ich weiß, dass ich mit einer viel größeren Frequenz abtasten sollte, aber ich dachte, der erste Schritt wäre, tatsächlich zu bestätigen, dass ich in einem bestimmten Zeitintervall abtasten könnte. Sie schlagen also vor, dass ich einfach meine Abtastrate erhöhe?
Nicht vorschlagen, sondern darauf bestehen!
SO werde ich die Verzögerung auf 1 ms reduzieren! Was ist außerdem der Fehler für meinen RMS-Wert, wenn die Zeitverzögerung während der gesamten Abtastung zwischen 0,95 ms und 1,05 ms variiert? Hat das einen großen Einfluss auf die Genauigkeit?
Es kann überraschend kleine Fehler produzieren, aber der beste Weg, den ich gefunden habe, ist die Verwendung einer Tabelle zum Testen von Szenarien. Sie sollten auch Szenarien ausprobieren, in denen es eine nicht exakte Anzahl von Samples pro Zyklus von 50 Hz gibt – dies kann zu Fehlern führen, die sich tendenziell akkumulieren, aber für eine RMS-Berechnung pro Zyklus ziemlich fehlerbehaftet aussehen können.