El proyecto de reloj terminó hace un año. Este es el comienzo de un nuevo proyecto, que podría convertirse en una especie de monitor de energía.
Aquí hay una imagen de dos formas de onda en un osciloscopio de la vieja escuela de ~1990.
Sine wave is volts, pulse is ampsLa onda sinusoidal es voltios, el pulso es amperios.
Si las unidades y escalas son correctas, la integración de voltios * amperios es la potencia real que utiliza la carga. Lo hice, mirándolo fijamente y obtuve 47 vatios. Fue un poco decepcionante porque este es el dispositivo bajo prueba.
30W CFL bulbbombilla CFL de 30W
Si se tratara de una bombilla incandescente, los voltios y los amperios serían formas de onda muy similares, perfectamente alineadas. Pero la mayoría de los dispositivos electrónicos actuales exigen energía durante una fracción de un ciclo de voltaje.
Ver más...Mis notas
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
Todos esos números son estimaciones, fuera de la pantalla o de las hojas de datos. Algunos cambiarán, a continuación.
Aquí está el JSL que utilicé para digitalizar algunos puntos. Las matrices de datos no se completaron inicialmente; esas son mis respuestas. Este es un código de un solo uso; Tomé un atajo e hice que el primer y último punto tuvieran significados especiales, más abajo.
Ver más...
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>Esa rotación de un grado hace que la imagen xy se alinee con la pantalla.
Scope traces as image in a JMP graph. The tiny black square boxes on the traces are the handles.Trazas de alcance como imagen en un gráfico JMP. Los pequeños cuadros cuadrados negros en los rieles son las manijas.
Después de arrastrar los puntos a su lugar, con el primer y último punto de voltaje definiendo un ciclo completo y el primer y último punto de corriente definiendo la duración del pulso, utilicé esto.
Ver más...
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 );
Llegar
suma = 25,8513297218601;
Fue necesario repensarlo un poco; en lugar de usar la relación de vueltas mal definida del transformador y la antigua calibración del osciloscopio, supuse que el voltaje de mi casa es de 125 V rms y usé el factor 1.414 para obtener el voltaje pico a pico que la onda sinusoidal debería coincidir. Eso parece bastante cercano. Ahora para hacer que el ESP32 digitalice los puntos directamente...
Conectando. El ESP32 transmite muestras del dominio de frecuencia FFT a un gráfico JMP. 60 Hz es, con diferencia, la frecuencia dominante, seguida de los primeros armónicos impares.
Las placas de la versión 0 llegaron poco antes de fin de año y han cumplido su propósito. Espero las placas de la versión 1 mañana. Aquí está la placa de la versión 0 que muestra la onda sinusoidal de voltaje en una pantalla de 240x320 de 2,8 pulgadas y una placa adicional. La tapa de la botella es para escala; Mire el pequeño condensador en el círculo amarillo. El proveedor de PCB lo monta; Estoy bastante seguro de que no puedo.
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.La pantalla está montada en la tarjeta roja, que se conecta a un conector montado en la fila vertical de orificios en la parte inferior central izquierda.
Probar la conexión wifi mientras se esperan las placas de la versión 1 sugiere que entre 40.000 y 50.000 bytes por segundo es una velocidad de datos sostenible con todo lo demás que esta computadora necesita hacer. Quiero observar los canales de voltaje y corriente, por lo que aproximadamente 20 KB/s para cada forma de onda digitalizada. En algún momento querré usar una FFT en los datos y comencé a pensar en los tamaños de búfer. A las FFT les gusta mucho el poder de 2 tamaños. ¿Cuánto cuesta? Aquí hay un código de prueba:
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 tabla se ve así:
2 is great,3 and 5 nice, maybe 7.2 es genial, 3 y 5 son buenos, tal vez 7.
Hace un bonito gráfico:
The fast buffer sizes, near the bottom, don't have large factors.Los tamaños de búfer rápidos, cerca del final, no tienen factores grandes.
¿Qué hay en esa extraña pila de puntos alrededor de 9500? Selecciona, subconjunto, echa un vistazo...
Bigger factorsFactores más importantes
Parece que JMP podrá crear un panel en tiempo real si uso un búfer de muestra de 1024 o 2048.
Very fast.Muy rapido.
Incluso a 60 veces por segundo, está por debajo del 1%. Puedo ejecutar FFT en esp32. Luego, en lugar de enviar formas de onda completas, tal vez simplemente envíe los N rangos de frecuencia y amplitudes superiores. Un montón de compensaciones a considerar.