Forum: Mikrocontroller und Digitale Elektronik Effektivwert Spannung berechnen


von Ingo Less (Gast)


Lesenswert?

Hallo Leute,

ich möchte gern den Effektivwert eines Signals berechnen. Das Signal ist 
für Testzwecke sinusförmig. Es ist ein DC-Offset dieses Signal von 2048 
LSB vorhanden.

Ich erzeuge dieses Signal in dem ich in einem 40kHz Interrupt eine 
Sinustablle durch itteriere. Diesen virtuellen Sinus möchte führe ich 
dieser Funktion zu:
1
int32_t Generate_RMS ( const uint16_t *Voltage )
2
{
3
  static int32_t MiddleCounter = 0;
4
  float Buffer = 0.0f;
5
  float Voltage_Temp = Voltage[0];
6
7
  Voltage_Temp -= 2048;  // Free DC-Offset
8
9
  Buffer += ( ( Voltage_Temp * Voltage_Temp )  * 25.0e-6f );    // Add Squares-Values to Buffer;
10
11
  if ( ++MiddleCounter >= 40000 ){   // Integration over one Period done
12
    Buffer *= 50.0f;        // 1/T = x Frequency
13
    Buffer = sqrt (Buffer);      // Root
14
    Buffer *= 0.2633711507f;    // Skalierung
15
16
    MiddleCounter = 0;        // Reset Counter
17
    float Temp = Buffer;      // Prepare Buffer Reset
18
    Buffer = 0.0f;          // Reset Buffer
19
    return ((int32_t) (Temp *10));  // Return xxx.xV
20
  }
21
  return 0;
22
}

Leider erhalte ich aber nicht die Werte, die ich mir vorstelle, hier 230 
als Effektivwert. Was habe ich denn so gravierendes übersehen?

Bin für jeden Tip dankbar...

von xy (Gast)


Lesenswert?

So auf den ersten Blick - der float Buffer sollte auch static sein.

von Ingo Less (Gast)


Lesenswert?

Das wars, vielen Dank. Ich stand aufm Schlauch...

von Günni (Gast)


Lesenswert?

Ich sehe mehrere Fehler.
Der Effektivwert ist nach Definition RMS die Wurzel (Root) aus dem 
Mittelwert (Mean) der Quadrate (Square). D.h. die Signale müssen erst 
quadriert werden, dann daraus der Mittelwert gebildet und erst daraus 
die Wurzel gezogen werden. Und wenn man dann einen Sinus mit einem 
Offset als Signal hat, muss man überlegen, ob man den Effektivwert des 
Sinus' allein oder den Effektivwert des gesamten Signals haben will. 
Denn auch der Offset liefert einen Beitrag zum Effektivwert.

von Ingo Less (Gast)


Lesenswert?

Hier ist die Version für 3 Phasen:
1
// Input: U_L1 ... U_L3 Rohdaten
2
// Output: U_eff[0..3] L1/L2/L3/Mittel
3
void Generate_RMS ( const uint16_t *Voltage, uint16_t *U_RMS )
4
{
5
  static int32_t MiddleCounter = 0;
6
  static float Buffer[NR_OF_VOLTAGES];
7
  uint16_t DC[NR_OF_VOLTAGES];
8
  float Voltage_Temp = 0;
9
10
  Get_U_Netz_DC( (uint16_t*) DC);
11
12
  for ( uint32_t Phase = 0; Phase < NR_OF_VOLTAGES; Phase++ ){
13
    Voltage_Temp = Voltage[Phase];
14
    Voltage_Temp = Voltage_Temp - DC[Phase];              // Free from DC-Offset
15
    Buffer[Phase] += ( ( Voltage_Temp * Voltage_Temp )  * 25.0e-6f );  // Add Squares-Values to Buffer
16
  }
17
18
  if ( ++MiddleCounter >= 40000 ){   // Integration over one second done
19
    float BufferSum = 0;
20
    for ( uint32_t Phase = 0; Phase < NR_OF_VOLTAGES; Phase++ ){
21
      Buffer[Phase] = sqrt( Buffer[Phase] );
22
      Buffer[Phase] *= 2.633711507f;
23
      U_RMS[Phase] = Buffer[Phase];
24
      BufferSum += Buffer[Phase];
25
    }
26
    BufferSum /= NR_OF_VOLTAGES;
27
    U_RMS[U_L_MITTEL] = BufferSum;
28
    MiddleCounter = 0;            // Reset Counter
29
  }
30
}
Da ich hier über 1s mittele, fällt die Division mit 1/T einfach raus. 
Der Offset stört, daher rechne ich ihn raus.

von Wolfgang (Gast)


Lesenswert?

Günni schrieb:
> Und wenn man dann einen Sinus mit einem
> Offset als Signal hat, muss man überlegen, ob man den Effektivwert des
> Sinus' allein oder den Effektivwert des gesamten Signals haben will.

Nein, Effektivwert ist Effektivwert und da spielt es gar keine Rolle, 
wie das Signal zusammengesetzt ist. Sonst wäre es nicht der Effektivwert 
des Signals. Einer Glühbirne ist es egal, wie die Kurvenform im Detail 
aussieht. Es werden einfach die Quadrate der Momentanwerte gemittelt.
Die Zusammensetzung spielt nur eine Rolle, wenn man die Mittelung der 
Momentanwerte vermeiden möchte, um den Wert aus einem einfacher zu 
messenden berechnen möchte.

von Harald W. (wilhelms)


Lesenswert?

Wolfgang schrieb:

>> Und wenn man dann einen Sinus mit einem
>> Offset als Signal hat, muss man überlegen, ob man den Effektivwert des
>> Sinus' allein oder den Effektivwert des gesamten Signals haben will.
>
> Nein, Effektivwert ist Effektivwert und da spielt es gar keine Rolle,
> wie das Signal zusammengesetzt ist. Sonst wäre es nicht der Effektivwert
> des Signals. Einer Glühbirne ist es egal, wie die Kurvenform im Detail
> aussieht. Es werden einfach die Quadrate der Momentanwerte gemittelt.
> Die Zusammensetzung spielt nur eine Rolle, wenn man die Mittelung der
> Momentanwerte vermeiden möchte, um den Wert aus einem einfacher zu
> messenden berechnen möchte.

Nun, bei vielen Anwendungen macht es schon einen Unterschied,
ob ich nur AC oder AC plus DC messe. Bei meinem Agilent-
Multimeter kann ich das umschalten.

von Ingo Less (Gast)


Lesenswert?

Ich möchte die Netzspannung messtechnisch erfassen. Klappt auch soweit. 
Ich frage mich nur, warum die Werte um bis zu 400mV schwanken, bei 230V 
idealer Sinus weil intern aus Tabelle gelesen. Ich vermute hier ein 
essentielles Problem, denn egal ob ich es in float, double oder int32 
rechne, ich komme nicht exakt auf die Werte die Excel mir errechnet, 
obwohl der Rechenweg der Selbe ist.

von Wolfgang (Gast)


Lesenswert?

Harald W. schrieb:
> Nun, bei vielen Anwendungen macht es schon einen Unterschied,
> ob ich nur AC oder AC plus DC messe.

Dann ist es aber nicht der reine Effektivwert, sondern irgend etwas 
anderes, auch wenn es je nach Einsatzszenario sicher seine Berechtigung 
haben mag.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.