Der Uhrenprojekt vor einem Jahr fertig geworden. Dies ist der Beginn eines neuen Projekts, das zu einer Art Leistungsmonitor werden könnte.
Hier ist ein Bild von zwei Wellenformen auf einem Old-School-Oszilloskop aus dem Jahr 1990.
Sine wave is volts, pulse is ampsSinuswellen sind Volt, Impulse sind Ampere
Wenn die Einheiten und Maßstäbe stimmen, ist die Integration von Volt * Ampere die tatsächliche Leistung, die von der Last verbraucht wird. Ich habe das gemacht, es mir angeschaut und 47 Watt bekommen. Das war etwas enttäuschend, da es sich hierbei um das getestete Gerät handelt.
30W CFL bulb30W CFL-Glühbirne
Wenn das eine Glühbirne wäre, wären die Volt- und Amperewerte sehr ähnliche Wellenformen, sauber aufeinander abgestimmt. Aber die meisten heutigen elektronischen Geräte benötigen Strom während eines Bruchteils eines Spannungszyklus.
Mehr sehen...Meine Notizen
current: peak is 85 mv on 30 ohms. e/r=i, .085/30 = .0028 amp
x500 -> 1.4Amp
That max current is when Volts = 4, current ramps to zero as volts ramps to 6.
The volts are actually (xformer ratio 230/8.6 no load) x26.75, so 4*26.75 = 107V to 6*26.75 = 160.5V
the ramp is about 1/4 of the cycle.
treat the sine wave as a linear ramp too.
begin of ramp is .0028A * 107V
end of ramp is 0.0A * 160V
average is 1.4A * 133.5V = 186.9 volt-amps (watts)
but only 25% duty cycle
187/4 = 47W
Alle diese Zahlen sind Schätzungen, die nicht auf dem Bildschirm oder in Datenblättern enthalten sind. Einige werden sich weiter unten ändern.
Hier ist die JSL, mit der ich einige Punkte digitalisiert habe. Die Datenfelder wurden zunächst nicht ausgefüllt; das sind meine Antworten. Dies ist ein Einmalcode. Ich habe eine Abkürzung gewählt und dafür gesorgt, dass dem ersten und dem letzten Punkt weiter unten eine besondere Bedeutung zukommt.
Mehr sehen...
img = New Image( "z:/scope.jpg" );
img << rotate( 1 );
{nx, ny} = img << size;
New Window( "", gb = Graph Box( framesize( 900, 600 ) ) );
volts=[ 24.6814218645205 25, 39.4366197183099 58.0851063829787, 42.186452045607
65.531914893617, 44.1985244802146 69.3617021276596, 46.2776659959759
72.6595744680851, 48.692152917505 73.2978723404255, 51.5090543259557
72.6595744680851, 56.8075117370892 61.3829787234043, 74.6478873239437
25.8510638297872];
amps=[ 42.713423397528 50.5777501131734, 43.1254191817572 62.5531914893617,
43.7865286959854 59.4881167949298, 45.0384848775191 58.3055681303757,
45.8433138513621 55.4454504300589, 46.8908690236658 53.6853779990946,
48.4238765928907 51.1827750113173, 50.1229599821149 50.7702580353101,
51.7102615694165 50];
gb[framebox(1)]<<ADDGRAPHICSSCRIPT></ADDGRAPHICSSCRIPT>Diese Drehung um ein Grad sorgt dafür, dass das Bild xy mit dem Bildschirm übereinstimmt.
Scope traces as image in a JMP graph. The tiny black square boxes on the traces are the handles.Scope-Traces als Bild in einem JMP-Diagramm. Die kleinen schwarzen quadratischen Kästchen auf den Leiterbahnen sind die Griffe.
Nachdem ich die Punkte an ihren Platz gezogen hatte, wobei der erste und der letzte Spannungspunkt einen vollständigen Zyklus definieren und der erste und der letzte Strompunkt die Länge des Impulses definieren, habe ich dies verwendet.
Mehr sehen...
vmax = Max( volts[0, 2] ); // sine top
vmin = Min( volts[0, 2] ); // sine bottom
vrange = vmax - vmin; // sine range
amax = Max( amps[0, 2] ); // similar for pulse
amin = Min( amps[0, 2] );
arange = amax - amin;
minx = Min( volts[0, 1] ); // length of sine cycle
maxx = Max( volts[0, 1] ); // because point 1 and 9 at begin and end
pulselength = amps[9, 1] - amps[1, 1]; // length of 1 of 2 pulses
pulseduty = 2 * pulselength / (maxx - minx); // 2 pulses per cycle
dt = pulselength / 16384; // small dt improves answer
n = 0; // count the dt intervals
sum = 0;
For( t = amps[1, 1], t < amps[9, 1], t += dt, // step thru the pulse
y = Interpolate( t, volts[0, 1], volts[0, 2] ); // get the volts
v = 125 * 1.414 * (2 * (y - vmin) / vrange - 1); // map the volts
y = Interpolate( t, amps[0, 1], amps[0, 2] ); // get the amps
a = 1.4 * ((y - amin) / arange); // map the amps
sum += a * v; // watts for this dt
n += 1;
);
sum = sum / n;
sum = sum * pulseduty;
Show( sum );
zu bekommen
Summe = 25,8513297218601;
Es erforderte ein wenig Umdenken; Anstatt das schlecht definierte Windungsverhältnis des Transformators und die alte Kalibrierung des Oszilloskops zu verwenden, ging ich davon aus, dass meine Hausspannung 125 V rms beträgt, und verwendete den Faktor 1,414, um die Spitze-zu-Spitze-Spannung zu erhalten, mit der die Sinuswelle übereinstimmen sollte. Das scheint nahe genug zu sein. Nun soll der ESP32 die Punkte direkt digitalisieren ...
Mitmachen. Der ESP32 streamt FFT-Frequenzbereichsproben in ein JMP-Diagramm. 60 Hz ist bei weitem die dominierende Frequenz, gefolgt von den ersten paar ungeraden Harmonischen.
Die Boards der Version 0 kamen kurz vor Jahresende an und haben ihren Zweck erfüllt. Ich erwarte morgen die Boards der Version 1. Hier ist die Platine der Version 0, die die Spannungssinuswelle auf einem 2,8-Zoll-Display mit 240 x 320 Pixeln und einer zusätzlichen Platine zeigt. Der Flaschenverschluss dient der Waage; Schauen Sie sich den winzigen Kondensator im gelben Kreis an. Der Leiterplattenhersteller montiert das; Ich bin mir ziemlich sicher, dass ich das nicht kann.
The display is mounted to the red card, which plugs in to a connector mounted to the vertical row of holes at bottom left-center.Das Display ist auf der roten Karte montiert, die an einen Stecker angeschlossen wird, der in der vertikalen Lochreihe unten links in der Mitte angebracht ist.
Das Testen der WLAN-Verbindung während des Wartens auf die Boards der Version 1 lässt darauf schließen, dass 40.000 bis 50.000 Bytes pro Sekunde eine nachhaltige Datenrate sind, zusammen mit allem, was dieser Computer sonst noch tun muss. Ich möchte sowohl die Spannungs- als auch die Stromkanäle betrachten, also etwa 20 KB/s für jede digitalisierte Wellenform. Irgendwann möchte ich eine FFT für die Daten verwenden und habe angefangen, über Puffergrößen nachzudenken. FFTs mögen eine Leistung in zwei Größen. Wie viel? Hier ist ein Testcode:
dt = New Table( "Untitled", "invisible", New Column( "size" ), New Column( "time" ) );
dt << New Column( "factors",
character,
formula(
primes = [2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257
263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571
577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733
739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907
911 919 929 937 941 947 953 967 971 977 983 991 997 1009];
start = size;
ip = 1;
q = primes[ip];
result = "";
While( start > 1,
If( Mod( start, q ) == 0,
result = result || Char( q ) || ",";
start = start / q;//
, //
ip += 1;
q = primes[ip];
If( q * q > size, Break() );
)
);
If( start > 1,
result = result || Char( start )
);
result;
)
);
For( i = 2, i <= 2 ^ 19, i += 1,
x = 0;
x = J( i, 1, Random Uniform() );
start = HP Time();
FFT( {x} );
end = HP Time();
dt << addrows( 1 );
dt:size[N Rows( dt )] = i;
dt:time[N Rows( dt )] = (end - start) / 1e6;
If( i == 10,
dt << Graph Builder(
Size( 1709, 424 ),
Show Control Panel( 0 ),
Variables( X( :size ), Y( :time ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox,
{Marker Size( 0 ), Marker Drawing Mode( "Normal" )}
)
)
);
Wait( .1 );
);
If( Mod( i, 100 ) == 0,
Wait( 0 )
);
);
Die Tabelle sieht so aus:
2 is great,3 and 5 nice, maybe 7.2 ist großartig, 3 und 5 gut, vielleicht 7.
Es ergibt eine hübsche Grafik:
The fast buffer sizes, near the bottom, don't have large factors.Die schnellen Puffergrößen weiter unten haben keine großen Faktoren.
Was ist in diesem seltsamen Punktestapel um die 9500 herum enthalten? Auswählen, Teilmengen, einen Blick darauf werfen ...
Bigger factorsGrößere Faktoren
Es sieht so aus, als ob JMP in der Lage sein wird, ein Echtzeit-Dashboard zu erstellen, wenn ich einen 1024- oder 2048-Sample-Puffer verwende.
Very fast.Sehr schnell.
Selbst bei 60 Mal pro Sekunde liegt sie unter 1 %. Ich kann die FFT auf dem esp32 ausführen. Anstatt vollständige Wellenformen zu senden, senden Sie dann möglicherweise nur die obersten N Frequenzbereiche und Amplituden. Eine Reihe von Kompromissen, die es zu berücksichtigen gilt.