kopia lustrzana https://github.com/miguelvaca/vk3cpu
Created AWG and SWG versions
rodzic
33c208fdf2
commit
d6e2f37633
|
@ -7,7 +7,7 @@
|
|||
<link rel="stylesheet" href="inductor.css">
|
||||
</head>
|
||||
<body>
|
||||
<header>Miguel <a href="mailto:vk3cpu@gmail.com">VK3CPU</a> - RF Inductor Calculator<br><a href="inductor_imp.html">[Wire AWG]</a> <a href="inductor_lrg.html">[Coax Metric]</a></header>
|
||||
<header>Miguel <a href="mailto:vk3cpu@gmail.com">VK3CPU</a> - RF Inductor Calculator<br><a href="inductor_imp.html">[Wire AWG]</a> <a href="inductor_swg.html">[Wire SWG]</a> <a href="inductor_lrg.html">[Coax Metric]</a></header>
|
||||
<section class="gridLayoutClass">
|
||||
<div id="inductor-container" class="inductor-container" style="position: relative;">
|
||||
<canvas id="inductor2D" class="inductorClass" width="350" height="350">
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<link rel="stylesheet" href="inductor.css">
|
||||
</head>
|
||||
<body>
|
||||
<header>Miguel <a href="mailto:vk3cpu@gmail.com">VK3CPU</a> - RF Inductor Calculator<br><a href="inductor.html">[Wire Metric]</a> <a href="inductor_lrg.html">[Coax Metric]</a></header>
|
||||
<header>Miguel <a href="mailto:vk3cpu@gmail.com">VK3CPU</a> - RF Inductor Calculator<br><a href="inductor.html">[Wire Metric]</a> <a href="inductor_swg.html">[Wire SWG]</a> <a href="inductor_lrg.html">[Coax Metric]</a></header>
|
||||
<section class="gridLayoutClass">
|
||||
<div id="inductor-container" class="inductor-container" style="position: relative;">
|
||||
<canvas id="inductor2D" class="inductorClass" width="350" height="350">
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<link rel="stylesheet" href="inductor.css">
|
||||
</head>
|
||||
<body>
|
||||
<header>Miguel <a href="mailto:vk3cpu@gmail.com">VK3CPU</a> - RF Inductor Calculator<br><a href="inductor_imp.html">[Wire AWG]</a> <a href="inductor.html">[Wire Metric]</a></header>
|
||||
<header>Miguel <a href="mailto:vk3cpu@gmail.com">VK3CPU</a> - RF Inductor Calculator<br><a href="inductor.html">[Wire Metric]</a> <a href="inductor_imp.html">[Wire AWG]</a> <a href="inductor_swg.html">[Wire SWG]</a></header>
|
||||
<section class="gridLayoutClass">
|
||||
<div id="inductor-container" class="inductor-container" style="position: relative;">
|
||||
<canvas id="inductor2D" class="inductorClass" width="350" height="350">
|
||||
|
|
|
@ -0,0 +1,467 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>VK3CPU RF Inductor Calculator</title>
|
||||
<link rel="stylesheet" href="inductor.css">
|
||||
</head>
|
||||
<body>
|
||||
<header>Miguel <a href="mailto:vk3cpu@gmail.com">VK3CPU</a> - RF Inductor Calculator<br><a href="inductor.html">[Wire Metric]</a> <a href="inductor_imp.html">[Wire AWG]</a> <a href="inductor_lrg.html">[Coax Metric]</a></header>
|
||||
<section class="gridLayoutClass">
|
||||
<div id="inductor-container" class="inductor-container" style="position: relative;">
|
||||
<canvas id="inductor2D" class="inductorClass" width="350" height="350">
|
||||
</canvas>
|
||||
</div>
|
||||
<div class="slider_container">
|
||||
<div class="sliders">
|
||||
<label for="conductor_diameter_slider">⌀a:</label>
|
||||
<input type="range" id="conductor_diameter_slider" min="0" max="50" value="20" step="1">
|
||||
</div>
|
||||
<div class="sliders">
|
||||
<label for="loop_diameter_slider">⌀b:</label>
|
||||
<input type="range" id="loop_diameter_slider" min="0.25" max="2.0" value="1.00" step="0.01">
|
||||
</div>
|
||||
<div class="sliders">
|
||||
<label for="loop_spacing_slider">c/a:</label>
|
||||
<input type="range" id="loop_spacing_slider" min="1.1" max="4.0" value="2.0" step="0.01">
|
||||
</div>
|
||||
<div class="sliders">
|
||||
<label for="loop_turns_slider">N:</label>
|
||||
<input type="range" id="loop_turns_slider" min="2" max="100" value="8.0" step="1.0">
|
||||
</div>
|
||||
<div class="sliders">
|
||||
<label for="frequency_slider">f:</label>
|
||||
<input type="range" id="frequency_slider" min="1.0" max="30.0" value="7.0" step="0.1">
|
||||
</div>
|
||||
</div>
|
||||
<div id="notes" class="notes">
|
||||
<br>
|
||||
<b><u>Notes:</u></b><br>
|
||||
RF Inductor Calculator was developed to help users predict the RF characteristics of a single-layer solenoid-style air-core inductor. <br><br>
|
||||
<u>Inputs via the slider widgets:</u>
|
||||
<ul>
|
||||
<li>⌀a : Conductor diameter slider changes SWG from 0-50. Actual diameter displayed in decimal inches.</li>
|
||||
<li>⌀b : Loop diameter in decimal inches (inches).</li>
|
||||
<li>c/a : 'c' is the winding-to-winding distance, measured from the conductor mid-points. The 'a' is the conductor diameter, so 'c/a' is the spacing ratio. (c/a >= 1.1)
|
||||
A low-value will increase the resistance due to the proximity effect.</li>
|
||||
<li>N : Number of turns or windings.</li>
|
||||
<li>f : The frequency of interest (MHz) for some of the calculations.</li>
|
||||
</ul>
|
||||
<p>Characteristics on the left are independent of frequency, while the characteristics on the right are dependent on the selected frequency. <br><br>
|
||||
Each of the graphic representations attempt to keep the relative geometry correct, without exceeding the drawing boundary. The coil diameter
|
||||
relative to the conductor diameter are representative. </p>
|
||||
<u>Calculated dimensions:</u>
|
||||
<ul>
|
||||
<li>⌀o : Outer loop diameter (inches) </li>
|
||||
<li>⌀i : Inner loop diameter (inches) - corresponds to the diameter of the winding former.</li>
|
||||
<li>c : Distance between windings, measured from the conductor centers (inches).</li>
|
||||
<li>ℓ : Length of the coil (inches). Equal to c x N.</li>
|
||||
</ul>
|
||||
<u>Calculated parameters:</u>
|
||||
<ul>
|
||||
<li>L : Inductance is calculated using Nagaoka's equation incorporating his coefficient.</li>
|
||||
<li>C : Capacitance is calculated using Knight's 2016 paper on self-resonance and self-capacitance of solenoid coils.</li>
|
||||
<li>Rdc : DC resistance is calculated using conductor length divided by the conductor cross-sectional area, assuming a copper conductor.</li>
|
||||
<li>SRF : Self-resonant frequency (MHz) for the unloaded coil. Currently using a lumped reactances model. (Looking into modifying the model to
|
||||
use the conductor length and velocity factor as described by Knight (2016).</li>
|
||||
<li>Xₗ : Inductive reactance at the given frequency. (Ω)</li>
|
||||
<li>|Z| : Impedance at the given frequency. (Ω)</li>
|
||||
<li>δ : Skin depth due to skin effect (μm)</li>
|
||||
<li>Rac : AC resistance is calculated using the skin effect and proximity resistance from empirical data collected by Medhurst using the spacing ratio, and length-to-diameter ratio.</li>
|
||||
<li>Q : Quality factor of device, based on reactance (X) ÷ resistance (Rac) at the given frequency.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/7.5.1/math.min.js"></script>
|
||||
<script src="inductor.js"></script>
|
||||
<script>
|
||||
function swgToMm(swg) {
|
||||
//
|
||||
switch (swg) {
|
||||
case 50: return 0.0254;
|
||||
case 49: return 0.0305;
|
||||
case 48: return 0.0406;
|
||||
case 47: return 0.0508;
|
||||
case 46: return 0.0610;
|
||||
case 45: return 0.0711;
|
||||
case 44: return 0.0813;
|
||||
case 43: return 0.0914;
|
||||
case 42: return 0.1016;
|
||||
case 41: return 0.1118;
|
||||
case 40: return 0.1219;
|
||||
case 39: return 0.1321;
|
||||
case 38: return 0.1524;
|
||||
case 37: return 0.1727;
|
||||
case 36: return 0.1930;
|
||||
case 35: return 0.2134;
|
||||
case 34: return 0.2337;
|
||||
case 33: return 0.2540;
|
||||
case 32: return 0.2743;
|
||||
case 31: return 0.2946;
|
||||
case 30: return 0.3150;
|
||||
case 29: return 0.3454;
|
||||
case 28: return 0.3759;
|
||||
case 27: return 0.4166;
|
||||
case 26: return 0.4572;
|
||||
case 25: return 0.508;
|
||||
case 24: return 0.559;
|
||||
case 23: return 0.610;
|
||||
case 22: return 0.711;
|
||||
case 21: return 0.813;
|
||||
case 20: return 0.914;
|
||||
case 19: return 1.016;
|
||||
case 18: return 1.219;
|
||||
case 17: return 1.422;
|
||||
case 16: return 1.626;
|
||||
case 15: return 1.829;
|
||||
case 14: return 2.032;
|
||||
case 13: return 2.337;
|
||||
case 12: return 2.642;
|
||||
case 11: return 2.946;
|
||||
case 10: return 3.251;
|
||||
case 9: return 3.658;
|
||||
case 8: return 4.064;
|
||||
case 7: return 4.470;
|
||||
case 6: return 4.877;
|
||||
case 5: return 5.385;
|
||||
case 4: return 5.893;
|
||||
case 3: return 6.401;
|
||||
case 2: return 7.010;
|
||||
case 1: return 7.620;
|
||||
case 0: return 8.230;
|
||||
default: return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
// Define global storage for calculated values, so we don't recalculate the same things multiple times:
|
||||
var inductor = {
|
||||
loop_diameter_meters : 0.0,
|
||||
cond_diameter_meters : 0.0,
|
||||
spacing_ratio : 0.0,
|
||||
loop_turns : 0.0,
|
||||
frequency_hz : 0.0,
|
||||
|
||||
L : 0.0,
|
||||
C : 0.0,
|
||||
Rdc : 0.0,
|
||||
SRF : 0.0,
|
||||
|
||||
Xl : 0.0,
|
||||
Xc : 0.0,
|
||||
Z : 0.0,
|
||||
skin_depth : 0.0,
|
||||
Rac : 0.0,
|
||||
Q : 0.0
|
||||
};
|
||||
|
||||
// Solve all the parameters, and re-draw the canvas:
|
||||
function recalculate() {
|
||||
// Input variables:
|
||||
inductor.loop_diameter_meters = 0.001 * loop_diameter_slider.value * 25.4; // Inches to mm then to m
|
||||
inductor.cond_diameter_meters = 0.001 * swgToMm(1.0 * conductor_diameter_slider.value);
|
||||
inductor.spacing_ratio = 1.0 * loop_spacing_slider.value;
|
||||
inductor.loop_turns = 1.0 * loop_turns_slider.value;
|
||||
inductor.frequency_hz = 1e6 * frequency_slider.value;
|
||||
// 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)).toPolar();
|
||||
// Redraw the canvas:
|
||||
drawDesign();
|
||||
}
|
||||
|
||||
loop_diameter_slider.oninput = function() {
|
||||
recalculate();
|
||||
}
|
||||
|
||||
conductor_diameter_slider.oninput = function() {
|
||||
recalculate();
|
||||
}
|
||||
|
||||
loop_turns_slider.oninput = function() {
|
||||
recalculate();
|
||||
}
|
||||
|
||||
loop_spacing_slider.oninput = function() {
|
||||
recalculate();
|
||||
}
|
||||
|
||||
frequency_slider.oninput = function() {
|
||||
recalculate();
|
||||
}
|
||||
|
||||
window.onresize = function() {
|
||||
recalculate();
|
||||
}
|
||||
|
||||
window.onorientationchange = function() {
|
||||
recalculate();
|
||||
}
|
||||
|
||||
window.onbeforeprint = function() {
|
||||
console.log("onbeforeprint");
|
||||
drawDesign();
|
||||
}
|
||||
|
||||
const afront_canvas = document.getElementById("inductor2D");
|
||||
const fctx = afront_canvas.getContext('2d');
|
||||
|
||||
function drawDesign() {
|
||||
const win_width = document.getElementById("inductor-container").clientWidth;
|
||||
const win_height = document.getElementById("inductor-container").clientHeight;
|
||||
afront_canvas.width = win_width-12;
|
||||
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_inches = inductor.loop_diameter_meters * 1000.0 / 25.4;
|
||||
const cond_diameter_inches = inductor.cond_diameter_meters * 1000.0 / 25.4;
|
||||
|
||||
fctx.font = "bold 14px arial";
|
||||
fctx.textAlign = "center";
|
||||
fctx.fillText("Wire - SWG", win_width*0.5, 18);
|
||||
|
||||
// Draw loop ends first, then draw the loop after:
|
||||
fctx.strokeStyle = "grey";
|
||||
fctx.beginPath();
|
||||
fctx.arc(loopx - 0.5*loop_radius, loopy + 1.414*loop_radius, 0.5 * loop_radius, 0.0, -0.40 * Math.PI, true);
|
||||
fctx.lineWidth = cond_radius * 2.0;
|
||||
fctx.stroke();
|
||||
fctx.strokeStyle = "black";
|
||||
|
||||
fctx.beginPath();
|
||||
fctx.arc(loopx + 0.5*loop_radius, loopy + 1.414*loop_radius, 0.5 * loop_radius, Math.PI, -0.60 * Math.PI, false);
|
||||
fctx.lineWidth = cond_radius * 2.0;
|
||||
fctx.stroke();
|
||||
|
||||
// Draw loop:
|
||||
fctx.beginPath();
|
||||
fctx.arc(loopx, loopy, loop_radius, 0.0, 2.0 * Math.PI, false);
|
||||
fctx.stroke();
|
||||
fctx.lineWidth = 1.0;
|
||||
|
||||
// Draw loop diameter arrow:
|
||||
const y_offset = loopy + loop_radius + 20;
|
||||
var arrow_size = 10.0;
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(loopx - loop_radius, loopy);
|
||||
fctx.lineTo(loopx - loop_radius, y_offset);
|
||||
fctx.lineTo(loopx - loop_radius - arrow_size, y_offset - arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius - arrow_size, y_offset + arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius, y_offset);
|
||||
fctx.lineTo(loopx - loop_radius - 3.0*arrow_size, y_offset);
|
||||
fctx.stroke();
|
||||
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(loopx + loop_radius, loopy);
|
||||
fctx.lineTo(loopx + loop_radius, y_offset);
|
||||
fctx.lineTo(loopx + loop_radius + arrow_size, y_offset - arrow_size);
|
||||
fctx.lineTo(loopx + loop_radius + arrow_size, y_offset + arrow_size);
|
||||
fctx.lineTo(loopx + loop_radius, y_offset);
|
||||
fctx.lineTo(loopx + loop_radius + 3.0*arrow_size, y_offset);
|
||||
fctx.stroke();
|
||||
|
||||
// Write conductor diameter symbol:
|
||||
fctx.font = "12px arial";
|
||||
fctx.textAlign = "right";
|
||||
fctx.fillText("\u2300a = " + cond_diameter_inches.toFixed(4).toString() + "\"", loopx - loop_radius - 2.0*arrow_size, loopy - 6);
|
||||
|
||||
// Write loop diameter symbol:
|
||||
fctx.fillText("\u2300b = " + loop_diameter_inches.toFixed(2).toString() + "\"", loopx - loop_radius - 2.0*arrow_size, y_offset - 2);
|
||||
|
||||
// Draw inner-diameter arrows: (for using a winding former)
|
||||
const inner_dia_y = loopy + loop_radius + 40;
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(loopx - loop_radius + cond_radius, loopy);
|
||||
fctx.lineTo(loopx - loop_radius + cond_radius, inner_dia_y);
|
||||
fctx.lineTo(loopx - loop_radius + cond_radius - arrow_size, inner_dia_y - arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius + cond_radius - arrow_size, inner_dia_y + arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius + cond_radius, inner_dia_y);
|
||||
fctx.lineTo(loopx - loop_radius - 3.0*arrow_size, inner_dia_y);
|
||||
fctx.stroke();
|
||||
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(loopx + loop_radius - cond_radius, loopy);
|
||||
fctx.lineTo(loopx + loop_radius - cond_radius, inner_dia_y);
|
||||
fctx.lineTo(loopx + loop_radius - cond_radius + arrow_size, inner_dia_y - arrow_size);
|
||||
fctx.lineTo(loopx + loop_radius - cond_radius + arrow_size, inner_dia_y + arrow_size);
|
||||
fctx.lineTo(loopx + loop_radius - cond_radius, inner_dia_y);
|
||||
fctx.lineTo(loopx + loop_radius + 3.0*arrow_size, inner_dia_y);
|
||||
fctx.stroke();
|
||||
fctx.textAlign = "left";
|
||||
fctx.fillText("\u2300i = " + (loop_diameter_inches-0.5*cond_diameter_inches).toFixed(3).toString() + "\"", loopx + loop_radius + 2.0*arrow_size, inner_dia_y - 2);
|
||||
|
||||
// Draw outer-diameter arrows: (for using a winding former)
|
||||
const outer_dia_y = loopy + loop_radius + 0;
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(loopx - loop_radius - cond_radius, loopy);
|
||||
fctx.lineTo(loopx - loop_radius - cond_radius, outer_dia_y);
|
||||
fctx.lineTo(loopx - loop_radius - cond_radius - arrow_size, outer_dia_y - arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius - cond_radius - arrow_size, outer_dia_y + arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius - cond_radius, outer_dia_y);
|
||||
fctx.lineTo(loopx - loop_radius - 3.0*arrow_size, outer_dia_y);
|
||||
fctx.stroke();
|
||||
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(loopx + loop_radius + cond_radius, loopy);
|
||||
fctx.lineTo(loopx + loop_radius + cond_radius, outer_dia_y);
|
||||
fctx.lineTo(loopx + loop_radius + cond_radius + arrow_size, outer_dia_y - arrow_size);
|
||||
fctx.lineTo(loopx + loop_radius + cond_radius + arrow_size, outer_dia_y + arrow_size);
|
||||
fctx.lineTo(loopx + loop_radius + cond_radius, outer_dia_y);
|
||||
fctx.lineTo(loopx + loop_radius + 3.0*arrow_size, outer_dia_y);
|
||||
fctx.stroke();
|
||||
fctx.fillText("\u2300o = " + (loop_diameter_inches+0.5*cond_diameter_inches).toFixed(3).toString() + "\"", loopx + loop_radius + 2.0*arrow_size, outer_dia_y - 2);
|
||||
|
||||
// Write loop inductance:
|
||||
fctx.font = "12px arial";
|
||||
fctx.textAlign = "left";
|
||||
const L = inductor.L * 1.0e+6;
|
||||
fctx.fillText("L = " + L.toPrecision(3).toString() + " \u03bcH", 8, 18);
|
||||
fctx.fillText("C = " + (inductor.C * 1e12).toFixed(1) + " pF", 8, 32);
|
||||
fctx.fillText("Rdc = " + inductor.Rdc.toFixed(2) + " \u03A9", 8, 46);
|
||||
fctx.fillText("SRF = " + (inductor.SRF * 1e-6).toFixed(1) + " MHz", 8, 60);
|
||||
|
||||
// Draw conductor diameter arrow:
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(loopx - loop_radius - cond_radius, loopy);
|
||||
fctx.lineTo(loopx - loop_radius - cond_radius - arrow_size, loopy - arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius - cond_radius - arrow_size, loopy + arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius - cond_radius, loopy);
|
||||
fctx.lineTo(loopx - loop_radius - 3.0*arrow_size, loopy);
|
||||
fctx.stroke();
|
||||
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(loopx - loop_radius + cond_radius, loopy);
|
||||
fctx.lineTo(loopx - loop_radius + cond_radius + arrow_size, loopy - arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius + cond_radius + arrow_size, loopy + arrow_size);
|
||||
fctx.lineTo(loopx - loop_radius + cond_radius, loopy);
|
||||
fctx.lineTo(loopx - loop_radius + cond_radius + 2.0*arrow_size, loopy);
|
||||
fctx.stroke();
|
||||
|
||||
fctx.textAlign = "center";
|
||||
fctx.font = "14px courier";
|
||||
fctx.fillText(conductor_diameter_slider.value.toString() + " SWG", loopx, loopy - 6);
|
||||
fctx.font = "12px arial";
|
||||
|
||||
var cond_spacing = 2.0 * cond_radius * inductor.spacing_ratio;
|
||||
if((cond_spacing * inductor.loop_turns) > (0.8 * win_width)) {
|
||||
cond_radius = ((0.8 * win_width) / (inductor.loop_turns * 2.0*inductor.spacing_ratio));
|
||||
cond_spacing = 2.0 * cond_radius * inductor.spacing_ratio;
|
||||
}
|
||||
var start_x = win_width/2.0 - inductor.loop_turns * cond_spacing * 0.5;
|
||||
var top_y = win_height * 0.56;
|
||||
var bot_y = top_y + 2.0 * cond_radius * (inductor.loop_diameter_meters / inductor.cond_diameter_meters);
|
||||
|
||||
for (let i = 0; i < inductor.loop_turns; i++) {
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(start_x + ((0.5 + i) * cond_spacing) + cond_radius, top_y);
|
||||
fctx.lineTo(start_x + (i+1) * cond_spacing + cond_radius, bot_y);
|
||||
fctx.arc(start_x + (i+1) * cond_spacing, bot_y, cond_radius, 0, Math.PI, false);
|
||||
fctx.lineTo(start_x + ((0.5 + i) * cond_spacing) - cond_radius, top_y);
|
||||
fctx.fillStyle = "grey";
|
||||
fctx.fill();
|
||||
|
||||
fctx.beginPath();
|
||||
fctx.arc(start_x + (i * cond_spacing), bot_y, cond_radius, 0, Math.PI);
|
||||
fctx.arc(start_x + (cond_spacing * 0.5) + i * cond_spacing, top_y, cond_radius, Math.PI, 0);
|
||||
fctx.lineTo(start_x + (i * cond_spacing) + cond_radius, bot_y);
|
||||
fctx.closePath();
|
||||
fctx.fillStyle = "black";
|
||||
fctx.fill();
|
||||
}
|
||||
|
||||
// Draw the wire ends:
|
||||
fctx.fillRect(start_x - cond_radius, bot_y, 2.0 * cond_radius, 30);
|
||||
fctx.fillStyle = "grey";
|
||||
fctx.fillRect(start_x + inductor.loop_turns * cond_spacing - cond_radius, bot_y, 2.0 * cond_radius, 30);
|
||||
fctx.fillStyle = "black";
|
||||
|
||||
// Draw left spacing arrow:
|
||||
const dim_y = win_height * 0.90;
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(start_x - 20, dim_y);
|
||||
fctx.lineTo(start_x, dim_y);
|
||||
fctx.lineTo(start_x - 7, dim_y + 7)
|
||||
fctx.lineTo(start_x - 7, dim_y - 7)
|
||||
fctx.lineTo(start_x, dim_y);
|
||||
fctx.moveTo(start_x, dim_y - 7);
|
||||
fctx.lineTo(start_x, dim_y + 7);
|
||||
fctx.stroke();
|
||||
|
||||
// Draw right spacing arrow:
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(start_x + cond_spacing + 20, dim_y);
|
||||
fctx.lineTo(start_x + cond_spacing, dim_y);
|
||||
fctx.lineTo(start_x + cond_spacing + 7, dim_y + 7)
|
||||
fctx.lineTo(start_x + cond_spacing + 7, dim_y - 7)
|
||||
fctx.lineTo(start_x + cond_spacing, dim_y);
|
||||
fctx.moveTo(start_x + cond_spacing, dim_y - 7);
|
||||
fctx.lineTo(start_x + cond_spacing, dim_y + 7);
|
||||
fctx.stroke();
|
||||
|
||||
// Draw right length arrow:
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(start_x + inductor.loop_turns * cond_spacing + 20, dim_y);
|
||||
fctx.lineTo(start_x + inductor.loop_turns * cond_spacing, dim_y);
|
||||
fctx.lineTo(start_x + inductor.loop_turns * cond_spacing + 7, dim_y + 7)
|
||||
fctx.lineTo(start_x + inductor.loop_turns * cond_spacing + 7, dim_y - 7)
|
||||
fctx.lineTo(start_x + inductor.loop_turns * cond_spacing, dim_y);
|
||||
fctx.moveTo(start_x + inductor.loop_turns * cond_spacing, dim_y - 7);
|
||||
fctx.lineTo(start_x + inductor.loop_turns * cond_spacing, dim_y + 7);
|
||||
fctx.stroke();
|
||||
|
||||
// Extended lines:
|
||||
fctx.strokeStyle = "grey";
|
||||
fctx.beginPath();
|
||||
fctx.moveTo(start_x, bot_y + 35);
|
||||
fctx.lineTo(start_x, dim_y - 12);
|
||||
fctx.moveTo(start_x + cond_spacing, bot_y + 15);
|
||||
fctx.lineTo(start_x + cond_spacing, dim_y - 12);
|
||||
fctx.moveTo(start_x + inductor.loop_turns * cond_spacing, bot_y + 35);
|
||||
fctx.lineTo(start_x + inductor.loop_turns * cond_spacing, dim_y - 12);
|
||||
fctx.stroke();
|
||||
fctx.strokeStyle = "black";
|
||||
|
||||
fctx.font = "12px arial";
|
||||
fctx.textAlign = "right";
|
||||
var freq = 1e-6 * inductor.frequency_hz;
|
||||
fctx.fillText("f = " + freq.toFixed(1) + " MHz", win_width-18, 18);
|
||||
fctx.fillText("X\u2097 = " + inductor.Xl.toFixed(1) + " \u03A9", win_width-18, 32);
|
||||
fctx.fillText("|Z| = " + inductor.Z.r.toFixed(1) + " \u03A9", win_width-18, 46);
|
||||
fctx.fillText("\u03B4 = " + (inductor.skin_depth * 1e6).toFixed(1) + " \u03BCm", win_width-18, 60);
|
||||
fctx.fillText("Rac = " + inductor.Rac.toFixed(2) + " \u03A9", win_width-18, 74);
|
||||
fctx.fillText("Q = " + inductor.Q.toFixed(1), win_width-18, 88);
|
||||
|
||||
fctx.textAlign = "center";
|
||||
fctx.fillText("N = " + inductor.loop_turns.toString(), win_width/2, win_height * 0.52);
|
||||
|
||||
// Draw spacing text: (gap is to avoid collision of spacing and length texts)
|
||||
fctx.textAlign = "right";
|
||||
var gap = ((inductor.loop_turns * cond_spacing - cond_spacing) < 60) ? (60 - (inductor.loop_turns * cond_spacing - cond_spacing)) : 0;
|
||||
const spc = inductor.spacing_ratio * cond_diameter_inches;
|
||||
fctx.fillText("c = " + spc.toFixed(3).toString() + "\"", start_x + cond_spacing + 20 - gap, dim_y + 20);
|
||||
|
||||
// Draw length text:
|
||||
const sol_len = inductor.loop_turns * spc;
|
||||
fctx.fillText("\u2113 = " + sol_len.toFixed(3).toString() + "\"", start_x + inductor.loop_turns * cond_spacing + 20, dim_y + 20);
|
||||
}
|
||||
recalculate();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Ładowanie…
Reference in New Issue