Skip to content

Instantly share code, notes, and snippets.

@CCColda
Created August 23, 2021 12:18
Show Gist options
  • Save CCColda/e87e75b26451dacf50cb2cc7507891b0 to your computer and use it in GitHub Desktop.
Save CCColda/e87e75b26451dacf50cb2cc7507891b0 to your computer and use it in GitHub Desktop.
Voltage divider calculator
/**
* @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