diff --git a/short_antenna.html b/short_antenna.html index d385f20..256565f 100644 --- a/short_antenna.html +++ b/short_antenna.html @@ -16,15 +16,15 @@
- +
- - + +
- +
@@ -125,8 +125,8 @@ } // Define global storage for calculated values, so we don't recalculate the same things multiple times: - var inductor = { - loop_diameter_meters : 0.0, + var dipole = { + length_meters : 0.0, cond_diameter_meters : 0.0, spacing_ratio : 0.0, loop_turns : 0.0, @@ -148,27 +148,18 @@ // Solve all the parameters, and re-draw the canvas: function recalculate() { // Input variables: - inductor.loop_diameter_meters = 0.001 * antenna_length_slider.value * 25.4; // Inches to mm then to m - inductor.cond_diameter_meters = 0.001 * awgToMm(40.0 - conductor_diameter_slider.value); - inductor.spacing_ratio = 1.0 * inductor_distance.value; - //inductor.loop_turns = 1.0 * loop_turns_slider.value; - inductor.frequency_hz = 1e6 * frequency_slider.value; + //dipole.length_meters = 0.001 * antenna_length_slider.value * 25.4; // Inches to mm then to m + dipole.frequency_hz = 1.8e6 * (2 ** frequency_slider.value); + dipole.length_meters = 299792458.0 * 0.95 * antenna_length_slider.value / (2.0 * dipole.frequency_hz); // + dipole.length_feet = dipole.length_meters * 3.28084; + dipole.cond_diameter_meters = 0.001 * awgToMm(40.0 - conductor_diameter_slider.value); + dipole.cond_diameter_inches = dipole.cond_diameter_meters * 39.37008; + dipole.spacing_ratio = 0.01 * inductor_distance.value; + dipole.distance_meters = inductor_distance.value * 0.005 * dipole.length_meters; + dipole.distance_feet = dipole.distance_meters * 3.28084; + // Frequency independent characteristics: - inductor.L = getInductance(inductor.loop_diameter_meters, inductor.cond_diameter_meters, inductor.spacing_ratio, inductor.loop_turns); - inductor.C = multiloopCapacitance(inductor.loop_diameter_meters, inductor.cond_diameter_meters, inductor.spacing_ratio, inductor.loop_turns); - inductor.Rdc = dcResistance(inductor.loop_diameter_meters, inductor.cond_diameter_meters, inductor.spacing_ratio, inductor.loop_turns); - inductor.SRF = selfResonantFrequency(inductor.L, inductor.C); - // Frequency dependent characteristics: - inductor.Xl = inductiveReactance(inductor.frequency_hz, inductor.L); - inductor.Xc = capacitiveReactance(inductor.frequency_hz, inductor.C); - inductor.skin_depth = skinDepth(inductor.frequency_hz); - inductor.Rac = acResistance(inductor.loop_diameter_meters, inductor.cond_diameter_meters, inductor.spacing_ratio, inductor.loop_turns, inductor.frequency_hz); - //inductor.Q = qualityFactor(inductor.Xl, inductor.Rac); - // Calculate impedance: - var Zl = math.complex(inductor.Rac, inductor.Xl); - var Zc = math.complex(0, inductor.Xc); - inductor.Z = math.divide(math.multiply(Zl, Zc), math.add(Zl, Zc)); - inductor.Q = Math.abs(inductor.Z.im) / inductor.Z.re; + dipole.L = 0.0; // Redraw the canvas: //drawDesign(); } @@ -290,7 +281,7 @@ // A = total antenna length in feet // B = distance from antenna center to loading coil in feet // D = diameter of the radiator in inches - console.log(f, A, B, D); + //console.log(f, A, B, D); const t1 = Math.log((24*((234/f) - B))/D) - 1; const t2 = (1 - (f*B)/234)**2 - 1; const t3 = Math.log((24*(A/2 -B))/D) - 1; @@ -336,14 +327,10 @@ afront_canvas.height = win_height-12; fctx.clearRect(0, 0, win_width, win_height); - const loop_radius = 0.11 * win_height; - var cond_radius = loop_radius * (inductor.cond_diameter_meters / inductor.loop_diameter_meters); const loopx = win_width/2; const loopy = win_height/4; - const loop_diameter_mm = inductor.loop_diameter_meters * 1000.0; - const cond_diameter_mm = inductor.cond_diameter_meters * 1000.0; - const loop_diameter_inches = loop_diameter_mm / 25.4; + const cond_diameter_mm = dipole.cond_diameter_meters * 1000.0; const cond_diameter_inches = cond_diameter_mm / 25.4; fctx.font = "bold 14px arial"; @@ -359,17 +346,13 @@ const down_wire_top_y = win_height * 0.5 + 5; const down_wire_bot_y = win_height * 0.9; - // Draw loop diameter arrow: - const y_offset = loopy + loop_radius + 20; var arrow_size = 10.0; - const inductorDistanceInMeters = inductor_distance.value * 0.005 * antenna_length_slider.value; - const Xl = getInductanceFromDimensions(inductor.frequency_hz * 1e-6, - antenna_length_slider.value * 3.3, - inductorDistanceInMeters * 3.3, - inductor.cond_diameter_meters * 39.37// - ); - console.log(Xl); + const Xl = getInductanceFromDimensions(dipole.frequency_hz * 1e-6, + dipole.length_feet, + dipole.distance_feet, + dipole.cond_diameter_inches); + //console.log(Xl); // Draw the top antenna element: fctx.beginPath(); @@ -379,22 +362,30 @@ fctx.stroke(); fctx.textAlign = "right"; - drawInductor(fctx, wire_x, up_wire_bot_y - inductor.spacing_ratio * 0.01 * (up_wire_bot_y - up_wire_top_y), 0.0*Math.PI); - drawArrow(fctx, wire_x - 30, up_wire_bot_y - inductor.spacing_ratio * 0.01 * (up_wire_bot_y - up_wire_top_y), 0.5*Math.PI); - fctx.fillText(inductorDistanceInMeters.toFixed(2).toString() + " m", wire_x - 60, up_wire_bot_y - inductor.spacing_ratio * 0.01 * (up_wire_bot_y - up_wire_top_y) ); + drawInductor(fctx, wire_x, up_wire_bot_y - dipole.spacing_ratio * (up_wire_bot_y - up_wire_top_y), 0.0*Math.PI); + drawArrow(fctx, wire_x - 30, up_wire_bot_y - dipole.spacing_ratio * (up_wire_bot_y - up_wire_top_y), 0.5*Math.PI); + fctx.fillText(dipole.distance_meters.toFixed(2).toString() + " m", wire_x - 60, up_wire_bot_y - dipole.spacing_ratio * (up_wire_bot_y - up_wire_top_y) + 18 ); + fctx.fillText(dipole.distance_feet.toFixed(2).toString() + " ft", wire_x - 60, up_wire_bot_y - dipole.spacing_ratio * (up_wire_bot_y - up_wire_top_y) ); drawArrow(fctx, wire_x - 30, up_wire_bot_y, 0.5*Math.PI); - fctx.fillText("0.00 m", wire_x - 60, up_wire_bot_y ); + fctx.fillText("0.00 ft", wire_x - 60, up_wire_bot_y ); + fctx.fillText("0.00 m", wire_x - 60, up_wire_bot_y + 18); drawArrow(fctx, wire_x - 30, up_wire_top_y, 0.5*Math.PI); - fctx.fillText((antenna_length_slider.value * 0.5).toFixed(2).toString() + " m", wire_x - 60, up_wire_top_y ); + fctx.fillText((dipole.length_feet * 0.5).toFixed(2).toString() + " ft", wire_x - 60, up_wire_top_y ); + fctx.fillText((dipole.length_meters * 0.5).toFixed(2).toString() + " m", wire_x - 60, up_wire_top_y + 18); fctx.textAlign = "left"; - fctx.fillText("l = " + (antenna_length_slider.value * 1.0).toFixed(1).toString() + " m", wire_x + 40, up_wire_top_y ); - fctx.fillText("f = " + (frequency_slider.value * 1.0).toFixed(1).toString() + " MHz", wire_x + 40, up_wire_top_y + 18 ); + fctx.fillText(dipole.length_feet.toFixed(2).toString() + " ft", wire_x + 60, up_wire_top_y ); + fctx.fillText(dipole.length_meters.toFixed(2).toString() + " m", wire_x + 60, up_wire_top_y + 18); + fctx.fillText("0.00 ft", wire_x + 60, down_wire_bot_y ); + fctx.fillText("0.00 m", wire_x + 60, down_wire_bot_y + 18); //drawArrow(fctx, wire_x + 10, up_wire_bot_y, -0.5*Math.PI); - const L = Xl / (2 * Math.PI * inductor.frequency_hz * 0.000001); - fctx.fillText("L = " + L.toFixed(1).toString() + " \u00B5H", wire_x + 20, up_wire_bot_y - inductor.spacing_ratio * 0.01 * (up_wire_bot_y - up_wire_top_y)); - fctx.fillText("Xl = " + Xl.toFixed(1).toString() + " \u03A9", wire_x + 20, up_wire_bot_y - inductor.spacing_ratio * 0.01 * (up_wire_bot_y - up_wire_top_y) + 18); + const L = Xl / (2 * Math.PI * dipole.frequency_hz * 0.000001); + fctx.fillText("L = " + L.toFixed(1).toString() + " \u00B5H", wire_x + 20, up_wire_bot_y - dipole.spacing_ratio * (up_wire_bot_y - up_wire_top_y)); + fctx.fillText("Xl = " + Xl.toFixed(1).toString() + " \u03A9", wire_x + 20, up_wire_bot_y - dipole.spacing_ratio * (up_wire_bot_y - up_wire_top_y) + 18); + fctx.textAlign = "center"; + fctx.fillText("f = " + (dipole.frequency_hz * 1e-6).toFixed(2).toString() + " MHz", wire_x, down_wire_bot_y + 30); + // Draw the bottom antenna element: fctx.beginPath(); fctx.moveTo(wire_x - 15, down_wire_top_y); @@ -402,9 +393,10 @@ fctx.lineTo(wire_x, down_wire_bot_y); fctx.stroke(); - drawInductor(fctx, wire_x, down_wire_top_y + inductor.spacing_ratio * 0.01 * (up_wire_bot_y - up_wire_top_y), 0.0*Math.PI); + drawInductor(fctx, wire_x, down_wire_top_y + dipole.spacing_ratio * (up_wire_bot_y - up_wire_top_y), 0.0*Math.PI); //drawArrow(fctx, wire_x + 10, down_wire_top_y, -0.5*Math.PI); - //drawArrow(fctx, wire_x + 10, down_wire_bot_y, -0.5*Math.PI); + drawArrow(fctx, wire_x + 30, down_wire_bot_y, -0.5*Math.PI); + drawArrow(fctx, wire_x + 30, up_wire_top_y, -0.5*Math.PI); } recalculate();