UNPKG

@typecad/rd_isl9120ir

Version:

rd_ISL9120IR typeCAD package

264 lines (220 loc) 11.4 kB
import * as _0603 from '@typecad/passives/0603'; import { Power, PCB, Component, TrackBuilder } from '@typecad/typecad'; import { ISL9120IRTNZ } from './ISL9120IRTNZ'; // Configuration options for the ISL9120IR power regulator module interface PowerRegulatorOptions { pcb: PCB; reference?: string; passives?: typeof _0603; inputPower?: Power; // Optional external input power } /** * ### rd_isl9120ir - ISL9120IR 3.3V Power Regulator Module * * #### Input Connections * vin: Power - 1.8V to 5.5V power supply input * * #### Output Connections * vout: Power - 3.3V regulated output * */ export class rd_isl9120ir { // PCB and component management pcb: PCB; #passives: typeof _0603; // Main components regulator: ISL9120IRTNZ; // U1: Main voltage regulator IC inputCap: _0603.Capacitor; // C1: Input power capacitor (22uF) outputCap: _0603.Capacitor; // C2: Output power capacitor (10uF) inductor: _0603.Inductor; // L1: Switching inductor (1µH) // Power connections vin: Power; // Input power (1.8V-5.5V) vout: Power; // Output power (3.3V regulated) inputPower?: Power; // External input power source // PCB elements via1: Component; // V1: PCB via for routing via2: Component; // V2: PCB via for routing components: (Component | TrackBuilder)[] = []; // All PCB elements including components and tracks constructor(options: PowerRegulatorOptions) { // Extract configuration options this.pcb = options.pcb; this.#passives = options.passives || _0603; this.inputPower = options.inputPower; // Create the main voltage regulator IC this.createRegulatorIC(options.reference); // Create power connections this.setupPowerConnections(); // Create passive components (capacitors and inductor) this.createPassiveComponents(); // Create PCB vias for routing this.createPCBVias(); // Add all main components to the components list this.components.push(this.regulator, this.inputCap, this.outputCap, this.inductor, this.via1, this.via2); // Connect all the electrical nets this.connectNets(); // Route the PCB tracks (adds tracks to components array) this.routeTracks(); // Group everything together on the PCB this.pcb.group('rd_isl9120', ...this.components); } private createRegulatorIC(reference?: string) { // Create the ISL9120IR voltage regulator IC this.regulator = new ISL9120IRTNZ(reference); this.regulator.pcb = { x: 150.6, y: 97.725, rotation: 0 }; } private setupPowerConnections() { // Create input power connection (1.8V to 5.5V) this.vin = new Power({ power: this.regulator.VIN_1, gnd: this.regulator.GND }); // Validate external input power if provided if (this.inputPower) { this.validateInputVoltage(this.inputPower.voltage); } // Create output power connection (3.3V regulated) this.vout = new Power({ power: this.regulator.VOUT, gnd: this.regulator.GND, voltage: 3.3 }); } private validateInputVoltage(voltage?: number) { if (voltage === undefined) { console.warn('ISL9120IR: Input voltage not specified. Ensure it is between 1.8V and 5.5V.'); return; } const MIN_VOLTAGE = 1.8; const MAX_VOLTAGE = 5.5; if (voltage < MIN_VOLTAGE || voltage > MAX_VOLTAGE) { throw new Error( `ISL9120IR input voltage must be between ${MIN_VOLTAGE}V and ${MAX_VOLTAGE}V. ` + `Provided voltage: ${voltage}V is outside the safe operating range.` ); } // Additional warnings for edge cases if (voltage < 2.0) { console.warn(`ISL9120IR: Input voltage ${voltage}V is close to minimum. Consider using at least 2.0V for reliable operation.`); } if (voltage > 5.0) { console.warn(`ISL9120IR: Input voltage ${voltage}V is high. Ensure proper thermal management.`); } } private createPassiveComponents() { // Input power capacitor (22µF) - smooths input power this.inputCap = new this.#passives.Capacitor({ value: '22 uF', description: 'Input power capacitor', pcb: { x: 153.67, y: 99.047, rotation: -90 } }); // Output power capacitor (10µF) - smooths output power this.outputCap = new this.#passives.Capacitor({ value: '10 uF', description: 'Output power capacitor', pcb: { x: 153.67, y: 95.986, rotation: -90 } }); // Switching inductor (1µH) - essential for DC-DC conversion this.inductor = new this.#passives.Inductor({ value: '1 µH', description: 'Switching inductor', footprint: 'lib:1285ASH1R0MP2', mpn: '1285AS-H-1R0M=P2', datasheet: 'https://www.mouser.com/datasheet/2/281/1/J_E_TE243A_0011-2303275.pdf', pcb: { x: 147.32, y: 97.828, rotation: 90 } }); } private createPCBVias() { // PCB vias for routing power connections between layers this.via1 = this.pcb.via({ at: { x: 151.765, y: 100.33 }, size: 0.6, drill: 0.3 }); this.via2 = this.pcb.via({ at: { x: 152.4, y: 96.52 }, size: 0.6, drill: 0.3 }); } private connectNets() { // Connect external input power if provided if (this.inputPower) { this.pcb.net(this.inputPower.power!, this.vin.power!); this.pcb.net(this.inputPower.gnd!, this.vin.gnd!); } // Connect input power circuit this.connectInputPower(); // Connect switching inductor // this.connectInductor(); // Connect output power circuit // this.connectOutputPower(); // Connect ground connections // this.connectGrounds(); } private connectInputPower() { // console.log(this.inputCap.pin(2)); // Connect all input power pins together with input capacitor and vias this.pcb.net( this.regulator.VIN_1, // Primary input pin this.regulator.VIN_2, // Secondary input pin this.inputCap.pin(2), // Input capacitor positive // this.regulator.EN, // Enable pin (tied to input) // this.via1.pin(1), // Via for routing // this.via2.pin(1), // Via for routing // this.vin.power! // External input power ); } private connectGrounds() { // Connect all ground pins together this.pcb.net( this.regulator.GND, // Main ground this.regulator.PGND, // Power ground this.regulator.EP, // Exposed pad this.regulator.BYPS, // Bypass pin this.inputCap.pin(1), // Input capacitor negative this.outputCap.pin(2), // Output capacitor negative this.vin.gnd! // External ground ); } private connectInductor() { // Connect switching pins to inductor // LX1 pins connect to one side of the inductor this.pcb.net(this.regulator.LX1_1, this.regulator.LX1_2, this.inductor.pin(1)); // LX2 pins connect to the other side of the inductor this.pcb.net(this.regulator.LX2_1, this.regulator.LX2_2, this.inductor.pin(2)); } private connectOutputPower() { // Connect output power with feedback to ensure regulation this.pcb.net( this.outputCap.pin(1), // Output capacitor positive this.regulator.FB, // Feedback pin this.regulator.VOUT // Output pin ); } private routeTracks() { // PCB routing - these define the copper traces between components // Each track connects specific points on the PCB with defined layer and width // All tracks are added to the components array // Input power routing this.components.push(this.pcb.track().from({ x: 152.05, y: 96.87 }).to({ x: 152.4, y: 96.52, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 151.1, y: 99.665 }).to({ x: 151.765, y: 100.33, layer: "F.Cu", width: 0.2 }).to({ x: 152.273, y: 99.822, layer: "F.Cu", width: 0.2 }).to({ x: 153.67, y: 99.822, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 150.6, y: 99.175 }).to({ x: 151.1, y: 99.175, layer: "F.Cu", width: 0.2 }).to({ x: 151.1, y: 99.665, layer: "F.Cu", width: 0.2 })); // Ground routing this.components.push(this.pcb.track().from({ x: 152.05, y: 97.225 }).to({ x: 152.05, y: 96.87, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 152.4, y: 99.695 }, "B.Cu", 0.2).to({ x: 151.765, y: 100.33, layer: "B.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 152.4, y: 96.52 }, "B.Cu", 0.2).to({ x: 152.4, y: 99.695, layer: "B.Cu", width: 0.2 })); // Switching node routing this.components.push(this.pcb.track().from({ x: 152.05, y: 97.725 }).to({ x: 152.05, y: 98.225, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 149.15, y: 97.725 }).to({ x: 152.05, y: 97.725, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 152.05, y: 98.225 }).to({ x: 153.623, y: 98.225, layer: "F.Cu", width: 0.2 })); // Inductor connections this.components.push(this.pcb.track().from({ x: 149.15, y: 98.225 }).to({ x: 147.723, y: 98.225, layer: "F.Cu", width: 0.2 }).to({ x: 147.32, y: 98.628, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 149.15, y: 98.225 }).to({ x: 150.1, y: 99.175, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 147.517, y: 97.225 }).to({ x: 147.32, y: 97.028, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 149.15, y: 97.225 }).to({ x: 147.517, y: 97.225, layer: "F.Cu", width: 0.2 })); // Output power routing this.components.push(this.pcb.track().from({ x: 153.67, y: 98.272 }).to({ x: 153.67, y: 96.761, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 150.1, y: 96.275 }).to({ x: 149.15, y: 97.225, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 150.6, y: 96.275 }).to({ x: 151.1, y: 96.275, layer: "F.Cu", width: 0.2 }).to({ x: 152.164, y: 95.211, layer: "F.Cu", width: 0.2 }).to({ x: 153.67, y: 95.211, layer: "F.Cu", width: 0.2 })); } }