Improved Wire-AWG

pull/2/head
miguel 2020-11-26 10:02:43 +11:00
rodzic 68aee7d698
commit 33c208fdf2
3 zmienionych plików z 109 dodań i 192 usunięć

Wyświetl plik

@ -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 Imperial]</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_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">
@ -216,7 +216,7 @@
fctx.font = "12px arial";
const cond_dia = 1.0 * conductor_diameter_slider.value;
fctx.textAlign = "right";
fctx.fillText("\u2300a = " + cond_dia.toFixed(3).toString() + "mm", loopx - loop_radius - 2.0*arrow_size, loopy - 6);
fctx.fillText("\u2300a = " + cond_dia.toFixed(2).toString() + "mm", loopx - loop_radius - 2.0*arrow_size, loopy - 6);
// Write loop diameter symbol:
const loop_dia = 1.0 * loop_diameter_slider.value; // Convert from mm to inches
@ -242,7 +242,7 @@
fctx.lineTo(loopx + loop_radius + 3.0*arrow_size, inner_dia_y);
fctx.stroke();
fctx.textAlign = "left";
fctx.fillText("\u2300i = " + (loop_dia-0.5*conductor_diameter_slider.value).toFixed(1).toString() + "mm", loopx + loop_radius + 2.0*arrow_size, inner_dia_y - 2);
fctx.fillText("\u2300i = " + (loop_dia-0.5*conductor_diameter_slider.value).toFixed(2).toString() + "mm", 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;
@ -263,7 +263,7 @@
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_dia+0.5*conductor_diameter_slider.value).toFixed(1).toString() + "mm", loopx + loop_radius + 2.0*arrow_size, outer_dia_y - 2);
fctx.fillText("\u2300o = " + (loop_dia+0.5*conductor_diameter_slider.value).toFixed(2).toString() + "mm", loopx + loop_radius + 2.0*arrow_size, outer_dia_y - 2);
// Write loop inductance:
fctx.font = "12px arial";

Wyświetl plik

@ -16,7 +16,7 @@
<div class="slider_container">
<div class="sliders">
<label for="conductor_diameter_slider">&#8960a:</label>
<input type="range" id="conductor_diameter_slider" min="0.005" max="0.204" value="0.032" step="0.001">
<input type="range" id="conductor_diameter_slider" min="0" max="40" value="20" step="1">
</div>
<div class="sliders">
<label for="loop_diameter_slider">&#8960b:</label>
@ -41,9 +41,9 @@
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>&#8960;a : Conductor diameter in decimal inches (inches). Estimated equivalent AWG wire size is also displayed where appropriate.</li>
<li>&#8960;a : Conductor diameter slider changes AWG from 0-40. Actual diameter displayed in decimal inches.</li>
<li>&#8960;b : Loop diameter in decimal inches (inches).</li>
<li>c/a : 'c' is the inter-winding spacing, and 'a' is the conductor diameter, so 'c/a' is the spacing ratio. (Must be >= 1.1)
<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>
@ -76,14 +76,67 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/7.5.1/math.min.js"></script>
<script src="inductor.js"></script>
<script>
function awgToMm(awg) {
//
switch (awg) {
case 40: return 0.0799;
case 39: return 0.0897;
case 38: return 0.101;
case 37: return 0.113;
case 36: return 0.127;
case 35: return 0.143;
case 34: return 0.160;
case 33: return 0.180;
case 32: return 0.202;
case 31: return 0.227;
case 30: return 0.255;
case 29: return 0.286;
case 28: return 0.321;
case 27: return 0.361;
case 26: return 0.405;
case 25: return 0.455;
case 24: return 0.511;
case 23: return 0.573;
case 22: return 0.644;
case 21: return 0.723;
case 20: return 0.812;
case 19: return 0.912;
case 18: return 1.024;
case 17: return 1.150;
case 16: return 1.291;
case 15: return 1.450;
case 14: return 1.628;
case 13: return 1.828;
case 12: return 2.053;
case 11: return 2.305;
case 10: return 2.588;
case 9: return 2.906;
case 8: return 3.264;
case 7: return 3.665;
case 6: return 4.115;
case 5: return 4.621;
case 4: return 5.189;
case 3: return 5.827;
case 2: return 6.544;
case 1: return 7.348;
case 0: return 8.251;
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,
f : 0.0,
Xl : 0.0,
Xc : 0.0,
Z : 0.0,
@ -95,22 +148,21 @@
// Solve all the parameters, and re-draw the canvas:
function recalculate() {
// Input variables:
const loop_diameter_meters = 0.001 * loop_diameter_slider.value * 25.4; // Inches to mm then to m
const cond_diameter_meters = 0.001 * conductor_diameter_slider.value * 25.4; // Inches to mm then to m
const spacing_ratio = 1.0 * loop_spacing_slider.value;
const loop_turns = 1.0 * loop_turns_slider.value;
const frequency_hz = 1e6 * frequency_slider.value;
inductor.loop_diameter_meters = 0.001 * loop_diameter_slider.value * 25.4; // Inches to mm then to m
inductor.cond_diameter_meters = 0.001 * awgToMm(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(loop_diameter_meters, cond_diameter_meters, spacing_ratio, loop_turns);
inductor.C = multiloopCapacitance(loop_diameter_meters, cond_diameter_meters, spacing_ratio, loop_turns);
inductor.Rdc = dcResistance(loop_diameter_meters, cond_diameter_meters, spacing_ratio, loop_turns);
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.f = frequency_hz;
inductor.Xl = inductiveReactance(frequency_hz, inductor.L);
inductor.Xc = capacitiveReactance(frequency_hz, inductor.C);
inductor.skin_depth = skinDepth(frequency_hz);
inductor.Rac = acResistance(loop_diameter_meters, cond_diameter_meters, spacing_ratio, loop_turns, frequency_hz);
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);
@ -163,14 +215,17 @@
afront_canvas.height = win_height-12;
fctx.clearRect(0, 0, win_width, win_height);
const loop_radius = 0.11 * win_height; // 100; // loop_diameter_slider.value * 80;
var cond_radius = loop_radius * conductor_diameter_slider.value / loop_diameter_slider.value;
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 - Imperial", win_width*0.5, 18);
fctx.fillText("Wire - AWG", win_width*0.5, 18);
// Draw loop ends first, then draw the loop after:
fctx.strokeStyle = "grey";
@ -214,13 +269,11 @@
// Write conductor diameter symbol:
fctx.font = "12px arial";
const cond_dia = 1.0 * conductor_diameter_slider.value;
fctx.textAlign = "right";
fctx.fillText("\u2300a = " + cond_dia.toFixed(3).toString() + "\"", loopx - loop_radius - 2.0*arrow_size, loopy - 6);
fctx.fillText("\u2300a = " + cond_diameter_inches.toFixed(4).toString() + "\"", loopx - loop_radius - 2.0*arrow_size, loopy - 6);
// Write loop diameter symbol:
const loop_dia = 1.0 * loop_diameter_slider.value; // Convert from mm to inches
fctx.fillText("\u2300b = " + loop_dia.toFixed(2).toString() + "\"", loopx - loop_radius - 2.0*arrow_size, y_offset - 2);
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;
@ -242,7 +295,7 @@
fctx.lineTo(loopx + loop_radius + 3.0*arrow_size, inner_dia_y);
fctx.stroke();
fctx.textAlign = "left";
fctx.fillText("\u2300i = " + (loop_dia-0.5*conductor_diameter_slider.value).toPrecision(3).toString() + "\"", loopx + loop_radius + 2.0*arrow_size, inner_dia_y - 2);
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;
@ -263,7 +316,7 @@
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_dia+0.5*conductor_diameter_slider.value).toPrecision(3).toString() + "\"", loopx + loop_radius + 2.0*arrow_size, outer_dia_y - 2);
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";
@ -291,157 +344,21 @@
fctx.lineTo(loopx - loop_radius + cond_radius + 2.0*arrow_size, loopy);
fctx.stroke();
var awg = "";
var swg = "";
switch(cond_dia) {
case 0.004 :
awg = " 38 AWG";
break;
case 0.005 :
awg = " 36 AWG";
swg = "39-40 SWG";
break;
case 0.006 :
swg = " 38 SWG";
break;
case 0.007 :
swg = "~37 SWG";
break;
case 0.008 :
awg = " 32 AWG";
swg = "35-36 SWG";
break;
case 0.009 :
swg = "~34 SWG";
break;
case 0.010 :
awg = " 30 AWG";
swg = " 33 SWG";
break;
case 0.011 :
swg = "~32 SWG";
break;
case 0.012 :
swg = "30-31 SWG";
break;
case 0.013 :
awg = "~28 AWG";
break;
case 0.015 :
swg = "~28 SWG";
break;
case 0.016 :
awg = " 26 AWG";
break;
case 0.018 :
awg = " 25 AWG";
swg = " 26 SWG";
break;
case 0.020 :
awg = " 24 AWG";
swg = " 25 SWG";
break;
case 0.022 :
swg = " 24 SWG";
break;
case 0.024 :
swg = " 23 SWG";
break;
case 0.025 :
awg = "~22 AWG";
break;
case 0.028 :
swg = " 22 SWG";
break;
case 0.032 :
awg = " 20 AWG";
swg = " 21 SWG";
break;
case 0.036 :
swg = " 20 SWG";
break;
case 0.040 :
awg = "~18 AWG";
break;
case 0.048 :
swg = " 18 SWG";
break;
case 0.051 :
awg = "~16 AWG";
break;
case 0.056 :
swg = " 17 SWG";
break;
case 0.064 :
awg = "~14 AWG";
swg = " 16 SWG";
break;
case 0.072 :
swg = " 15 SWG";
break;
case 0.080 :
swg = " 14 SWG";
break;
case 0.081 :
awg = "~12 AWG";
break;
case 0.102 :
awg = " 10 AWG";
break;
case 0.104 :
swg = " 12 SWG";
break;
case 0.114 :
awg = "~ 9 AWG";
break;
case 0.116 :
swg = " 11 SWG";
break;
case 0.128 :
awg = "~ 8 AWG";
swg = " 10 SWG";
break;
case 0.144 :
awg = "~ 7 AWG";
swg = " 9 SWG";
break;
case 0.160 :
swg = " 8 SWG";
break;
case 0.162 :
awg = " 6 AWG";
break;
case 0.182 :
awg = " 5 AWG";
break;
case 0.192 :
swg = " 6 SWG";
break;
case 0.204 :
awg = "~ 4 AWG";
break;
case 0.232 :
swg = " 4 SWG";
break;
}
fctx.textAlign = "center";
fctx.font = "14px courier";
fctx.fillText(awg, loopx, loopy - 6);
fctx.fillText(swg, loopx, loopy + 12);
fctx.fillText(conductor_diameter_slider.value.toString() + " AWG", loopx, loopy - 6);
fctx.font = "12px arial";
var cond_spacing = 2.0 * cond_radius * loop_spacing_slider.value;
if((cond_spacing * loop_turns_slider.value) > (0.8 * win_width)) {
cond_radius = ((0.8 * win_width) / (loop_turns_slider.value * 2.0*loop_spacing_slider.value));
cond_spacing = 2.0 * cond_radius * loop_spacing_slider.value;
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 - loop_turns_slider.value * cond_spacing * 0.5;
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 * (loop_diameter_slider.value / conductor_diameter_slider.value);
for (let i = 0; i < loop_turns_slider.value; i++) {
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);
@ -462,7 +379,7 @@
// Draw the wire ends:
fctx.fillRect(start_x - cond_radius, bot_y, 2.0 * cond_radius, 30);
fctx.fillStyle = "grey";
fctx.fillRect(start_x + loop_turns_slider.value*cond_spacing - cond_radius, bot_y, 2.0 * cond_radius, 30);
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:
@ -490,13 +407,13 @@
// Draw right length arrow:
fctx.beginPath();
fctx.moveTo(start_x + loop_turns_slider.value*cond_spacing + 20, dim_y);
fctx.lineTo(start_x + loop_turns_slider.value*cond_spacing, dim_y);
fctx.lineTo(start_x + loop_turns_slider.value*cond_spacing + 7, dim_y + 7)
fctx.lineTo(start_x + loop_turns_slider.value*cond_spacing + 7, dim_y - 7)
fctx.lineTo(start_x + loop_turns_slider.value*cond_spacing, dim_y);
fctx.moveTo(start_x + loop_turns_slider.value*cond_spacing, dim_y - 7);
fctx.lineTo(start_x + loop_turns_slider.value*cond_spacing, dim_y + 7);
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:
@ -506,14 +423,14 @@
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 + loop_turns_slider.value*cond_spacing, bot_y + 35);
fctx.lineTo(start_x + loop_turns_slider.value*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 = 1.0 * frequency_slider.value;
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);
@ -522,17 +439,17 @@
fctx.fillText("Q = " + inductor.Q.toFixed(1), win_width-18, 88);
fctx.textAlign = "center";
fctx.fillText("N = " + loop_turns_slider.value.toString(), win_width/2, win_height * 0.52);
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 = ((loop_turns_slider.value*cond_spacing - cond_spacing) < 60) ? (60 - (loop_turns_slider.value*cond_spacing - cond_spacing)) : 0;
const spc = loop_spacing_slider.value * conductor_diameter_slider.value;
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 = loop_turns_slider.value*spc;
fctx.fillText("\u2113 = " + sol_len.toFixed(3).toString() + "\"", start_x + loop_turns_slider.value*cond_spacing + 20, dim_y + 20);
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>

Wyświetl plik

@ -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 Imperial]</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_imp.html">[Wire AWG]</a> <a href="inductor.html">[Wire 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">