Created
August 23, 2021 12:18
-
-
Save CCColda/e87e75b26451dacf50cb2cc7507891b0 to your computer and use it in GitHub Desktop.
Voltage divider calculator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @typedef {{ | |
* vin: number, | |
* vout: number | |
* } & ({r1: number} | {r2: number})} TVoltageDividerParams | |
* | |
* @typedef {{ | |
* vin: number, | |
* vout: number, | |
* r: Set<number> | number[] | |
* }} TVoltageDividerAvailableParams | |
* | |
* @typedef {{ | |
* r1: number, r2: number, delta: number | |
* }} TVoltageDividerAvailableResult | |
*/ | |
/** | |
* Returns r2 or r1 given the other 3 parameters | |
* @param {TVoltageDividerParams} param0 | |
* @returns {number | NaN} | |
*/ | |
function voltage_divider({ vin, vout, r1, r2 }) { | |
if (typeof r1 == "number") { | |
return (vout * r1) / (vin - vout); | |
} | |
else if (typeof r2 == "number") { | |
return ((vin * r2) / vout) - r2; | |
} | |
else { | |
return NaN; | |
} | |
} | |
/** | |
* Selects the best combination given the available resistances | |
* @param {TVoltageDividerAvailableParams} param0 | |
* @returns {TVoltageDividerAvailableResult} | |
*/ | |
function voltage_divider_available({ vin, vout, r }) { | |
const resistance_set = new Set(r); | |
/** @type {TVoltageDividerAvailableResult} */ | |
let closest = { r1: 0, r2: 0, delta: Infinity }; | |
// r^2 | |
for (const resistance of resistance_set) { | |
const r2_desired = voltage_divider({ r1: resistance, vin, vout }); | |
for (const r2_candidate of resistance_set) { | |
const delta = Math.abs(r2_candidate - r2_desired); | |
if (delta < closest.delta) | |
closest = { r1: resistance, r2: r2_candidate, delta }; | |
} | |
} | |
return closest; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment