diff --git a/.DS_Store b/.DS_Store index a0ce064..33c5788 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/antenna.html b/antenna.html index 81babc8..c633c4f 100644 --- a/antenna.html +++ b/antenna.html @@ -76,12 +76,18 @@ var ground_plane = 0; var height_above_ground = 0; - class Antennas { + // Recalculate all variables. Triggered whenever the system parameter inputs are changed: + function recalculate() { + // Read all inputs and store values in wavelengths: + + // Create segments of all the wires with appropriate lengths: + + // Create 3D representation and reload the scene: + } + + class AntennaTypes { // constructor() { - this.wires = []; - this.Z = []; - this.Y = []; this.frequency = 3e8; this.antenna_types = { @@ -181,15 +187,6 @@ //console.log(this.current_type); } - // Recalculate all variables: - recalculate() { - // Read all inputs and store values in wavelengths: - - // Create segments of all the wires with appropriate lengths: - - // Create 3D representation and reload the scene: - } - solve() { // Fill the impedance Z matrix: // Invert Z to produce admittance Y matrix: @@ -204,6 +201,97 @@ this.current_type = antenna_type; } + // Return the wire elements for solving: + getWires() { + this.wires = []; + // + var ws = this.antenna_types['antennas'][this.current_type]['wires']; + var vs = this.antenna_types['antennas'][this.current_type]['vertex']; + + ws.forEach(w => { + // + var ww = {}; + // ww.length = ; + // ww.seg_len = ; + ww.radius = 0.0001; + ww.points = []; + for (let index = 0; index < (w.length-1); index++) { + const wire_length = Math.sqrt( + (vs[w[index]][0] - vs[w[index+1]][0])**2 + + (vs[w[index]][1] - vs[w[index+1]][1])**2 + + (vs[w[index]][2] - vs[w[index+1]][2])**2 + ); + // Minimum of 10 segments per half-wavelength => 0.05 + const max_segment_length = 0.05; + const segments = Math.round(wire_length / max_segment_length); + ww.seg_len = wire_length / segments; + for (let ii = 0; ii < segments; ii++) { + var frac = 1.0 * ii / segments; + var x = vs[w[index]][0] * (1.0 - frac) + frac * vs[w[index+1]][0]; + var y = vs[w[index]][1] * (1.0 - frac) + frac * vs[w[index+1]][1]; + var z = vs[w[index]][2] * (1.0 - frac) + frac * vs[w[index+1]][2]; + ww.points.push([x,y,z]); + + frac = 1.0 * (ii + 0.5) / segments; + x = vs[w[index]][0] * (1.0 - frac) + frac * vs[w[index+1]][0]; + y = vs[w[index]][1] * (1.0 - frac) + frac * vs[w[index+1]][1]; + z = vs[w[index]][2] * (1.0 - frac) + frac * vs[w[index+1]][2]; + ww.points.push([x,y,z]); + } + } + // Add the final point: + x = vs[w[w.length-1]][0]; + y = vs[w[w.length-1]][1]; + z = vs[w[w.length-1]][2]; + ww.points.push([x,y,z]); + //retval.push(ww); + this.wires.push(ww); + }); + return this.wires; + } + + // + getThreeObject3D = function () { + const material = new THREE.LineBasicMaterial({ color: 0xffff00, linewidth: 1 }); + const antenna_view = new THREE.Group(); + // + const ww = this.antenna_types['antennas'][this.current_type]['wires']; + const vv = this.antenna_types['antennas'][this.current_type]['vertex']; + ww.forEach(wire => { + //console.log(wire); + var vertices = new Float32Array(wire.length * 3); + var vidx = 0; + const scale_factor = 200.0; // Roughly pixels per wavelength + // Copy the vertex locations across into a Float32Array for the geometry: + wire.forEach((vertex) => { + //console.log(vertex, vv[vertex]); + vertices[vidx++] = (vv[vertex][0] * scale_factor); + vertices[vidx++] = (vv[vertex][1] * scale_factor); + vertices[vidx++] = (vv[vertex][2] * scale_factor); + }); + // + const geometry = new THREE.BufferGeometry(); + geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3)); + // create a new wire with + const wire_line = new THREE.Line(geometry, material); + antenna_view.add(wire_line); + }); + // Add the antenna into the scene: + return antenna_view; + }; + } + + class WireAntennaModel { + // constructor: + constructor(ws, vs) { + // Object variables: + this.wires = []; + this.Z = []; + this.Y = []; + + } + + // psi(seg_n, seg_m, point_n, point_m) { var retval = 0.0; const k = 2.0 * Math.PI; // Normalised wavelength is equal to 1.0 - otherwise 2*pi/wavelength @@ -340,53 +428,16 @@ return 1.0; } - // Return the wire elements for solving: - getWires() { - this.wires = []; - // - var ws = this.antenna_types['antennas'][this.current_type]['wires']; - var vs = this.antenna_types['antennas'][this.current_type]['vertex']; - - ws.forEach(w => { - // - var ww = {}; - // ww.length = ; - // ww.seg_len = ; - ww.radius = 0.0001; - ww.points = []; - for (let index = 0; index < (w.length-1); index++) { - const wire_length = Math.sqrt( - (vs[w[index]][0] - vs[w[index+1]][0])**2 + - (vs[w[index]][1] - vs[w[index+1]][1])**2 + - (vs[w[index]][2] - vs[w[index+1]][2])**2 - ); - // Minimum of 10 segments per half-wavelength => 0.05 - const max_segment_length = 0.05; - const segments = Math.round(wire_length / max_segment_length); - ww.seg_len = wire_length / segments; - for (let ii = 0; ii < segments; ii++) { - var frac = 1.0 * ii / segments; - var x = vs[w[index]][0] * (1.0 - frac) + frac * vs[w[index+1]][0]; - var y = vs[w[index]][1] * (1.0 - frac) + frac * vs[w[index+1]][1]; - var z = vs[w[index]][2] * (1.0 - frac) + frac * vs[w[index+1]][2]; - ww.points.push([x,y,z]); + } - frac = 1.0 * (ii + 0.5) / segments; - x = vs[w[index]][0] * (1.0 - frac) + frac * vs[w[index+1]][0]; - y = vs[w[index]][1] * (1.0 - frac) + frac * vs[w[index+1]][1]; - z = vs[w[index]][2] * (1.0 - frac) + frac * vs[w[index+1]][2]; - ww.points.push([x,y,z]); - } - } - // Add the final point: - x = vs[w[w.length-1]][0]; - y = vs[w[w.length-1]][1]; - z = vs[w[w.length-1]][2]; - ww.points.push([x,y,z]); - //retval.push(ww); - this.wires.push(ww); - }); - return this.wires; + class WireAntennaView { + // constructor: + constructor() { + // + } + + loadAntenna(wire_segments) { + // } // @@ -656,12 +707,11 @@ const gui = new dat.GUI(); // Add a mode selector. View is to change perspective. Edit allows moving vertices. Solve runs the EM solver. (Maybe should be edit+solve?) + /* gui.add(parameters, 'mode', ['view', 'edit', 'solve']) .setValue('view') .onChange(function(value){ console.log(value); }); - - // Create the Antennas object, which holds all the antenna types and creates the visual model on-request - ant = new Antennas(); + */ // Ground-plane const geometry = new THREE.CircleGeometry( 150, 32 ); @@ -695,6 +745,9 @@ pattern.setVisibility(value); }); + // Create the AntennaTypes object, which holds all the antenna types and creates the visual model on-request + ant = new AntennaTypes(); + gui.add( parameters, 'w', ant.antenna_types['order']) .setValue(ant.current_type) .name('Types') diff --git a/mom.html b/mom.html index d2cdc40..fc1669b 100644 --- a/mom.html +++ b/mom.html @@ -283,11 +283,21 @@ return retval; } + function calculateImpedance() { + var retval = []; + var x_axis = 0.0; + for(var i=0; i -
Miguel VK3CPU - RF Toroid Calculator v1.2
+
Miguel VK3CPU - RF Toroid Calculator v1.3
@@ -61,7 +61,7 @@ RF Toroid Calculator was developed to help users predict the RF characteristics of a ferrite or powdered-iron toroid wound as an inductor or suppressor. It uses the manufacturer's (Fair-Rite & Micrometals) published data including the toroid's dimensions and complex permeability characteristics to predict the component's characteristics.
- The calculator has 4 separate display areas. At the top is the chart display for showing frequency-dependent characteristics. Next is the + The calculator has 3 separate display areas. At the top is the chart display for showing frequency-dependent characteristics. Next is the schematic display, where a scaled image of the toroid and windings is presented to help with intuitive design. Next is the control panel section, where the user can select the application type, toroid material, toroid size, wire size, number of windings and excitation voltage.

Inputs via the select widgets: @@ -155,6 +155,8 @@
Change history:
+ [4-Sep-23] - v1.3
+ * Added 5943001601 which I have called the "FT122-43"
[2-May-23] - v1.2
* Added 2646102002 which I have called the "FT102B-61"
[1-May-23] - v1.1
@@ -504,6 +506,8 @@ 'FT140x2' : { PN:'5943002701', A:35.55, B:23.00, C:25.4, W:66.0, CC:5.60, le:8.90, Ae:1.58, Ve:14.00, Al:1770.0 }, 'FT140' : { PN:'5943002701', A:35.55, B:23.00, C:12.7, W:33.0, CC:11.20, le:8.90, Ae:0.79, Ve:7.00, Al:885.0 }, 'FT125' : { PN:'5943001701', A:31.75, B:19.05, C:9.50, W:23.0, CC:12.90, le:7.60, Ae:0.59, Ve:4.50, Al:775.0 }, + 'FT122x2' : { PN:'5943001601', A:31.10, B:19.05, C:15.80, W:36.0, CC:8.10, le:7.60, Ae:0.94, Ve:7.06, Al:1240.0 }, + 'FT122' : { PN:'5943001601', A:31.10, B:19.05, C:7.90, W:18.0, CC:16.20, le:7.60, Ae:0.47, Ve:3.53, Al:620.0 }, 'FT114x2' : { PN:'5943001001', A:29.00, B:19.00, C:15.0, W:26.0, CC:9.90, le:7.30, Ae:0.74, Ve:5.40, Al:1020.0 }, 'FT114' : { PN:'5943001001', A:29.00, B:19.00, C:7.50, W:13.0, CC:19.80, le:7.30, Ae:0.37, Ve:2.70, Al:510.0 }, 'FT102B' : { PN:'2643102002', A:25.90, B:12.80, C:28.60, W:55.0, CC:3.11, le:5.60, Ae:1.80, Ve:10.07, Al:3296.0 },