IL progetto dell'orologio finito un anno fa. Questo è l'inizio di un nuovo progetto, che potrebbe trasformarsi in una sorta di misuratore di potenza.
Ecco un'immagine di due forme d'onda su un oscilloscopio vecchia scuola del 1990 circa.
Sine wave is volts, pulse is ampsL'onda sinusoidale è volt, l'impulso è ampere
Se le unità e le scale sono corrette, l'integrazione di volt * ampere è la vera potenza utilizzata dal carico. L'ho fatto, guardandolo a occhio, e ho ottenuto 47 watt. È stato un po' deludente perché questo è il dispositivo in prova.
30W CFL bulbLampadina CFL da 30 W
Se quella fosse una lampadina a incandescenza, i volt e gli ampere sarebbero forme d'onda molto simili, perfettamente allineate. Ma la maggior parte dei componenti elettronici di oggi richiede energia durante una frazione di un ciclo di tensione.
Visualizza altro...I miei appunti
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
Tutti questi numeri sono stime, fuori dallo schermo o dalle schede tecniche. Alcuni cambieranno, di seguito.
Ecco il JSL che ho usato per digitalizzare alcuni punti. Inizialmente gli array di dati non erano compilati; queste sono le mie risposte. Questo è un codice monouso; Ho preso una scorciatoia e ho dato al primo e all'ultimo punto significati speciali, più sotto.
Visualizza altro...
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>Quella rotazione di un grado fa sì che l'immagine xy si allinei con lo schermo.
Scope traces as image in a JMP graph. The tiny black square boxes on the traces are the handles.L'ambito viene tracciato come immagine in un grafico JMP. Le minuscole caselle quadrate nere sulle tracce sono le maniglie.
Dopo aver trascinato i punti in posizione, con il primo e l'ultimo punto di tensione che definiscono un ciclo completo e il primo e l'ultimo punto di corrente che definiscono la lunghezza dell'impulso, ho usato questo.
Visualizza altro...
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 );
ottenere
somma = 25,8513297218601;
Ci è voluto un po' di ripensamento; invece di utilizzare il rapporto di sterzata scarsamente definito del trasformatore e l'antica calibrazione dell'oscilloscopio, ho presupposto che la tensione di casa mia fosse 125 V rms e ho utilizzato il fattore 1,414 per ottenere la tensione picco-picco che l'onda sinusoidale dovrebbe corrispondere. Sembra abbastanza vicino. Ora per fare in modo che l'ESP32 digitalizzi i punti direttamente...
Collegarsi. L'ESP32 trasmette campioni nel dominio della frequenza FFT a un grafico JMP. 60Hz è di gran lunga la frequenza dominante, seguita dalle prime armoniche dispari.
Le schede della versione 0 sono arrivate poco prima della fine dell'anno e hanno servito al loro scopo. Domani aspetto le schede della versione 1. Ecco la scheda versione 0 che mostra l'onda sinusoidale di tensione su un display 240x320 da 2,8 pollici e una scheda aggiuntiva. Il tappo della bottiglia serve per la bilancia; guarda il piccolo condensatore nel cerchio giallo. Il fornitore del PCB lo monta; Sono abbastanza sicuro di non poterlo fare.
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.Il display è montato sul cartellino rosso, che si collega a un connettore montato sulla fila verticale di fori in basso a sinistra al centro.
Il test della connessione Wi-Fi in attesa delle schede della versione 1 suggerisce che da 40.000 a 50.000 byte al secondo è una velocità dati sostenibile con tutto il resto che questo computer deve fare. Voglio esaminare sia i canali di tensione che quelli di corrente, quindi circa 20KB/sec per ciascuna forma d'onda digitalizzata. Ad un certo punto vorrò utilizzare una FFT sui dati e ho iniziato a pensare alle dimensioni del buffer. Alle FFT piace molto la potenza di 2 dimensioni. Quanto? Ecco qualche codice di prova:
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 )
);
);
La tabella è simile a questa:
2 is great,3 and 5 nice, maybe 7.2 è fantastico, 3 e 5 carini, forse 7.
Fa un bel grafico:
The fast buffer sizes, near the bottom, don't have large factors.Le dimensioni del buffer veloce, vicino al fondo, non hanno fattori grandi.
Cosa c'è in quella strana pila di punti intorno a 9500? Seleziona, sottoinsieme, dai un'occhiata...
Bigger factorsFattori più grandi
Sembra che JMP sarà in grado di creare un dashboard in tempo reale se utilizzo un buffer di esempio 1024 o 2048.
Very fast.Molto veloce.
Anche a 60 volte al secondo, è inferiore all’1%. Potrei eseguire la FFT sull'esp32. Quindi, invece di inviare forme d'onda complete, è possibile inviare semplicemente i primi N contenitori di frequenza e ampiezze. Un sacco di compromessi da considerare.