AnasSarkiz/usb-c-pd-brushed-motor
USB-C PD-powered motor controller with protected input, selectable 5/9/12 V buck supply, MCU qualification, PWM H-bridge drive, overvoltage sensing, regenerative energy-dump resistors, and safety interlocks.
- Version
- 0.0.1-a48-cloud-pipeline9-unrouted-c41d79a-305b1e7a
- License
- unset
- Stars
- 0
scripts/discharge-review.ts
import { writeFile } from "node:fs/promises"
const capacitanceUpperF = 650e-6
// 1% initial, 0.8% TCR and 3% endurance variation are covered by a 6% reserve.
const resistanceMinimumOhms = 940
const resistanceMaximumOhms = 1060
const localAmbientMaximumC = 105
const ratedPowerAt70CW = 0.5
const deratedPowerW =
(ratedPowerAt70CW * (155 - localAmbientMaximumC)) / (155 - 70)
const cases = [5.25, 9.45, 12.6, 13.745 * 1.05, 15].map((initialVoltageV) => ({
initialVoltageV,
dischargeTo1VSeconds:
resistanceMaximumOhms * capacitanceUpperF * Math.log(initialVoltageV),
maximumInitialPowerW: initialVoltageV ** 2 / resistanceMinimumOhms,
storedEnergyJ: 0.5 * capacitanceUpperF * initialVoltageV ** 2,
}))
const report = {
revision: "A11",
assumptions: {
capacitanceUpperF,
resistanceMinimumOhms,
resistanceMaximumOhms,
localAmbientMaximumC,
programmedTimeoutSeconds: 3,
limitation:
"Source and bridge inhibited, no external regenerative energy; actual temperature and decay must be measured",
},
capacitorBasis:
"330uF *1.2 initial *1.2 temperature + three 47uF *1.2 plus bypass reserve <650uF; not a measured bank value",
oldPassiveTailSeconds:
((125100 * 110000) / (125100 + 110000)) * capacitanceUpperF * Math.log(2.5),
deratedPowerW,
cases,
issues: cases.flatMap((review) => [
...(review.dischargeTo1VSeconds >= 3 ? ["Timeout too short"] : []),
...(review.maximumInitialPowerW > deratedPowerW
? ["Declared local-ambient power exceeds derated resistor rating"]
: []),
]),
}
await writeFile(
"evidence/discharge-review-A11.json",
JSON.stringify(report, null, 2) + "\n",
)
console.log(JSON.stringify(report, null, 2))
if (report.issues.length) process.exitCode = 1