Forum: Mikrocontroller und Digitale Elektronik Netzmessung: Frequenz, Amplitude, Phase aus ADC-Samples


von Michael H. (overthere)


Lesenswert?

Hallo,

folgendes Setup:
Ich möchte vom 50Hz Netz aus Frequenz, Amplitude & Phasenlage bestimmen. 
Das ganze mit möglichst wenig Rechenaufwand (=Laufzeit).
Cortex M4 habe ich zum Rechenen, also sollte einiges gehen.

Ich messe z.B. mit einer Abtastrate von 10kHz die Netzfrequenz und 
möchte (nach einer Einschwingzeit x) die oben genannten Werte erhalten.

Was ich mir bisjetzt überlegt hatte:
1. FFT
"Haste keine Ahnung mach 'ne FFT" und lies die entsprechenden Werte 
raus. Die Phasenlage würde ich aber so nicht bekommen.

Was mir suspekt ist: Viel zu viel Rechnerei.

2. Pony
Hier im Forum gefunden
Beitrag "Frequenz, Amplitude und Phase eines Sinussignals bestimmen"

Was mir suspekt ist: Abtastratensensibel

3. "PHASOR MEASUREMENT UNIT ALGORITHM USING DELAY DEVICES"
Irgendwie basierend auf Lisagou-Figuren, ohne das ich das jetzt richtig 
verstanden habe.
Demo
https://www.youtube.com/watch?v=ItjDd4kSHJc
Paper
http://www.eurasip.org/Proceedings/Eusipco/Eusipco2015/papers/1570093445.pdf

Sieht eigentlich ganz okay aus, jedoch immer noch Rechnerei.

4. Idee: Sinusfrequenz mit Bandpass filtern (z.B. 49Hz-51Hz) + 
Nulldurchgang messen

Welche Algorythmen ich schon ausgeschlossen habe:
-Nulldurchgangsmessung: Ungenau bei Netzmodulation


Meine Fragen an euch.
Habt ihr schon was implementiert, und wenn ja mit was habt ihr gute 
Erfahrungen? Wieviel Rechenzeit habt ihr einplanen müssen? Was sollte 
man auf jeden Fall bleiben lassen?

Danke für den Support,
Michael

von Hp M. (nachtmix)


Lesenswert?

Michael H. schrieb:
> Irgendwie basierend auf Lisajous-Figuren, ohne das ich das jetzt richtig
> verstanden habe.

Ist aber das einfachste.
Ausser dem zu messenden Signal brauchst du eine genaue und stabile 
Referenzfrequenz, z.B. aus DCF77 oder GPS abgeleitet.

P.S.:
Fourier kannst du hier vergessen; der zeigt dir nur, ob das Signal 
verzerrt ist oder andere Frequenzen enthält.

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Frquenzmessung kannste ja schonmal so machen:
http://www.fritzler-avr.de/HP/netzfreq.php
oder mit einem internen 32Bit Zähler im µC.

Phasenlage vergleichste dann mit einem internen 50Hz Signal.

von Michael H. (overthere)


Lesenswert?

Frizler, du machst das Quasi über einen gefilterten Nulldurchgang. Ich 
finde das mit den Transistoren eine clevere Lösung!

Ich habe die Hardware schon fertig (Netzmessung) und möchte eigentlich 
"nurnoch" einen Algo drüberprogrammieren.

von ./. (Gast)


Lesenswert?

> Phasenlage

ist ja wohl Kaese.
Woher soll die Bezugsphase kommen?
Von den Vogonen?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

./. schrieb:
>> Phasenlage
>
> ist ja wohl Kaese.
> Woher soll die Bezugsphase kommen?

Wie ich schon sagte, dazu braucht man "einfach" ein genaues internes 
50Hz Signal und vergleicht dazu.
Mir fällt aber nicht ein wozu man das bräuchte.

Michael H. schrieb:
> Ich habe die Hardware schon fertig (Netzmessung) und möchte eigentlich
> "nurnoch" einen Algo drüberprogrammieren.

Das Problem ist eben, dass die Netzfrequenz auf 10mHz genau gemessen 
werden muss.
Bei 10kS/s und ner FFT sehe ich nicht wie das klappen soll.
Eine FFT mit einem Binning <10mHz würde ich jetzt auch nicht als 
"möglichst wenig rechenaufwand" einstufen.
Meine Schaltung tastet das Signal quasi als 1Bit ADC mit 16MS/s ab.
Demnächst kommt dann noch das 1pps Signal aus nem GPS Empfänger dazu.

von Wolfgang H. (Firma: AknF) (wolfgang_horn)


Lesenswert?

Hi, Michael,

das war meine erste Anwendung eines Switched-Capacitor-Filters von 
Reticon. Damals R5622, Nachfolger LMF100.
Beide Filter im IC gemeinsam als Bandpass geschaltet, RC-Tiefpässe davor 
und danach.
Sehr wenig Hardware für die Qualität der Filterflanken.

Ciao
Wolfgang Horn

von Lurchi (Gast)


Lesenswert?

Die FFT bringt eher nicht die nötige Auflösung und ist auch nicht so 
wenig Rechenaufwand. Die Rechenzeit ist dabei eher weniger das Problem, 
sondern der Speicherbedarf kann auf einem µC zum Problem werden.

Die Phasor-methode sollte so oder so ähnlich wie im Artikel beschrieben 
schon ganz gut funktionieren. Bei den Sinus / cosinus werten kann man 
ggf. Tabellen nutzen, wenn die Rechenzeit knapp werden sollte. Der Witz 
bei der Methode ist, das nach dem ersten schritt mit einer sehr viel 
niedrigeren Zwischenfrequenz (nahe 0) gearbeitet wird. Entsprechend 
reichen da wenige Samples aus, und nur der erste Schritt ist wirklich 
zeitkritisch. Auch braucht man nur relativ wenig daten-speicher.

Die Filtermethode kann in Prinzip auch funktionieren, wenn der 
numerische Filter wirklich gut ist, aber dann wird auch der Aufwand für 
die Berechnung sehr hoch, höher als bei der Phasor methode.

von H.Joachim S. (crazyhorse)


Lesenswert?

Phasenlage zu bestimmen verstehe ich trotzdem nicht. Macht doch 
keinerlei Sinn die Phasenlage zu einem beliebigen, von mir aus auch 
hochgenauen, aber dennoch asynchronen Referenzsignal zu messen? Solange 
die Signale nicht  phasenstarr sind, gibts da nichts zu messen. Da kann 
jeder beliebige Wert rauskommen, der dann auch noch ständig wandert, 
wenn die Signale nicht frequenzgleich sein (und das können sie nicht 
sein ohne Kopplung). Aber selbst bei Frequenzgleichheit sagt das doch 
überhaupt nichts aus?

von m.n. (Gast)


Lesenswert?

H.Joachim S. schrieb:
> Solange
> die Signale nicht  phasenstarr sind, gibts da nichts zu messen.

Ich denke, das ist beim TO noch nicht angekommen.

von Reinhard M. (Gast)


Lesenswert?

./. schrieb:
>> Phasenlage
>
> ist ja wohl Kaese.
> Woher soll die Bezugsphase kommen?

Dachte ich auch im ersten Augenblick.
Aber für die Energieversorgungsunternehmen kann es durchaus
vorteilhaft sein die Einspeisung in das Verbundnetz,
das dann als Referenz dient, frequenz- UND phasenrichtig durchzuführen.
Der Phasor, wie in dem obengenannten Paper beschrieben, ist dann
ein vernünftiger Messwert für die Regelung.

Das Paper weißt ja auch auf eine Anwendung bei einem japanischen EVU 
hin.
Für den Endanwender im trauten Heim ist die Phase natürlich beliebig 
sinnvoll ;-)

von Helmut L. (helmi1)


Lesenswert?

Reinhard M. schrieb:
> Aber für die Energieversorgungsunternehmen kann es durchaus
> vorteilhaft sein die Einspeisung in das Verbundnetz,
> das dann als Referenz dient, frequenz- UND phasenrichtig durchzuführen.

Dann dient aber das 2. Netz als Bezugspunkt um die Phasengleichheit 
herzustellen. In den Anfaengen der Wechselstromtechnik wurde sowas mit 
Glimmlampen in Hell oder Dunkelschaltung syncronisiert.

von Reinhard M. (Gast)


Lesenswert?

Um nochmal auf das Paper zu kommen:

Die Pseudo IQ Generierung finde ich clever und kann ich in
einer C++ Simulation erfolgreich nachvollziehen.
1
void IQ_gen (double x)  // 2.4 IQ-Signal Generation
2
{
3
    static double x_1 = 0.0;
4
    double I = x;
5
    double Q = a0 * x + a1 * x_1;
6
    x_1 = x;
7
8
    //fprintf(fp,"%f %f\n",I,Q);
9
10
    x1.clear();
11
    x1.push_back(I);
12
    x1.push_back(Q);
13
}

Der Referenzoszillator ist simpel
1
void REF_gen (double x_ref)
2
{
3
    double I = sin(x_ref);
4
    double Q = -cos(x_ref);
5
6
    x2.clear();
7
    x2.push_back(I);
8
    x2.push_back(Q);
9
}

Die Berechnung des Phasors liefert sinnvolle Resultate
1
void vector_op()  //2.3 Vector Operation
2
{
3
    double skalarprodukt = x1[0] * x2[0]  +  x1[1] * x2[1];
4
    double betrag_x1 = sqrt( x1[0]*x1[0] + x1[1]*x1[1] );
5
    double betrag_x2 = sqrt( x2[0]*x2[0] + x2[1]*x2[1] );
6
    double res = /*acos*/ ( skalarprodukt /( betrag_x1 * betrag_x2) );
7
8
    double determinante =  x1[1]*x2[0] - x1[0]*x2[1];
9
    double res2 = /*asin*/ ( determinante /( betrag_x1 * betrag_x2) );
10
11
    x3.clear();
12
    x3.push_back(res);
13
    x3.push_back(res2);
14
15
    //fprintf(fp,"%f \n",res);
16
17
}

Aber die eigentliche Frequenzmessung habe ich nicht verstanden.
Meine Interpretation, die NICHT funktioniert.
1
void F_meas(double s)
2
{
3
    static double SP[2] ={0.0,0.0};
4
    static double SQ[2] ={0.0,0.0};
5
    static double SR[2] ={0.0,0.0};
6
    static double SS[2] ={0.0,0.0};
7
8
    SP[0] = s;
9
    SQ[0] = SP[1];
10
    SR[0] = SQ[1];
11
    SS[0] = SR[1];
12
13
    double LS1 = SQ[0] * SR[1] - SQ[1] * SR[0];
14
    double LS2 = SP[0] * SS[1] - SP[1] * SS[0];
15
16
    SP[1] = SP[0];
17
    SQ[1] = SQ[0];
18
    SR[1] = SR[0];
19
    SS[1] = SS[0];
20
21
    double f = 
22
    (10000.0 / ( 2.0 * TWOPI)) *  (acos (  1.0/2.0 * LS2/LS1 -1) );
23
24
    
25
    cout <<  f << endl;
26
}

Hat sich schon jemand mit der Frequenzmessung im Detail beschäftigt ?

von Reinhard M. (Gast)


Angehängte Dateien:

Lesenswert?

Die Frequenzmessung klappt jetzt:
1
double Fmeas (double s_0, double fsample)   // 2.2 Frequency Measurement
2
{
3
  double K = 2.0;
4
  static double s_1 = 0.0;
5
  static double s_2 = 0.0;
6
  static double s_3 = 0.0;
7
  static double s_4 = 0.0;
8
9
  double LS1 = s_1 * s_2  -  s_0  * s_3;
10
  double LS2 = s_0 * s_3  -  s_1  * s_4;
11
  double f = (fsample/(TWOPI * K)) *acos(0.5*LS2/LS1);
12
13
  s_4 = s_3;
14
  s_3 = s_2;
15
  s_2 = s_1;
16
  s_1 = s_0;
17
18
19
  return f;
20
21
22
}


Zur Simulation lasse ich einen Tiefpassfilter mitlaufen,
um eine Phasenverschiebung zu generieren:
1
/***********************************************************************************************************************************\
2
              |--> DUT (filter,etc) --sin(nW + phi)-> PseudoIQ ---(sin(nW + phi),-cos(nW + phi))--->|-----------|
3
  sin(nW)---->|                                                                                     | Vector_op |----> phasor--> phi
4
              |-------------------------------------> PseudoIQ ---(sin(nW),-cos(nW))--------------->|-----------|
5
                                                     (Referenz)
6
\***********************************************************************************************************************************/
7
void analysePhasor()
8
{
9
    FILE *fp;
10
    fp = fopen( "sniff.txt", "w+");
11
12
    double fsample = 10000.0;
13
    double fsignal = 50.123456;
14
    double fcut = 50.0;
15
    double f=0;
16
17
    W = TWOPI * fsignal / fsample; // Ω
18
    rho = W - PI/2.0;
19
20
    a0 = tan(rho);
21
    a1 = 1.0 / cos(rho);
22
23
24
    // create a lpfilter
25
    Biquad * lp = new Biquad();
26
    lp->setBiquad( bq_type_lowpass, fcut/fsample , 0.707, 0);
27
28
    for (int n = 0; n <= 2000; n++)
29
    {
30
        // Signal
31
        double x = sin(  n * W );
32
        if(n <= 4)
33
      f = Fmeas(x,fsample);
34
35
       // Filter
36
        double xx = lp->process(x);
37
38
39
        // Pseudo IQ
40
        IQ_gen(xx);
41
42
        // Referenz
43
        REF_IQ_gen(x);
44
45
        // Vector Operation
46
        vector_op();
47
        double w_rad = acos(x3[0]);
48
        double w_deg = w_rad / PI * 180.0;
49
50
        // Print Result(s)
51
        printf("%f  %f    %f  %f\n",x,xx,w_deg,f);
52
53
        // gnuplot -p -e "plot 'sniff.txt' with lines"
54
         fprintf(fp,"%f %f\n",x,xx);            // Lissajou
55
        //fprintf(fp,"%f %f\n",x1[0],x1[1]);    // IQ
56
        //fprintf(fp,"%f\n",w_deg);             // phi
57
        //fprintf(fp,"%f\n",xx);                // Filter output
58
59
    }
60
    fclose(fp);
61
}

quick und dirty
1
 g++ main.cpp Biquad.cpp -o PMU_Simulation

von Michael H. (overthere)


Lesenswert?

Hallo Reinhard,

ich bin beeindruckt.

Deinen Code muss ich gleich mal nachvollziehen.

-Michael

: Bearbeitet durch User
von Reinhard M. (Gast)


Lesenswert?

Hallo Michael
über die F -Messung muss noch meditieren.
Es sieht so aus, als müsste der Beginn der Messung beim Nulldurchgang
starten.
Ein Rücksetzen der Zustandsvariablen bringt nichts.
deshalb
1
       if(n <= 4)
2
    f = Fmeas(x,fsample);

Naja, für eine erste Demo reicht es.
Ich möchte mich weiter mit dem Thema beschäftigen, falls ich die
Zeit dazu finde.

Schönes WE.

von Michael H. (overthere)


Lesenswert?

Naja, wie Du schon geschrieben hast, die F-Messung will noch nicht; die 
misst nur das 4. mal richtig, wenn man es weiterlaufen lässt, dann will 
es nicht.
Ich werde mir mal das Paper nochmals genau durchlesen (müssen) und noch 
ein paar Grundlagen verstehen, denn soweit wie Du bin ich noch nicht.

von Michael H. (overthere)


Lesenswert?

Update: Was mir bei der Frequenzmessung aufgefallen ist: Wir haben ja 
einen Delay von 4, also brauchen wir 5 variablen.

Der hat da ja eine Mittelwertbildung reingebracht, leider ist die Formel 
nicht so wirklich leicht verständlich.

Hat jemand das Lissajous Product verstanden, wie das funktioniert?

Was mir sonst noch bei der Frequenzmessung aufgefallen ist:
Wird das nicht bei jedem durchlauf zu Null gesetzt?
>static double s_1 = 0.0;
>static double s_2 = 0.0;
>static double s_3 = 0.0;
>static double s_4 = 0.0;

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Guck dir mal unbedingt an was "static" in C bedeutet.

von Michael H. (overthere)


Lesenswert?

Static: Ja, habs nochmal nachgelesen. Passt scho. Hatte ich falsch in 
Erinnerung...
Variablenanzahl: Auch klar, wir haben die ganze Zeit schon 5.

Jedoch sagt, mir meine Nase, das in diesem L.-Produkt der Hund vergraben 
liegt. Im Paper ist das nicht gut erklärt.

: Bearbeitet durch User
von Horst (Gast)


Lesenswert?

Michael H. schrieb:
> 1. FFT
> "Haste keine Ahnung mach 'ne FFT" und lies die entsprechenden Werte
> raus. Die Phasenlage würde ich aber so nicht bekommen.

Warum das denn nicht? Natürlich liefert die FFT auch die Phasenlage.
Und wenn eine hohe Auflösung bei nur wenigen interessanten Bins zu 
aufwändig ist, dann schaue man sich den Görtzel-Algo an.

von Michael H. (overthere)


Angehängte Dateien:

Lesenswert?

So, ich hab die Frequenzmessung am laufen.

Ich habe die alten s-Werte in den Kommentaren stehen, die neuen, 
richtigen im Code.
1
double s_1 = 0.0;
2
double s_2 = 0.0;
3
double s_3 = 0.0;
4
double s_4 = 0.0;
5
double s_5 = 0.0;
6
7
8
double Fmeas (double s_0, double fsample)   // 2.2 Frequency Measurement
9
{
10
  double K = 2.0;
11
12
  double LS1; //= s_1 * s_2  -  s_0  * s_3;
13
  double LS2; // = s_0 * s_3  -  s_1  * s_4;
14
  
15
  LS1=s_1*s_4-s_2*s_3;
16
  LS2=s_0*s_5-s_1*s_4;
17
  
18
  double f = (fsample/(TWOPI * K)) *acos(LS2/(2*LS1));
19
20
  fprintf(fp,"%10f %10.8f %10.8f %10f %10f %10f %10f %10f\n",f, LS1, LS2, s_0,s_1,s_2,s_3,s_4);
21
  
22
  s_5 = s_4;
23
  s_4 = s_3;
24
  s_3 = s_2;
25
  s_2 = s_1;
26
  s_1 = s_0;
27
28
  return f;
29
30
31
}

Was jetzt noch ein "lustiges" Phänomen ist:
Selbst eine kleine Störung 10^-6 Peak-RMS liefert große Abweichungen.
1
double x = sin(  n * W ) + (rand()%100)*0.00000001;
2
double xref = sin(  n * W_ref);
3
        
4
f = Fmeas(x,fsample);

Erzeugt mir folgenden Sniff:
1
      -nan 0.00000000 0.00000000   0.000001   0.000000   0.000000   0.000000   0.000000
2
      -nan 0.00000000 0.00000000   0.031489   0.000001   0.000000   0.000000   0.000000
3
      -nan 0.00000000 0.00000000   0.062946   0.031489   0.000001   0.000000   0.000000
4
1250.000000 -0.00000003 0.00000000   0.094340   0.062946   0.031489   0.000001   0.000000
5
1249.984281 -0.00198204 -0.00000008   0.125642   0.094340   0.062946   0.031489   0.000001
6
 49.747421 -0.00198199 -0.00395623   0.156818   0.125642   0.094340   0.062946   0.031489
7
 50.039151 -0.00198201 -0.00395618   0.187839   0.156818   0.125642   0.094340   0.062946
8
 51.001307 -0.00198212 -0.00395611   0.218674   0.187839   0.156818   0.125642   0.094340
9
 48.596202 -0.00198192 -0.00395646   0.249291   0.218674   0.187839   0.156818   0.125642
10
 51.740191 -0.00198224 -0.00395610   0.279662   0.249291   0.218674   0.187839   0.156818
11
 50.246238 -0.00198210 -0.00395630   0.309755   0.279662   0.249291   0.218674   0.187839
12
 48.372951 -0.00198181 -0.00395630   0.339541   0.309755   0.279662   0.249291   0.218674
13
 51.109082 -0.00198205 -0.00395592   0.368991   0.339541   0.309755   0.279662   0.249291
14
 49.941417 -0.00198201 -0.00395621   0.398074   0.368991   0.339541   0.309755   0.279662
15
 49.441582 -0.00198202 -0.00395639   0.426762   0.398074   0.368991   0.339541   0.309755
16
 51.774282 -0.00198229 -0.00395619   0.455027   0.426762   0.398074   0.368991   0.339541
17
 49.335792 -0.00198204 -0.00395646   0.482841   0.455027   0.426762   0.398074   0.368991
18
 50.181511 -0.00198200 -0.00395611   0.510176   0.482841   0.455027   0.426762   0.398074
19
 49.873847 -0.00198192 -0.00395605   0.537006   0.510176   0.482841   0.455027   0.426762
20
 49.373295 -0.00198190 -0.00395618   0.563302   0.537006   0.510176   0.482841   0.455027
21
 50.184781 -0.00198215 -0.00395642   0.589040   0.563302   0.537006   0.510176   0.482841
22
 53.642886 -0.00198243 -0.00395586   0.614194   0.589040   0.563302   0.537006   0.510176

Folglich: Filtern ist Pflicht!

Reinhard: Wie würdest Du das machen?

von Michael H. (overthere)


Lesenswert?

So, ich habe mal einen universalen Filter implementiert, mit etwas mehr 
Rechenaufwand (leider natürlich...)
1
#define NUM_OF_AVG 50
2
#define NUM_OF_MEM (5+NUM_OF_AVG)
3
4
double sample[NUM_OF_MEM];
5
double Fmeas_uniavg (double s_0, double fsample)   // 2.2 Frequency Measurement
6
{
7
  double K = 2.0;
8
9
  double LS1=0;
10
  double LS2=0;
11
  sample[0]=s_0;
12
  int i;
13
  for(i=0;i<NUM_OF_AVG;i++){
14
    LS1=LS1+(sample[0+i]*sample[3+i]-sample[1+i]*sample[2+i]);
15
    LS2=LS2+(sample[0+i]*sample[5+i]-sample[1+i]*sample[4+i]);
16
  }
17
  
18
  double f = (fsample/(TWOPI * K)) *acos(LS2/(2*LS1));
19
20
  fprintf(fp,"%10f %10.8f %10.8f %10.8f %10f %10f %10f %10f %10f\n",f, (LS2/(2*LS1)), LS1, LS2, sample[0],sample[1],sample[2],sample[3],sample[4]);
21
  
22
  for(i=(NUM_OF_MEM-1);i>0;i--){
23
    sample[i]=sample[i-1];
24
  }
25
  
26
  return f;
27
28
29
}

Einen Kommentar noch zur Genauigkeit:
Je kleiner man den Änderungswinkel macht, desto mehr wirkt sich das 
Rauschen aus. Daher ist es empfehlenswert die Samplingfrequenz zu 
senken, und eventuell mit dem MCU Hardware-Averaging betreiben.

Wenn ich jetzt den Filter auf 50 Durchschnittswerte und die 
Samplingfrequenz auf 1000Hz Einstelle komme ich auf 50.1234xx was für 
OTTO-ADVANCED-Programmer reichen sollte.

Zum Schluss muss ich noch was loswerden: Der Typ ist ein Genie. Ich 
staune immer wieder was man alles mit Sinus/Cos-Sätzen machen kann.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ist jetzt nurnoch die Frage ob das Ergebnis stimmt.
Kannste ja hiermit abgleichn: http://www.netzfrequenzmessung.de/
Aber nicht daurnd laufen haben, nach ner Weile wird man für nen Tag 
gesperrt wegen zu viel Traffic.
Server zu schwach...

von Michael H. (overthere)


Lesenswert?

Mw E. schrieb:
> Ist jetzt nurnoch die Frage ob das Ergebnis stimmt.

Ich erzeuge im Code meine eigene Referenzfrequenz, Das Skript schiebt 
nur Zahlen hin und her. Und daher weiß ich, dass es stimmt. Weil das 
rauskommt was rauskommen soll.

von Reinhard M. (Gast)


Lesenswert?

Hallo Michael
entschuldige das ich mich erst jetzt wieder melde,
aber am Wochenende bin ich meistens nicht online;-)

Du hast vollkommen recht: Filtern ist Pflicht.
In dem Paper wurde dem Averaging auch ein Absatz gewidmet,
den hab ich bislang ignoriert, weil ich ihn nicht so wichtig hielt.
Dem ist aber anscheinend nicht so.

Deine Updates werde ich mir dann gleich mal anschauen.

Michael H. schrieb:
> Je kleiner man den Änderungswinkel macht, desto mehr wirkt sich das
> Rauschen aus. Daher ist es empfehlenswert die Samplingfrequenz zu
> senken, und eventuell mit dem MCU Hardware-Averaging betreiben.
>
> Wenn ich jetzt den Filter auf 50 Durchschnittswerte und die
> Samplingfrequenz auf 1000Hz Einstelle komme ich auf 50.1234xx was für
> OTTO-ADVANCED-Programmer reichen sollte.

Das ist schon ein sehr interessantes Phänomen.

von Michael H. (overthere)


Lesenswert?

Ich habe an der Schaltung etwas weiter gearbeitet und auch mal ein 
GitHub Repo erstellt.

https://github.com/greenscreenflicker/grid-meas

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.