Le projet d'horloge terminé il y a un an. C'est le début d'un nouveau projet, qui pourrait se transformer en une sorte de moniteur de puissance.
Voici une image de deux formes d'onde sur un oscilloscope à l'ancienne datant d'environ 1990.
Sine wave is volts, pulse is ampsL'onde sinusoïdale est en volts, l'impulsion est en ampères
Si les unités et les échelles sont correctes, l'intégration des volts * ampères correspond à la puissance réelle utilisée par la charge. Je l'ai fait en le regardant et j'ai obtenu 47 watts. C'était un peu décevant car c'est l'appareil testé.
30W CFL bulbAmpoule CFL 30W
S'il s'agissait d'une ampoule à incandescence, les volts et les ampères seraient des formes d'onde très similaires, parfaitement alignées. Mais la plupart des appareils électroniques d'aujourd'hui nécessitent de l'énergie pendant une fraction d'un cycle de tension.
Voir plus...Mes notes
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
Tous ces chiffres sont des estimations, hors écran ou hors feuilles de données. Certains changeront, ci-dessous.
Voici le JSL que j'ai utilisé pour numériser certains points. Les tableaux de données n'étaient pas remplis initialement ; ce sont mes réponses. Il s'agit d'un code à usage unique ; J'ai pris un raccourci et j'ai donné au premier et au dernier point une signification particulière, plus loin.
Voir plus...
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>Cette rotation d'un degré permet d'aligner l'image xy avec l'écran.
Scope traces as image in a JMP graph. The tiny black square boxes on the traces are the handles.Traces de portée sous forme d'image dans un graphique JMP. Les petites cases carrées noires sur les traces sont les poignées.
Après avoir mis les points en place, le premier et le dernier points de tension définissant un cycle complet et les premier et dernier points de courant définissant la durée de l'impulsion, j'ai utilisé ceci.
Voir plus...
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 );
obtenir
somme = 25,8513297218601 ;
Il a fallu y réfléchir un peu ; plutôt que d'utiliser le rapport de transformation mal défini du transformateur et l'ancien étalonnage de l'oscilloscope, j'ai supposé que la tension de ma maison était de 125 V rms et j'ai utilisé le facteur 1,414 pour obtenir la tension crête à crête à laquelle l'onde sinusoïdale devrait correspondre. Cela semble assez proche. Maintenant, faisons en sorte que l'ESP32 numérise directement les points...
Se brancher. L'ESP32 diffuse des échantillons du domaine fréquentiel FFT vers un graphique JMP. 60 Hz est de loin la fréquence dominante, suivie des premières harmoniques impaires.
Les cartes version 0 sont arrivées juste avant la fin de l'année et ont rempli leur fonction. J'attends les cartes version 1 demain. Voici la carte version 0 affichant l'onde sinusoïdale de tension sur un écran 240x320 de 2,8 pouces et une carte supplémentaire. Le bouchon de la bouteille est destiné au tartre ; regardez le petit condensateur dans le cercle jaune. Le fournisseur de circuits imprimés le monte ; Je suis presque sûr que je ne peux pas.
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.L'écran est monté sur la carte rouge, qui se branche sur un connecteur monté sur la rangée verticale de trous en bas à gauche au centre.
Tester la connexion wifi en attendant les cartes version 1 suggère que 40 000 à 50 000 octets par seconde est un débit de données durable avec tout ce que cet ordinateur doit faire. Je veux regarder à la fois les canaux de tension et de courant, donc environ 20 Ko/sec pour chaque forme d'onde numérisée. À un moment donné, je souhaiterai utiliser une FFT sur les données et j'ai commencé à réfléchir à la taille des tampons. Les FFT aiment vraiment la puissance de 2 tailles. Combien? Voici un code de test :
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 )
);
);
Le tableau ressemble à ceci :
2 is great,3 and 5 nice, maybe 7.2 est super, 3 et 5 sympa, peut-être 7.
Cela fait un joli graphique :
The fast buffer sizes, near the bottom, don't have large factors.Les tailles de tampon rapides, situées en bas, n'ont pas de facteurs importants.
Qu’y a-t-il dans cette étrange pile de points autour de 9 500 ? Sélectionnez, sous-ensemble, jetez un oeil...
Bigger factorsFacteurs plus importants
On dirait que JMP sera capable de créer un tableau de bord en temps réel si j'utilise un tampon d'échantillon 1024 ou 2048.
Very fast.Très vite.
Même à 60 fois par seconde, elle est inférieure à 1 %. Je peux exécuter la FFT sur l'esp32. Ensuite, au lieu d'envoyer des formes d'onde complètes, envoyez peut-être simplement les N premiers groupes de fréquences et d'amplitudes. Un tas de compromis à considérer.