zudo-led-lamp
GitHub repository

Type to search...

to open search from anywhere

Decisions — Chosen vs Rejected

Every architecture slot recorded as a decision — what was picked, what was rejected, and the reason, traced back to the power and research pages.

One row per slot. "Rejected" here means considered and not chosen, not bad — most of the rejected options are perfectly good parts that lost on one specific axis.

Board topology

ChosenTwo boards: Board P (USB-PD front end) + Board L (driver, control, LED array)
RejectedThree boards, with the LED array on an aluminum MCPCB daughterboard
RejectedOne combined board

Board P must be separate — it is a reusable switched-15 V sink module and its bring-up sequence requires testing it completely alone before anything is attached.

The MCPCB daughterboard was rejected on the thermal budget's own numbers: that page puts the plain-FR-4 ceiling at roughly 1 W per LED site and reserves metal core for the concentrated-COB case (3.6 W in one 13.4 mm package). This design runs 0.19 W per site. A third board would buy nothing thermally and would cost a second interconnect carrying the driver's ~440 kHz switching node down a wire harness.

The split boundary is still designed in — the array is a self-contained block on four nets (LED_P, LED_N, NTC_SENSE, GND) — so the enclosure phase can lift it onto a daughterboard later without touching anything else.

LED

ChosenHL-AM-2835H421W-S1-08-HR3 (C210315), 3000 K, 24 pieces, 8 parallel strings of 3 series, 62.5 mA per string
RejectedCXA1304 COB (C510489 / C510492 / C510494)
RejectedSMD5730 family (C2843887, C210353, C210346)
RejectedCool-white 2835 (C2843876, C210329)

CCT decided it. This is a fire/candle lamp; 3000 K warm white is the aesthetic requirement, and it is the only place a warm bin coincides with real JLCPCB stock (399,813 units). Every 5730 candidate is 4000 K or cooler, which reads as daylight, not flame.

The COB was rejected twice over: all three CXA1304 SKUs show zero stock, and at 3.6 W in one package it would force the MCPCB the board split just rejected. The stock-available fallback (C22398559) has a scanned datasheet with no machine-readable Vf or flux data — not something to design a thermal budget around.

3-series, not 4-series. Headroom analysis called 4s "tight". Against this part's datasheet Vf ceiling of 3.2 V, a 4s string is 12.8 V, putting the buck at 85% duty — outside the AL8860's recommended 25–75% band. 3s plus ballast lands at 74%.

Current sharing between parallel strings

ChosenPer-string ballast resistors, 33 Ω 1206 (C2907384)
RejectedOne CC driver per string
RejectedVf-binned procurement, no ballast

led-candidates lists exactly these three. One driver per string means eight AL8860s and eight complete passive sets on a board whose entire output is 5.5 W — absurd. Vf-binned procurement is a supply guarantee the JLCPCB catalog cannot make.

Ballast costs 1.03 W (19% of delivered power) and that is the honest price of the choice. What it buys: even at the datasheet's full 2.6–3.2 V Vf spread, the hottest string reaches 0.27 W against a 0.288 W package rating — it passes, by construction, with no reliance on procurement luck.

33 Ω specifically is a two-sided optimisation: larger ballast improves sharing but pushes the duty cycle past the driver's recommended band; smaller ballast does the reverse. 33 Ω is the largest value that keeps duty at or under 75% at nominal Vf.

LED driver IC

ChosenAL8860MP-13 (C500782)
RejectedPT4115 (C347356)
RejectedTPS92511 (C114277)

Driver input rating vs the clamp ceiling

The driver research required each candidate to clear the SMAJ20A's ~32.4 V worst-case clamp or justify not doing so, and the ratings matrix is where that number comes from.

CandidateVIN operatingVIN absolute maxvs 32.4 V
PT41156–30 Vnot confirmable from a primary datasheet in the research passFails — 2.4 V below the clamp, with no absolute-max figure to fall back on
AL88604.5–40 V42 V (DS39014 Rev 5)Clears — +7.6 V operating, +9.6 V absolute
TPS925114.5–65 VClears with the widest margin

PT4115 is rejected on the clamp ceiling, not accepted with a justification. The research page offered "accept the residual risk" as an option; this pass declines it, because unlike Board P's two inherited gaps — where no better part existed — a fully clearing alternative costs the same money. Manufacturing a new residual risk when a free alternative exists is not a trade worth making.

TPS92511 clears the ceiling by more, but was rejected on two counts: its 500 mA maximum sits exactly at this design's operating current with zero headroom, and the research pass could not confirm its IADJ formula or its full passive count from a primary datasheet, so it is not schematic-ready. The AL8860 is characterised end to end.

The AL8860 also brought the decisive control-side property nobody was looking for: a CTRL pin with a guaranteed 5–100% analog dimming range, which is what made flicker-free dimming possible (see below).

Driver passive set

SlotChosenReasoning
Sense resistor RS1200 mΩ 2512 (C459674)I = 0.1/Rs → exactly 500 mA. 50 mW on a 2 W part
Inductor L133 µH (C177245)~440 kHz switching, 1.69 µs on-time (above the 500 ns minimum), 2.5 A saturation against 0.6 A peak
Catch diode D11SS26 60 V (C7420363)Rejected SS24 (40 V) — it leaves zero margin against the AL8860's own 40 V input ceiling for a negligible price difference, exactly as the driver research argued
Input caps10 µF 1206 + 100 nF 0603Datasheet asks 10 µF or higher X7R; see the X5R deviation note

Logic rail

ChosenAP63203WU-7 (C780769) — 3.3 V fixed synchronous buck
RejectedHT7333-1 LDO (C5451671)
RejectedAMS1117-3.3 LDO (C6186)
RejectedXL7015E1 buck (C73013)

This is the one place where this pass overrides a research recommendation. The logic-rail page says an LDO is fine below ~30 mA, and the actual budget is ~25 mA, so on dissipation grounds the LDO wins.

The clamp ceiling overrules it. AMS1117's 15 V absolute maximum is violated at the nominal rail voltage — that part is unusable here regardless of load. HT7333's 18 V ceiling is fine at nominal but sits 14.4 V under the 32.4 V clamp, which would create a brand-new residual risk in a design that has been careful to only inherit the two it could not avoid.

AP63203's absolute maximum is 35 V DC and 40 V for 400 ms (DS41326 Rev 3). The clamp event is a 10/1000 µs transient, so the 400 ms rating covers it outright. It is the only candidate with zero residual, and it costs about $0.60 and three extra passives.

XL7015E1 clears the ceiling by even more (80 V), but needs a feedback divider and a 150 kHz-class inductor whose researched candidate showed only 238 units in stock. AP63203 is fixed-output, needs no divider, and its inductor is a 250,000-unit part.

MCU

ChosenSTM32G031F8P6 (C529334), TSSOP-20
RejectedCH32V003F4P6 (C5187096)
RejectedPY32F002AF15P6TU (C5292059)
RejectedSTM32C011F4P6TR (C7373263)

The MCU research frames this as cost versus toolchain friction and calls it "a preference call, not a technical blocker". At prototype quantity the cost axis is noise: the whole spread is about $1, against ¥8,930 of Extended-part setup fees. Toolchain friction, by contrast, is paid in hours during bring-up.

So the decision is toolchain-first, and STM32 wins that axis by the research's own assessment ("best-supported path on macOS by a clear margin" — official vendor tools, Homebrew, OpenOCD, and PlatformIO all first-class, no community forks).

CH32V003 is rejected specifically on its proprietary single-wire SDI debug interface, which only WCH-LinkE programmers speak. A one-vendor-probe dependency is a real cost on a board that will be debugged interactively.

G031 over C011 for 64 KB flash versus 16 KB: it keeps the recorded-flame LUT modulation approach reachable without a board respin, for about $0.40. Hardware headroom that removes a future respin is cheap at this price.

Knob

ChosenEC11L1525G01 (C2991196) — 15-detent rotary encoder
RejectedWH148-family panel potentiometer
Rejected3296W / 3362P trimmer behind a panel cutout

Straightforward — the knob research found zero stock across every WH148 SKU, and the well-stocked alternatives are screwdriver trimmers, not knobs. The project's JLCPCB-only sourcing constraint is accepted, so the encoder is the only real option.

C2991196 over the other two EC11 SKUs simply on price (1.27 versus 2.26 and $2.76) — none is Basic tier and all sit in the same 4,500–5,500 stock band, so there is nothing else to separate them.

Consequence accepted: no absolute position. The knob's physical angle means nothing after a power cycle. Mitigated by booting dark and ramping to 40%, per control-safety's "pick a sane default on boot".

Control scheme

What the knob controls

ChosenBase brightness
RejectedSpeed
RejectedDepth
RejectedMode-cycled combination via a push-button gesture

Three reasons, in order of weight:

  1. A lamp knob that does not change brightness is a surprise. Every other mapping requires the user to learn the device.

  2. Brightness is the parameter with a safety meaning. Turning it down is also turning down heat, and turning it fully down is off. Speed and depth have no such property, and neither does a mode-cycled knob whose current mode is invisible.

  3. The mode gesture is not reliably available. The knob research flagged that none of the shortlisted EC11 SKUs was confirmed to have an integrated push-button. Building the primary UI on an unverified mechanical feature would be a poor bet. The parts DB reports 7 solder joints for C2991196, which hints at a switch variant, but a hint is not a datasheet.

Speed and depth become firmware constants. They want tuning against the real diffuser anyway — which does not exist yet, because the enclosure is out of scope — so freezing them in firmware costs nothing now and is a one-line change later.

Dimming method

ChosenAnalog dimming — 20 kHz MCU PWM, RC low-passed to a DC level on CTRL
RejectedDirect PWM on CTRL

The AL8860 datasheet recommends PWM below 500 Hz for good dimming resolution. The modulation research puts the peripheral-vision flicker threshold near 300 Hz. A 500 Hz carrier clears that by 1.7x — thin for a lamp that is deliberately meant to be seen out of the corner of the eye, and raising the carrier is exactly what the datasheet says degrades accuracy.

Analog dimming dissolves the conflict: LED current never chops, so there is no flicker frequency at all, and no PWM modulation of the inductor to become an audible whine. The datasheet's guaranteed 5–100% analog range (20:1) is ample for a flame effect.

This is not free

Analog dimming cannot reach true zero gracefully — below 5% of I_NOM the AL8860 is outside its guaranteed range, so the effect bottoms out at a ~35 lm glow and then steps to hard off. For a flame this is arguably right; for a design that needed a smooth fade to black it would be the wrong choice. Recorded here so the constraint is not rediscovered as a bug.

The 20 kHz carrier is chosen to sit above the audio band entirely and to give the 208 Hz RC filter 40 dB of attenuation. It is an MCU-side frequency only — it never reaches the driver as a switching signal.

Modulation algorithm

ChosenTwo layers of one-pole low-pass-filtered noise (slow "breathing" + faster "flicker"), summed
RejectedSingle-layer filtered noise
RejectedLUT playback of recorded flame data

modulation-algorithms notes that layering 2–3 filtered-noise generators "adds realism at the cost of a bit more CPU/RAM" — on a 64 MHz Cortex-M0+ running a 50 Hz animation loop, that cost is unmeasurable, so take the realism. The bounded-random-walk approach's character is folded into the slow layer rather than kept as a separate mode.

The LUT approach is rejected because the dataset does not exist. It needs a real flame's luminance curve extracted from video, which is a separate project. The G031's 64 KB of flash keeps the door open for it.

Safe default-OFF

Chosen33 kΩ pull-down on CTRL plus the 100 nF filter cap doubling as a 150 ms soft-start
RejectedFirmware-only default-off
RejectedMCU internal pull-down alone

control-safety is unambiguous that this must be a hardware guarantee. The wrinkle the research could not know — because the driver was not picked yet — is that the AL8860's CTRL pin floats to ON, so a pull-down is mandatory rather than merely prudent.

The datasheet does not publish CTRL's internal bias current, so the pull-down alone is not provable. The soft-start capacitor is what makes the guarantee solid: the driver physically cannot reach full current for 150 ms, and the MCU takes control within about 1–2 ms of power-on reset. Two mechanisms, one of which is datasheet-provable. An MCU internal pull-down was rejected because it depends on firmware configuring it — which is the very window being protected.

Interconnect

ChosenJST XH 6-pin (C144397), power contacts doubled
RejectedJST VH 2-pin (C160315) plus a signal connector
RejectedMolex KK 2510 (C2847671)

The interconnect research framed this as XH's zero-margin 3 A contact rating versus VH's 10 A headroom. That framing assumed the load was the 3 A contract cap. It is 410 mA. Each doubled XH contact carries 205 mA — 6.8% of nameplate, a 14x derated margin. The headroom problem VH exists to solve does not occur in this design.

XH also wins on pin count: this design needs six conductors (2 power + 2 ground + ATT + PDOK), which is exactly one XH housing, versus VH plus a companion signal connector.

Molex KK was never a real alternative — the research page includes it explicitly to show the 3 A-per-contact ceiling is a whole-class property, not an XH quirk.

Protection

ChosenSecond SMAJ20A (C571370) local to Board L's input
ChosenPPTC, 750 mA hold / 1.5 A trip / 30 V (C976305)
RejectedRelying solely on Board P's D5
RejectedNo fuse (relying on the PD source's 3 A limit)

The local TVS costs one BOM line already on the order (D5 is the same part) and clamps transients the ~30 cm harness can develop on its own inductance — the whole point of the TVS margin rule is to clamp close to what you are protecting.

The PPTC exists because there is a 7x gap between what the source will deliver and what the board needs: the PD contract allows 3 A, and Board L draws 410 mA. Without a fuse, a Board L fault — a shorted LED string, a failed driver — can pull 45 W through a 2.5 mm harness before anything intervenes. A 750 mA hold bounds that at under 2x the normal draw.

Residual, stated: the PPTC's 30 V rating sits 1.4 V (4.7%) below the 32.4 V clamp ceiling during a surge event. That is the same transient-only category as Board P's two inherited gaps and roughly a third the size of the smallest of them. Every 1206-class PPTC in the catalog with a 750 mA hold tops out at 30 V, so clearing it would mean dropping the fuse entirely — a worse trade.

Summary of accepted residual risks

RiskCategoryWhere
U1 STUSB4500 VDD, 4.4 V over absolute max at full clamptransient only, inheritedratings matrix
Q1 AO3401A VDS, 2.4 V over absolute max at full clamptransient only, inheritedratings matrix
F1 PPTC, 1.4 V over its 30 V rating at full clamptransient only, newthis page, above
Duty cycle 78% at the LED bin's Vf maximum, versus a 75% recommendationsteady state, bounded — 98% is the hard maximumBoard L
Worst-case string imbalance puts one LED at 94% of its package ratingsteady state, datasheet-boundedBoard L
R21's ability to hold CTRL low is not datasheet-provablecovered by a second mechanism; verify at bring-upBoard L
The whole Board P topology has never run on hardwareinherited, unavoidableLessons Carried From zudo-pd

Revision History

CreatedUpdated