diff --git a/hardware/fan-characterization-fixture/BRINGUP.md b/hardware/fan-characterization-fixture/BRINGUP.md new file mode 100644 index 0000000..a0a8e71 --- /dev/null +++ b/hardware/fan-characterization-fixture/BRINGUP.md @@ -0,0 +1,165 @@ +# Rev 0 bring-up: minimum safe first power + +Record every result in the JumpJet characterization evidence record, with the +instrument, its setting, and a photo or capture. Do the steps in order: each +one removes an unknown that the next depends on. + +**Starting state** + +- JP1, JP2, JP3, JP4 **OPEN**. JP5 fitted. +- F1 holds a labelled 0 Ω link or dummy fuse, not a rated fuse. The bench + PSU current limit is the first protection. +- Controller not connected to J1. Fan not connected to J3. + +**Operating rule (tach back-power)** + +- The controller's 3V3 must be powered **before JP3 or JP4 is closed**. +- Keep 3V3 on while JP3 or JP4 is closed and fan power is on. Before + removing 3V3, turn fan power off or open JP3 and JP4. +- Fan power with JP3 and JP4 both open is allowed without 3V3: the raw tach + lead then reaches only TP8 and has no path to the 3V3 rail. +- See README "Tach protection and back-power". + +## 1. Identify the specimen + +1. Photograph the label: part number `9GA0424P3J001`, lot, and date code. +2. Photograph each lead and record its colour. +3. Record any connector or housing on the leads. + +## 2. Verify the leads before any 24 V + +1. With the fan unpowered, measure lead-to-lead resistance and diode-mode + readings. Record all of them. +2. Establish each lead's function by photo, continuity, and the manufacturer + drawing (9GA0424P3J001 Rev C). The catalog colour convention is **not** + sufficient on its own. +3. Do not land a lead on J3 until its function is established. +4. `FAN_PWM_RAW` must never reach `FAN_24V`: Q1 is not rated for that fault. + +## 3. Prepare the bench supply + +1. Set 24.0 V and a conservative current limit based on the 0.27 A rating. + Record the limit. It is a bench setting, not a derived startup + specification. +2. Check the output with no load. +3. Record whether the PSU output floats or is earth-bonded. +4. Connect J2 and confirm polarity at TP12 against TP14 **before** landing the + fan. The fixture has no reverse-polarity element. + +## 4. Fan power only, signal lines released + +1. Land only `FAN_24V` and `FAN_GND` on J3. Keep the control and sensor leads + insulated and off J3. +2. Power up. Record the supply current: the inrush peak, if a current probe + is available, and the steady state. +3. The drawing specifies that an open control lead gives the same speed as + 100 % PWM. Record whether the specimen behaves that way. + +## 5. FAN_PWM_RAW with no active drive + +1. Land the control lead on J3.3. Keep **JP2 OPEN** for the whole step. +2. Measure the open-circuit voltage first. Scope TP6 against TP7 and record + the voltage and any waveform. +3. Continue only if both are true: + - the lead's identity was already established in step 2, and + - the measured open voltage is ≤ 5.25 V, as the manufacturer drawing + specifies. + + If the open voltage is above 5.25 V, **STOP**. Do not connect the + resistor. Treat the lead identity, or the assumption about the fan's + control interface, as wrong until it has been investigated. +4. Temporarily connect a known resistor from TP6 (`FAN_PWM_RAW`) to TP7 + (GND). This is a bench test part, not a fixture component: + - 100 Ω + - 1 % + - ≥ 0.5 W +5. Measure the voltage across the resistor with a DMM on its **voltage** + range. Do not put the DMM's current input in this circuit. +6. Calculate the current: I = V / 100 Ω. + - At the drawing's 2 mA maximum source current, expect about 0.200 V. + - That is below the control input's documented ≤ 0.4 V LOW threshold, so + the resistor holds the input LOW. +7. Record: + - resistor value (measured, if possible) + - measured voltage + - calculated current + - resulting fan behaviour (drawing: 0 % = stopped) +8. Remove the resistor. + +This is a **controlled low-state current measurement** at the measured +resistor voltage. It is not an exact zero-volt short-circuit measurement. +The drawing's "≤ 2 mA at 0 V" figure is the limit it is compared against. + +Close JP2 later, in step 7, only if the open voltage was ≤ 5.25 V and the +calculated current was ≤ 2 mA. + +## 6. Raw tach, before any pull-up or GPIO + +1. Power the controller. Connect J1.3 to controller 3V3 and J1.4 to + controller GND, so the fixture's 3V3 rail is live before JP3 closes + (operating rule). Leave J1.1 (`MCU_PWM`) and J1.2 (`TACH_GPIO`) unwired + and JP1 open until step 7, item 5. +2. Land the sensor lead on J3.4. Keep JP3 and JP4 open. +3. Scope TP8 with the fan running. The drawing's sensor specification + 9D0001H202 says open collector: expect TP8 to float or sit near 0 V with + no pull-up. +4. **If TP8 is actively driven above 3.3 V, stop** and revise the tach stage. +5. Close **JP3** only. Record at TP8: + - high level + - low level, which must be ≤ ~0.6 V (the documented VCE(sat) max is + 0.8 V at 5 mA) + - edge shape, glitches, and ringing +6. Add no filtering. + +## 7. Validate the open-drain PWM stage + +1. Keep the controller's 3V3 on from step 6 (operating rule), but leave its + PWM output unconnected: J1.1 (`MCU_PWM`) stays unwired and JP1 open until + item 5. With JP2 open, drive TP3 (`PWM_IN`) from a signal generator: + - 0–3.3 V square wave + - 25 kHz, the drawing's specified control frequency +2. Scope TP4 and TP5. Then close JP2 and scope TP6. Record: + - the low level (≤ 0.4 V required, about 4 mV expected) + - the edges + - the duty cycle against the generator +3. Remove the generator. +4. Flash the fan-characterization image for the N16R8 with the Rev 0 bench + overlay (README "Controller wiring overlay"): + - `GATE_GPIO=6`, `SINK_LEVEL=1`, `TACH_GPIO=7` + - PPR 0, internal tach pull-up off +5. Wire J1.1 and J1.2 to the controller (J1.3 and J1.4 are already wired from + step 6) and close JP1. +6. Confirm the boot log shows the line released. Confirm TP4 stays at 0 V + through reset, flashing, and a controller power cycle. Open JP3 before + the power cycle and close it again once 3V3 is back (operating rule). +7. Run `FAN_PWM_HOLD` at 0 %, a mid duty, and 100 %. For each, compare the + TP4/TP6 captures with the reported `applied_sink_duty_pct`. + +## 8. Connect tach to GPIO7 + +1. Continue only if step 6 showed an open-collector output with levels + within 0–3.3 V, and the controller's 3V3 is on. +2. Close JP4. +3. Check that TP9 (`TACH_GPIO`) follows TP8 within the R4/R5 divider: + - high ≈ 3.09 V + - low ≈ V(TP8) +4. Run a hold. Compare `tach_edges` and `edge_hz` with a scope or + logic-analyzer count over the same window. +5. Add a glitch filter only if the captures show a need. + +## 9. PPR stays unknown + +The manufacturer documentation suggests 2 pulses per revolution. DragonBench +still keeps `CONFIG_DB_FAN_TACH_PPR=0` until independent evidence exists: +preferably an optical tachometer correlated with tach frequency at several +speeds on this specimen. + +Record that evidence and reference it in `CONFIG_DB_FAN_TACH_PPR_EVIDENCE` +when PPR is set. + +## After bring-up + +- Choose F1 only after startup and locked-rotor current are measured. + Locked-rotor is a separate, deliberate test with its own plan. +- Nothing measured on this fixture becomes a JumpJet threshold, frequency, + PPR, or safety value without its own review. diff --git a/hardware/fan-characterization-fixture/README.md b/hardware/fan-characterization-fixture/README.md new file mode 100644 index 0000000..0c2dedc --- /dev/null +++ b/hardware/fan-characterization-fixture/README.md @@ -0,0 +1,426 @@ +# Fan-characterization fixture, Rev 0 (draft) + +> **This is bench characterization hardware, not JumpJet production hardware.** +> +> The fixture lets DragonBench's `fan-characterization` experiment profile +> ([docs/FAN_CHARACTERIZATION.md](../../docs/FAN_CHARACTERIZATION.md)) drive a +> fan control input through an open-drain stage and count tach edges. +> +> It defines no JumpJet values: no GPIOs, thresholds, startup duty, stall +> limits, or fan-safety policy. The GPIOs named below are a bench wiring +> overlay only. + +The DUT is the Sanyo Denki San Ace 40 `9GA0424P3J001`: + +- 24 V, 40 × 40 × 28 mm +- 4-wire, PWM control with pulse sensor + +## Files + +| Path | Role | +|---|---| +| `generator/fixture.py` | **Source.** Parts, values, wiring, sheet notes, and title block. | +| `generator/build_schematic.py`, `generator/sexp.py` | Source. Turn `fixture.py` into the KiCad files. | +| `generator/expected-nets.txt` | Source. Hand-maintained expected connectivity, reviewed independently of `fixture.py`. | +| `generator/check_netlist.py` | Source. Compares KiCad's extracted netlist with `fixture.py` and `expected-nets.txt`, and checks the Rev 0 jumper defaults. | +| `verify.sh` | Regenerate and verify. See [Reproducing](#reproducing-and-verifying). | +| `fan-characterization-fixture.kicad_sch`, `.kicad_pro` | Generated. KiCad 9 schematic, one A3 sheet. No PCB yet. | +| `fan-characterization-fixture.pdf`, `.svg` | Generated review exports. | +| `BRINGUP.md` | Minimum safe first-power procedure. | + +Do not edit the schematic in eeschema. Change `generator/fixture.py` and run +`./verify.sh --update`. A hand edit makes `./verify.sh` fail with `STALE`. + +## Reproducing and verifying + +Requirements: Docker. `verify.sh` runs everything inside one pinned image, +`kicad/kicad:9.0@sha256:e638b79b…`, which ships KiCad 9.0.9 and Python 3.11. +The generator therefore embeds exactly the symbol libraries that ERC checks +against. + +```text +./verify.sh # check only +./verify.sh --update # rewrite .kicad_sch, .kicad_pro, .pdf, .svg, then check +``` + +The check does four things: + +1. **Reproduces the schematic.** The checked-in `.kicad_sch` and `.kicad_pro` + must match the generator output byte for byte. UUIDs are derived from + content, so the output is deterministic. +2. **Runs ERC.** `kicad-cli sch erc --severity-all` must report 0 errors and + 0 warnings. +3. **Checks connectivity.** The netlist KiCad extracts must agree exactly + with `fixture.py` and with `expected-nets.txt`. +4. **Checks jumper defaults.** JP1–JP4 must be `OPEN` and JP5 `FITTED`, + read from each symbol's `Default` field. + +The ERC report, extracted netlist, and fresh PDF/SVG are written to a +temporary directory. They are validation output, so none are committed. +The PDF and SVG exports are not compared byte for byte. + +## Blocks + +### 1. MCU / DragonBench interface (J1) + +J1 carries abstract nets: `MCU_PWM`, `TACH_GPIO`, `3V3`, `GND`. The +controller supplies 3V3; the fixture never generates it. + +### 2. PWM open-drain driver + +- The gate path runs `MCU_PWM` → JP1 → R1 220 Ω → Q1 gate. +- R2 (10 kΩ) pulls the gate down. +- The Q1 drain goes → JP2 → `FAN_PWM_RAW`. The source goes to `GND`. + +### 3. Tach input + +`FAN_TACH_RAW` feeds two independently jumpered paths: + +- **JP3:** enables the R3 10 kΩ pull-up to 3V3. +- **JP4:** feeds the protected path to the GPIO: R4 22 kΩ in series, then the + D1 BAT54S clamp and R5 470 kΩ to GND, then `TACH_GPIO`. + +C2 is a DNP footprint for a later glitch filter. + +### 4. 24 V supply + +- The supply path runs J2 → F1 → JP5 `I_MEAS` → `FAN_24V`. + - F1 is a fuse holder whose rating is TBD. + - JP5 is a link that an ammeter can replace. +- D2/R6 indicate 24 V present. +- C1 (bulk capacitor) is DNP. +- NT1/NT2 form the ground star. + +### 5. Fan connector (J3) + +J3 has one terminal per fan function: `FAN_24V`, `FAN_GND`, `FAN_PWM_RAW`, +`FAN_TACH_RAW`. These are fixture functions, not the fan's physical wire +order. + +### 6. Test points and jumpers + +The table is on the sheet. The Rev 0 defaults are JP1–JP4 **OPEN** and JP5 +**FITTED**. + +## Controller wiring overlay (local, not part of the fixture) + +| J1 | Net | N16R8, Lonely Binary carrier (Rev 0 bench overlay, provisional) | TinyS3[D] | +|---|---|---|---| +| 1 | `MCU_PWM` (out) | GPIO6 | own overlay, TBD | +| 2 | `TACH_GPIO` (in) | GPIO7 | own overlay, TBD | +| 3 | `3V3` | 3V3 terminal (**never 5V**) | 3V3 | +| 4 | `GND` | GND terminal | GND | + +This is the provisional Rev 0 wiring recorded in PR #8's +`docs/TARGET_N16R8.md` ("Fan-characterization fixture pins"). The pins are +DragonBench bench-fixture assignments, not JumpJet GPIOs. + +`sdkconfig.fan-characterization.local` for the N16R8 wiring, built with +`sdkconfig.defaults;sdkconfig.defaults.n16r8;sdkconfig.defaults.fan-characterization;sdkconfig.fan-characterization.local`: + +```text +CONFIG_DB_FAN_PWM_GATE_GPIO=6 +CONFIG_DB_FAN_GATE_SINK_LEVEL=1 +CONFIG_DB_FAN_TACH_GPIO=7 +# CONFIG_DB_FAN_TACH_INTERNAL_PULLUP is not set +# CONFIG_DB_FAN_TACH_PPR stays 0 (unknown) +``` + +Why GPIO6/7: + +- **Not reserved.** They pass PR #8's `DB_FAN_PIN_RESERVED`: they are not + strapping, USB, flash/PSRAM, Octal PSRAM (33–37), or UART0 pins, and not the + N16R8's status RGB LED (48) or the TinyS3D RF switch (38). +- **Reset-state pull: unverified.** Whether GPIO6 has a pull-up or + pull-down at or after reset has not been checked against the ESP32-S3 + datasheet's IO MUX table. R2 is sized to hold the gate low with the GPIO + undriven; confirm the reset state before relying on it. +- **Unused alternate functions.** Their other functions are ADC1, touch, and + RTC GPIO, none of which DragonBench uses. +- **Power-up glitch: unverified.** The expectation that any power-up glitch + on these pins is to the low level (the release level here) comes from the + same datasheet section and has not been re-checked. +- **On the board.** On the Lonely Binary N16R8 carrier, GPIO6 and GPIO7 are on + the pluggable terminals, and its GPIO map shows both as plain GPIO. + +These are bench choices, not product GPIO assignments. + +**Validation boundary.** On the N16R8 the baseline image is physically +validated, the fan-characterization image has booted, and GPIO6's static 0 % +and 100 % gate levels were measured with nothing attached (PR #8, +`docs/TARGET_N16R8.md`). Not validated: the complete fixture, the external +stage, the tach path, and the 25 kHz waveform. PPR is unknown. + +## DUT electrical facts (manufacturer documentation) + +Source: the Sanyo Denki specification drawing for **9GA0424P3J001, Rev C**, +and the sensor specification it references, **9D0001H202**. The values below +are transcribed from those documents. The documents themselves are not stored +in this repository; [References](#references) lists where to find them. + +**Control (PWM) input:** + +- Specified PWM frequency: **25 kHz**. This is the manufacturer-specified + control frequency for 9GA0424P3J001; bench characterization will still + verify the specimen's behaviour. +- Open-collector or open-drain drive is supported. +- Control terminal **open** gives the same speed as 100 % PWM (full speed). +- **0 %** PWM means stopped. +- The open control-terminal voltage is ≤ 5.25 V. +- The terminal sources ≤ 2 mA when the control voltage is 0 V. It sinks + ≤ 1 mA at 5.25 V; that applies only to a push-pull driver, not to this + open-drain stage. +- Required low level: ≤ 0.4 V. + +**Sensor (tach) output, per 9D0001H202:** + +- Open collector. +- VCE ≤ 27.6 V. +- IC ≤ 5 mA. +- VCE(sat) ≤ 0.8 V. +- The documented waveform is consistent with two output cycles per + revolution (two falling edges per revolution). + +These describe the DUT. They are not JumpJet policy or thresholds. + +**PPR:** the manufacturer documentation suggests **2 pulses/rev**. +DragonBench's configured PPR stays **`CONFIG_DB_FAN_TACH_PPR=0` (unknown)**. +The profile's evidence policy requires independent verification on the +specimen before a non-zero PPR is committed, preferably optical RPM +correlated with tach frequency. + +## PWM stage calculations + +Q1 is the onsemi **NTR4003NT1G** (SOT-23, G=1, S=2, D=3). Its guaranteed +RDS(on) is **2.0 Ω max at VGS 2.5 V** and 1.5 Ω max at VGS 4.0 V. +Threshold voltage is not used below as proof that Q1 switches. + +**Normal stress:** + +- VDS is at most the open control voltage, **≤ 5.25 V**. +- ID is at most the control-terminal source current, **≤ 2 mA**. +- Q1 is used only as a signal-interface FET. It is **not rated** for + `FAN_PWM_RAW` landed on `FAN_24V`: the legitimate supply reaches 26.4 V + against its 30 V VDS, which leaves no margin for transients. Lead identity + is verified before landing (BRINGUP step 2). + +**Driven gate voltage:** + +- The static gate load is R1 + R2 = 10.22 kΩ, so the pad sources 0.32 mA and + sits essentially at VDD. +- VGS = VDD × 10 k/10.22 k = **3.23 V** at 3.3 V. +- At the 3.0 V bottom of the ESP32-S3's recommended supply range it is + **2.94 V**. +- Both exceed the 2.5 V point at which RDS(on) is guaranteed. +- Using the datasheet's worst VOH instead (0.8 × VDD, specified at + full-strength output current, not at 0.32 mA) gives 2.58 V at a 3.3 V rail. + That is still above 2.5 V. + +**Gate current transient:** + +- Peak charge current is ≤ 3.3 V / 220 Ω = **15 mA**. The GPIO's own output + resistance makes it lower. +- Gate RC is 220 Ω × Ciss. It stays under 25 ns even for 100 pF, against a + 20 µs half-period at 25 kHz. + +**FAN_PWM_RAW low level:** + +- Worst case is 2 mA × 2.0 Ω = **4 mV**, far below the ≤ 0.4 V requirement. +- RDS(on) could be 200 Ω before the 0.4 V limit was reached. + +**Released (intended state whenever GPIO6 is not driven high):** + +- R2 is there to hold the gate low whenever GPIO6 is undriven (Hi-Z, or the + controller unpowered): IGSS × 10 kΩ, **≤ 0.1 V** at IGSS ≤ 10 µA. IGSS is + assumed; confirm it from the datasheet. +- What GPIO6 itself does during reset, early boot and flashing is not + known. Its reset-state pull has not been checked against the ESP32-S3 + datasheet, and those phases have not been instrumented. If an internal + pull-up (about 45 kΩ assumed) were active then, the gate would sit near + 3.3 × 10/55 = 0.6 V. The firmware never enables it on the gate. +- Observed so far, with nothing attached: GPIO6 read 0 V on a DMM at idle, + after each run and after a reset, with the firmware running (PR #8, + `docs/TARGET_N16R8.md`). +- Release through reset, flashing and a controller power cycle is not yet + proven. It is checked at TP4/TP6 during bring-up (BRINGUP step 7, item 6), + not inferred from VGS(th). + +**What the stage omits:** no RC filter and no fixture pull-up on +`FAN_PWM_RAW`. The fan's internal pull-up sets the high level and edge rate. + +## Tach protection and back-power + +The tach output is documented as open collector. In normal operation it only +sinks, so it cannot back-power the 3V3 rail even while the controller is off. +Back-power needs a **fault**, such as the sensor lead landed on or shorted to +the fan supply (≤ 26.4 V). + +With R4 = 22 kΩ, worst-case current into 3V3 with the controller unpowered +(rail near 0 V) is: + +| Path | Needs | Worst-case current | +|---|---|---| +| R4 → D1 upper diode → 3V3 | JP4 closed | (26.4 − 0.35) V / 22 kΩ = **1.2 mA** | +| R3 → 3V3 | JP3 closed | 26.4 V / 10 kΩ = **2.7 mA** (2.64) | +| Both | JP3 and JP4 closed | **3.9 mA** | + +With the controller powered, the same fault injects slightly less, and the +running ESP32 board draws tens of mA, so the rail cannot be pushed up. + +Resistor dissipation in that fault is 32 mW in R4 and 70 mW in R3, within +0805 ratings. + +**Decision:** keep the simple BAT54S clamp topology (option A), and make two +changes: + +1. **R4 raised from 4.7 kΩ to 22 kΩ.** This cuts clamp injection from about + 5.5 mA to 1.2 mA and costs nothing in signal terms: + - High level with JP3 and JP4 closed is 3.3 × 492/502 × 470/492 ≈ + **3.09 V**, above VIH 2.475 V. + - RC with about 12 pF of pin and clamp capacitance is about 0.26 µs, + negligible at tach rates. +2. **An explicit bench operating rule.** The controller's 3V3 must be + **powered before JP3 or JP4 is closed**, and stay on while either is + closed and fan power is on. Before removing 3V3, turn fan power off or + open JP3 and JP4. Fan power with JP3 and JP4 both open needs no 3V3: the + raw tach lead then reaches only TP8. This rule is on the sheet and in + BRINGUP.md. + +The R3 path in particular is not limited by R4. Its value stays 10 kΩ, as +required for the pull-up. + +Blocking diodes or a separate protected rail were not added. For a jumpered +bench fixture the rule and the reduced current are simpler and adequate. + +**Tach signal margins:** + +- The pull-up draws 3.3 V/10 kΩ = **0.33 mA**, far below IC ≤ 5 mA. +- Low level at the GPIO is ≤ 0.8 × 470/492 = **0.76 V** at the documented + VCE(sat) max. VIL is 0.825 V, so the worst-case margin is only 61 mV. +- VCE(sat) is specified at the full 5 mA. At 0.33 mA it should be much + lower, but bring-up must measure it: **V(TP8) low ≤ ~0.6 V**. +- There is no glitch filter in Rev 0. Keep `CONFIG_DB_FAN_TACH_INTERNAL_PULLUP` + off. + +## Ground topology + +BENCH_GND at J2.2 is the only place where power return and signal reference +meet. + +- **NT1** ties it to `FAN_GND`, which carries fan supply return only. +- **NT2** ties it to `GND`, which carries: + - the Q1 source + - the tach clamp and pulldowns + - J1.4 (controller ground) + - the scope ground + +Fan motor current never flows in `GND`. The ≤ 2 mA control and tach currents +return through the star. The controller's USB ground meets the PSU negative +only there. Use a floating PSU output, or record the earth bond if there is +one. + +## BOM + +Status key: + +- **FINAL:** justified by the function. +- **PROVISIONAL:** reasoned, but depends on a checkable assumption or on + supply availability. +- **DNP/TBD:** footprint only, or value undecided. + +| Ref | Part / value | Function | Stress | Why | Status | +|---|---|---|---|---|---| +| J1 | 4-pos 5.08 mm screw terminal | Controller link | 3.3 V, < 20 mA | Screw terminal for wires from the controller's terminals | PROVISIONAL (style) | +| JP1 | 2-pin header + shunt, `GATE_EN` | Disconnects the controller from the gate; TP3 can take a signal generator | 3.3 V | Isolation point | FINAL | +| R1 | 220 Ω 1 % 0805 | Gate series resistor | ≤ 15 mA peak | See calculations | PROVISIONAL (until Ciss confirmed) | +| R2 | 10 kΩ 1 % 0805 | Gate pulldown | 0.32 mA | Holds Q1 off when GPIO6 is undriven; reset/flashing behaviour to be confirmed at TP4 | PROVISIONAL (confirm IGSS) | +| Q1 | onsemi NTR4003NT1G, SOT-23 | Open-drain sink on the fan control input | VDS ≤ 5.25 V, ID ≤ 2 mA | RDS(on) guaranteed at VGS 2.5 V; ESD-protected gate. Signal interface only, not a 24 V miswire device. | PROVISIONAL (datasheet values below) | +| JP2 | 2-pin header + shunt, `PWM_LINE_EN` | Fully releases `FAN_PWM_RAW` | ≤ 5.25 V | Isolation point | FINAL | +| JP3 | 2-pin header + shunt, `TACH_PU_EN` | Enables the tach pull-up | 3.3 V | Default open | FINAL | +| R3 | 10 kΩ 1 % 0805 | Tach pull-up to 3V3 | 0.33 mA | Far below IC 5 mA; about 1 µs rise with 100 pF | PROVISIONAL | +| JP4 | 2-pin header + shunt, `TACH_GPIO_EN` | Connects raw tach to the protected GPIO path | ≤ raw tach | Default open, so TP8 is unloaded | FINAL | +| R4 | 22 kΩ 1 % 0805 | Series protection | 1.2 mA / 32 mW at a 26.4 V fault | Limits clamp back-power | PROVISIONAL | +| D1 | BAT54S, SOT-23 | Clamps `TACH_GPIO` to GND/3V3 | ≤ 1.2 mA fault | ESP32-S3 inputs are not 5 V tolerant | PROVISIONAL | +| R5 | 470 kΩ 1 % 0805 | Holds `TACH_GPIO` low with JP4 open | µA | Stops PCNT counting a floating input | PROVISIONAL | +| C2 | 0805, **DNP** | Future glitch filter | – | Rev 0 observes the unfiltered waveform | DNP/TBD | +| J2 | 2-pos 5.08 mm screw terminal | Bench PSU input | 24 V, current TBD | – | PROVISIONAL (rating vs locked-rotor) | +| F1 | 5 × 20 mm clip holder, **element TBD** | Supply fuse | TBD | No rating until startup and locked-rotor current are measured. The PSU current limit is the first protection during characterization. | DNP/TBD | +| JP5 | 2-pin header + shunt, `I_MEAS`, **fitted** | Break for a series ammeter | fan current (TBD) | Current measurement without rewiring | PROVISIONAL (shunt rating vs locked-rotor) | +| R6 | 10 kΩ 1 % 0805 | LED current limit | 2.2 mA, 48 mW | – | PROVISIONAL | +| D2 | green LED 0805 | 24 V present | 2.2 mA | Upstream of JP5, so it is out of the fan current | PROVISIONAL | +| C1 | electrolytic ≥ 50 V, 6.3 mm radial, **DNP** | Bulk decoupling at the fan | – | Only for a measured need; fitting it changes the supply-current waveform | DNP/TBD | +| NT1, NT2 | net ties | Ground star | – | Enforces the topology | FINAL | +| J3 | 4-pos 5.08 mm screw terminal | DUT leads by verified function | 24 V / ≤ 5.25 V / tach | Terminal order is the fixture's own; the fan's wire order is not assumed | PROVISIONAL (style) | +| TP1–TP14 | Keystone 5000-series loops | Probe points | – | See the sheet | FINAL | + +Q1 values are still **PROVISIONAL**. The onsemi NTR4003N datasheet is linked +in [References](#references), but it has not been read directly: the network +used to prepare this revision blocked it. The values used above came from +summaries of that datasheet. Confirm them against the PDF before ordering: + +- VDS 30 V +- RDS(on) 2.0 Ω max at VGS 2.5 V +- ESD-protected gate +- SOT-23 pinout G=1, S=2, D=3 +- IGSS +- Ciss + +## FR120N module: not used + +The FR120N optocoupler/power-MOSFET module is original Jetpack power-switch +hardware. Its topology has not been verified well enough for use on a fan +control line, so it is not part of this fixture. + +It is reserved for later power-switch or heater-load characterization. Only +one module survives: it is not to be modified, opened, depotted, or +destructively characterized as part of this work. + +## Specimen facts still to verify + +1. Specimen identity, and lead colours and functions. Verify by photo, + continuity, and the manufacturer drawing. The colour convention (red +, + black −, brown PWM, yellow sensor) is a **catalog convention, not yet + verified on the specimen**. +2. Specimen behaviour on the control lead: + - open-circuit voltage + - low-state source current, measured through a 100 Ω resistor + (BRINGUP step 5) + - full speed with the lead open + - stop at 0 % + - response at 25 kHz +3. Specimen tach: + - open-collector behaviour + - low level at 0.33 mA (must be ≤ ~0.6 V at TP8) + - edge quality +4. Startup, running, and locked-rotor current at 24 V. These set the ratings + of F1, JP5, and J2. +5. PPR by optical RPM, or other independent evidence, correlated with tach + frequency. Until then `CONFIG_DB_FAN_TACH_PPR=0`. +6. Whether a glitch filter (C2 and/or `CONFIG_DB_FAN_TACH_GLITCH_FILTER_NS`) + is needed. Decide from scope captures. +7. Q1 datasheet values: VDS, RDS(on) at VGS 2.5 V, IGSS, Ciss, and pinout. + +## References + +URLs are recorded so the sources can be found again. Copies of the PDFs are +not committed. + +| Document | Identifier | Publisher | Location | +|---|---|---|---| +| San Ace 40 fan specification drawing | 9GA0424P3J001, Rev C | Sanyo Denki | Sanyo Denki drawing hosted by Digi-Key: https://mm.digikey.com/Volume0/opasdata/d220001/medias/docus/6283/9GA0424P3J001.pdf | +| Sensor specification referenced by the fan drawing | 9D0001H202 | Sanyo Denki | Copy/mirror of the Sanyo Denki specification hosted by LCSC: https://atta.szlcsc.com/upload/public/pdf/source/20231027/F5C17EBD5CE131CC8C55FA436569F463.pdf | +| NTR4003N small-signal MOSFET datasheet | NTR4003N/D | onsemi | onsemi datasheet: https://www.onsemi.com/download/data-sheet/pdf/ntr4003n-d.pdf | + +Digi-Key and LCSC only host copies; Sanyo Denki is the author of the first +two documents. + +Verification status as of 2026-09-28: + +- None of the three documents could be opened from the environment used to + prepare this revision. The network egress proxy refused all three hosts. +- Their titles, revisions, and electrical values were **not re-verified** + against these URLs. +- The fan and sensor values in [DUT electrical facts](#dut-electrical-facts-manufacturer-documentation) + are as transcribed by thetechbenders from the 9GA0424P3J001 Rev C drawing + and the 9D0001H202 specification. +- The Q1 values stay provisional, as described under the BOM. diff --git a/hardware/fan-characterization-fixture/fan-characterization-fixture.kicad_pro b/hardware/fan-characterization-fixture/fan-characterization-fixture.kicad_pro new file mode 100644 index 0000000..f451227 --- /dev/null +++ b/hardware/fan-characterization-fixture/fan-characterization-fixture.kicad_pro @@ -0,0 +1,16 @@ +{ + "meta": { + "filename": "fan-characterization-fixture.kicad_pro", + "version": 1 + }, + "schematic": { + "legacy_lib_dir": "", + "legacy_lib_list": [] + }, + "sheets": [ + [ + "40c81846-c604-5f80-a432-156beefa23ca", + "" + ] + ] +} diff --git a/hardware/fan-characterization-fixture/fan-characterization-fixture.kicad_sch b/hardware/fan-characterization-fixture/fan-characterization-fixture.kicad_sch new file mode 100644 index 0000000..7c3a55a --- /dev/null +++ b/hardware/fan-characterization-fixture/fan-characterization-fixture.kicad_sch @@ -0,0 +1,2530 @@ +(kicad_sch + (version 20250114) + (generator "eeschema") + (generator_version "9.0") + (uuid "40c81846-c604-5f80-a432-156beefa23ca") + (paper "A3") + (title_block + (title "DragonBench fan-characterization fixture (BENCH ONLY)") + (date "2026-09-28") + (rev "0-draft") + (company "thetechbenders / DragonBench") + (comment 1 "BENCH characterization hardware. NOT JumpJet production.") + (comment 2 "DUT: San Ace 9GA0424P3J001 (24 V, 4-wire), drawing Rev C") + (comment 3 "Rev 0: JP1-JP4 OPEN, JP5 fitted") + (comment 4 "Specimen lead ID and configured PPR: UNVERIFIED")) + (lib_symbols + (symbol + "Connector:Screw_Terminal_01x04" + (pin_names (offset 1.016) (hide yes)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" (at 0 5.08 0) (effects (font (size 1.27 1.27)))) + (property "Value" "Screw_Terminal_01x04" (at 0 -7.62 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "Description" + "Generic screw terminal, single row, 01x04, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "screw terminal" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "ki_fp_filters" + "TerminalBlock*:*" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "Screw_Terminal_01x04_1_1" + (rectangle + (start -1.27 3.81) + (end 1.27 -6.35) + (stroke (width 0.254) (type default)) + (fill (type background))) + (polyline + (pts (xy -0.5334 2.8702) (xy 0.3302 2.032)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.5334 0.3302) (xy 0.3302 -0.508)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.5334 -2.2098) (xy 0.3302 -3.048)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.5334 -4.7498) (xy 0.3302 -5.588)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.3556 3.048) (xy 0.508 2.2098)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.3556 0.508) (xy 0.508 -0.3302)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.3556 -2.032) (xy 0.508 -2.8702)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.3556 -4.572) (xy 0.508 -5.4102)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (circle (center 0 2.54) (radius 0.635) (stroke (width 0.1524) (type default)) (fill (type none))) + (circle (center 0 0) (radius 0.635) (stroke (width 0.1524) (type default)) (fill (type none))) + (circle (center 0 -2.54) (radius 0.635) (stroke (width 0.1524) (type default)) (fill (type none))) + (circle (center 0 -5.08) (radius 0.635) (stroke (width 0.1524) (type default)) (fill (type none))) + (pin + passive + line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at -5.08 0 0) + (length 3.81) + (name "Pin_2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_3" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_4" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Connector:TestPoint" + (pin_numbers (hide yes)) + (pin_names (offset 0.762) (hide yes)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "TP" (at 0 6.858 0) (effects (font (size 1.27 1.27)))) + (property "Value" "TestPoint" (at 0 5.08 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 5.08 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 5.08 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "test point" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "test point tp" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_fp_filters" "Pin* Test*" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "TestPoint_0_1" + (circle (center 0 3.302) (radius 0.762) (stroke (width 0) (type default)) (fill (type none)))) + (symbol + "TestPoint_1_1" + (pin + passive + line + (at 0 0 90) + (length 2.54) + (name "1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Jumper:Jumper_2_Open" + (pin_numbers (hide yes)) + (pin_names (offset 0) (hide yes)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "JP" (at 0 2.794 0) (effects (font (size 1.27 1.27)))) + (property "Value" "Jumper_2_Open" (at 0 -2.286 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "Description" + "Jumper, 2-pole, open" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "Jumper SPST" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "ki_fp_filters" + "Jumper* TestPoint*2Pads* TestPoint*Bridge*" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "Jumper_2_Open_0_0" + (circle (center -2.032 0) (radius 0.508) (stroke (width 0) (type default)) (fill (type none))) + (circle (center 2.032 0) (radius 0.508) (stroke (width 0) (type default)) (fill (type none)))) + (symbol + "Jumper_2_Open_0_1" + (arc + (start -1.524 1.27) + (mid 0 1.778) + (end 1.524 1.27) + (stroke (width 0) (type default)) + (fill (type none)))) + (symbol + "Jumper_2_Open_1_1" + (pin + passive + line + (at -5.08 0 0) + (length 2.54) + (name "A" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 5.08 0 180) + (length 2.54) + (name "B" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Device:R" + (pin_numbers (hide yes)) + (pin_names (offset 0)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "R" (at 2.032 0 90) (effects (font (size 1.27 1.27)))) + (property "Value" "R" (at 0 0 90) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at -1.778 0 90) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "Resistor" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "R res resistor" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_fp_filters" "R_*" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "R_0_1" + (rectangle + (start -1.016 -2.54) + (end 1.016 2.54) + (stroke (width 0.254) (type default)) + (fill (type none)))) + (symbol + "R_1_1" + (pin + passive + line + (at 0 3.81 270) + (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 0 -3.81 90) + (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Transistor_FET:Q_NMOS_GSD" + (pin_names (offset 0) (hide yes)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" (at 5.08 1.905 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "Q_NMOS_GSD" (at 5.08 0 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 5.08 2.54 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "Description" + "N-MOSFET transistor, gate/source/drain" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property + "ki_keywords" + "transistor NMOS N-MOS N-MOSFET" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "Q_NMOS_GSD_0_1" + (polyline + (pts (xy 0.254 1.905) (xy 0.254 -1.905)) + (stroke (width 0.254) (type default)) + (fill (type none))) + (polyline (pts (xy 0.254 0) (xy -2.54 0)) (stroke (width 0) (type default)) (fill (type none))) + (polyline + (pts (xy 0.762 2.286) (xy 0.762 1.27)) + (stroke (width 0.254) (type default)) + (fill (type none))) + (polyline + (pts (xy 0.762 0.508) (xy 0.762 -0.508)) + (stroke (width 0.254) (type default)) + (fill (type none))) + (polyline + (pts (xy 0.762 -1.27) (xy 0.762 -2.286)) + (stroke (width 0.254) (type default)) + (fill (type none))) + (polyline + (pts (xy 0.762 -1.778) (xy 3.302 -1.778) (xy 3.302 1.778) (xy 0.762 1.778)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy 1.016 0) (xy 2.032 0.381) (xy 2.032 -0.381) (xy 1.016 0)) + (stroke (width 0) (type default)) + (fill (type outline))) + (circle (center 1.651 0) (radius 2.794) (stroke (width 0.254) (type default)) (fill (type none))) + (polyline + (pts (xy 2.54 2.54) (xy 2.54 1.778)) + (stroke (width 0) (type default)) + (fill (type none))) + (circle (center 2.54 1.778) (radius 0.254) (stroke (width 0) (type default)) (fill (type outline))) + (circle + (center 2.54 -1.778) + (radius 0.254) + (stroke (width 0) (type default)) + (fill (type outline))) + (polyline + (pts (xy 2.54 -2.54) (xy 2.54 0) (xy 0.762 0)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy 2.921 0.381) (xy 3.683 0.381)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy 3.302 0.381) (xy 2.921 -0.254) (xy 3.683 -0.254) (xy 3.302 0.381)) + (stroke (width 0) (type default)) + (fill (type none)))) + (symbol + "Q_NMOS_GSD_1_1" + (pin + input + line + (at -5.08 0 0) + (length 2.54) + (name "G" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 2.54 5.08 270) + (length 2.54) + (name "D" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 2.54 -5.08 90) + (length 2.54) + (name "S" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Diode:BAT54S" + (pin_names (offset 0)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" (at 2.54 -5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "BAT54S" (at -6.35 3.175 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "Package_TO_SOT_SMD:SOT-23" + (at 1.905 3.175 0) + (effects (font (size 1.27 1.27)) (justify left) (hide yes))) + (property + "Datasheet" + "https://www.diodes.com/assets/Datasheets/ds11005.pdf" + (at -3.048 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property + "Description" + "Vr 30V, If 200mA, Dual schottky barrier diode, in series, SOT-323" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "schottky diode" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_fp_filters" "SOT?23*" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "BAT54S_0_1" + (polyline + (pts (xy -4.445 1.27) (xy -4.445 -1.27) (xy -2.54 0) (xy -4.445 1.27)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline (pts (xy -3.81 0) (xy -1.27 0)) (stroke (width 0) (type default)) (fill (type none))) + (polyline + (pts (xy -3.175 -1.27) (xy -3.175 -1.016)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy -2.54 1.27) (xy -1.905 1.27)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy -2.54 -1.27) (xy -3.175 -1.27)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy -2.54 -1.27) (xy -2.54 1.27)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy -1.905 1.27) (xy -1.905 1.016)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline (pts (xy -1.905 0) (xy 1.905 0)) (stroke (width 0) (type default)) (fill (type none))) + (circle (center 0 0) (radius 0.254) (stroke (width 0) (type default)) (fill (type outline))) + (polyline (pts (xy 1.27 0) (xy 3.81 0)) (stroke (width 0) (type default)) (fill (type none))) + (polyline + (pts (xy 1.905 1.27) (xy 1.905 -1.27) (xy 3.81 0) (xy 1.905 1.27)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy 3.175 -1.27) (xy 3.175 -1.016)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy 3.81 1.27) (xy 4.445 1.27)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy 3.81 -1.27) (xy 3.175 -1.27)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy 3.81 -1.27) (xy 3.81 1.27)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy 4.445 1.27) (xy 4.445 1.016)) + (stroke (width 0) (type default)) + (fill (type none)))) + (symbol + "BAT54S_1_1" + (pin + passive + line + (at -7.62 0 0) + (length 3.81) + (name "A" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 0 -5.08 90) + (length 5.08) + (name "COM" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 7.62 0 180) + (length 3.81) + (name "K" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Device:C" + (pin_numbers (hide yes)) + (pin_names (offset 0.254)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" (at 0.635 2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "C" (at 0.635 -2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0.9652 -3.81 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "Description" + "Unpolarized capacitor" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "cap capacitor" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_fp_filters" "C_*" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "C_0_1" + (polyline + (pts (xy -2.032 0.762) (xy 2.032 0.762)) + (stroke (width 0.508) (type default)) + (fill (type none))) + (polyline + (pts (xy -2.032 -0.762) (xy 2.032 -0.762)) + (stroke (width 0.508) (type default)) + (fill (type none)))) + (symbol + "C_1_1" + (pin + passive + line + (at 0 3.81 270) + (length 2.794) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 0 -3.81 90) + (length 2.794) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Connector:Screw_Terminal_01x02" + (pin_names (offset 1.016) (hide yes)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" (at 0 2.54 0) (effects (font (size 1.27 1.27)))) + (property "Value" "Screw_Terminal_01x02" (at 0 -5.08 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "Description" + "Generic screw terminal, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "screw terminal" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "ki_fp_filters" + "TerminalBlock*:*" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "Screw_Terminal_01x02_1_1" + (rectangle + (start -1.27 1.27) + (end 1.27 -3.81) + (stroke (width 0.254) (type default)) + (fill (type background))) + (polyline + (pts (xy -0.5334 0.3302) (xy 0.3302 -0.508)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.5334 -2.2098) (xy 0.3302 -3.048)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.3556 0.508) (xy 0.508 -0.3302)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (polyline + (pts (xy -0.3556 -2.032) (xy 0.508 -2.8702)) + (stroke (width 0.1524) (type default)) + (fill (type none))) + (circle (center 0 0) (radius 0.635) (stroke (width 0.1524) (type default)) (fill (type none))) + (circle (center 0 -2.54) (radius 0.635) (stroke (width 0.1524) (type default)) (fill (type none))) + (pin + passive + line + (at -5.08 0 0) + (length 3.81) + (name "Pin_1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Device:Fuse" + (pin_numbers (hide yes)) + (pin_names (offset 0)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "F" (at 2.032 0 90) (effects (font (size 1.27 1.27)))) + (property "Value" "Fuse" (at -1.905 0 90) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at -1.778 0 90) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "Fuse" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "fuse" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_fp_filters" "*Fuse*" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "Fuse_0_1" + (rectangle + (start -0.762 -2.54) + (end 0.762 2.54) + (stroke (width 0.254) (type default)) + (fill (type none))) + (polyline (pts (xy 0 2.54) (xy 0 -2.54)) (stroke (width 0) (type default)) (fill (type none)))) + (symbol + "Fuse_1_1" + (pin + passive + line + (at 0 3.81 270) + (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 0 -3.81 90) + (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Jumper:Jumper_2_Bridged" + (pin_numbers (hide yes)) + (pin_names (offset 0) (hide yes)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "JP" (at 0 1.905 0) (effects (font (size 1.27 1.27)))) + (property "Value" "Jumper_2_Bridged" (at 0 -2.54 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "Description" + "Jumper, 2-pole, closed/bridged" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "Jumper SPST" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "ki_fp_filters" + "Jumper* TestPoint*2Pads* TestPoint*Bridge*" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "Jumper_2_Bridged_0_0" + (circle (center -2.032 0) (radius 0.508) (stroke (width 0) (type default)) (fill (type none))) + (circle (center 2.032 0) (radius 0.508) (stroke (width 0) (type default)) (fill (type none)))) + (symbol + "Jumper_2_Bridged_0_1" + (arc + (start -1.524 0.254) + (mid 0 0.762) + (end 1.524 0.254) + (stroke (width 0) (type default)) + (fill (type none)))) + (symbol + "Jumper_2_Bridged_1_1" + (pin + passive + line + (at -5.08 0 0) + (length 2.54) + (name "A" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 5.08 0 180) + (length 2.54) + (name "B" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Device:LED" + (pin_numbers (hide yes)) + (pin_names (offset 1.016) (hide yes)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" (at 0 2.54 0) (effects (font (size 1.27 1.27)))) + (property "Value" "LED" (at 0 -2.54 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "Description" + "Light emitting diode" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property "Sim.Pins" "1=K 2=A" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "LED diode" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "ki_fp_filters" + "LED* LED_SMD:* LED_THT:*" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "LED_0_1" + (polyline + (pts (xy -3.048 -0.762) (xy -4.572 -2.286) (xy -3.81 -2.286) (xy -4.572 -2.286) (xy -4.572 -1.524)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy -1.778 -0.762) (xy -3.302 -2.286) (xy -2.54 -2.286) (xy -3.302 -2.286) (xy -3.302 -1.524)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline (pts (xy -1.27 0) (xy 1.27 0)) (stroke (width 0) (type default)) (fill (type none))) + (polyline + (pts (xy -1.27 -1.27) (xy -1.27 1.27)) + (stroke (width 0.254) (type default)) + (fill (type none))) + (polyline + (pts (xy 1.27 -1.27) (xy 1.27 1.27) (xy -1.27 0) (xy 1.27 -1.27)) + (stroke (width 0.254) (type default)) + (fill (type none)))) + (symbol + "LED_1_1" + (pin + passive + line + (at -3.81 0 0) + (length 2.54) + (name "K" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 3.81 0 180) + (length 2.54) + (name "A" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Device:C_Polarized" + (pin_numbers (hide yes)) + (pin_names (offset 0.254)) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" (at 0.635 2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "C_Polarized" + (at 0.635 -2.54 0) + (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0.9652 -3.81 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property + "Description" + "Polarized capacitor" + (at 0 0 0) + (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "cap capacitor" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_fp_filters" "CP_*" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "C_Polarized_0_1" + (rectangle + (start -2.286 0.508) + (end 2.286 1.016) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy -1.778 2.286) (xy -0.762 2.286)) + (stroke (width 0) (type default)) + (fill (type none))) + (polyline + (pts (xy -1.27 2.794) (xy -1.27 1.778)) + (stroke (width 0) (type default)) + (fill (type none))) + (rectangle + (start 2.286 -0.508) + (end -2.286 -1.016) + (stroke (width 0) (type default)) + (fill (type outline)))) + (symbol + "C_Polarized_1_1" + (pin + passive + line + (at 0 3.81 270) + (length 2.794) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 0 -3.81 90) + (length 2.794) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no)) + (symbol + "Device:NetTie_2" + (pin_numbers (hide yes)) + (pin_names (offset 0) (hide yes)) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (property "Reference" "NT" (at 0 1.27 0) (effects (font (size 1.27 1.27)))) + (property "Value" "NetTie_2" (at 0 -1.27 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "Net tie, 2 pins" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_keywords" "net tie short" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "ki_fp_filters" "Net*Tie*" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (symbol + "NetTie_2_0_1" + (polyline (pts (xy -1.27 0) (xy 1.27 0)) (stroke (width 0.254) (type default)) (fill (type none)))) + (symbol + "NetTie_2_1_1" + (pin + passive + line + (at -2.54 0 0) + (length 2.54) + (name "1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin + passive + line + (at 2.54 0 180) + (length 2.54) + (name "2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))))) + (embedded_fonts no))) + (wire + (pts (xy 40.64 53.34) (xy 38.1 53.34)) + (stroke (width 0) (type default)) + (uuid "0a7bb71a-38d6-5bb2-b108-d8f5fd98fd3e")) + (label + "MCU_PWM" + (at 38.1 53.34 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "58aaf23a-77a5-53d2-8c92-60cab106cbd2")) + (wire + (pts (xy 40.64 55.88) (xy 38.1 55.88)) + (stroke (width 0) (type default)) + (uuid "88039c8d-b5cb-5272-8f68-5da32c8850ce")) + (label + "TACH_GPIO" + (at 38.1 55.88 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "88e5917a-d25d-59db-91a9-b12f0e72a2a9")) + (wire + (pts (xy 40.64 58.42) (xy 38.1 58.42)) + (stroke (width 0) (type default)) + (uuid "beba86d6-2ff6-5ddb-8d41-3fa66b2f495e")) + (label + "3V3" + (at 38.1 58.42 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "85ebda2e-2419-54c3-a924-5a90d464e381")) + (wire + (pts (xy 40.64 60.96) (xy 38.1 60.96)) + (stroke (width 0) (type default)) + (uuid "3bab1f11-8a7e-51af-bd31-df8be37b63f9")) + (label + "GND" + (at 38.1 60.96 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "80eefd41-8209-5ee0-89de-9a6d43e04a50")) + (wire + (pts (xy 78.74 50.8) (xy 78.74 53.34)) + (stroke (width 0) (type default)) + (uuid "13d1badf-214d-526e-a7ac-7b7f6b03e7e9")) + (label + "3V3" + (at 78.74 53.34 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "54febd7b-2c6a-5fc3-906a-ff0674da1079")) + (wire + (pts (xy 93.98 50.8) (xy 93.98 53.34)) + (stroke (width 0) (type default)) + (uuid "2c8b51e0-9f91-5be0-b96e-ababc0bbfba0")) + (label + "GND" + (at 93.98 53.34 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "84f74f17-12bd-5f50-95fc-e054170d4192")) + (wire + (pts (xy 124.46 50.8) (xy 121.92 50.8)) + (stroke (width 0) (type default)) + (uuid "9c60ae59-67ba-50e4-aa4e-e7f988f8594e")) + (label + "MCU_PWM" + (at 121.92 50.8 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "f160fbc9-1386-51e7-a489-8f1e43de5044")) + (wire + (pts (xy 167.64 64.77) (xy 167.64 67.31)) + (stroke (width 0) (type default)) + (uuid "d05e71db-acce-5f4c-b8f4-02f897c5274e")) + (label + "GND" + (at 167.64 67.31 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "240807ad-5797-5e63-a15c-f96efb31b572")) + (wire + (pts (xy 185.42 55.88) (xy 185.42 58.42)) + (stroke (width 0) (type default)) + (uuid "b4aa4ae4-f3f6-514d-b3a1-ac6eb36d40f4")) + (label + "GND" + (at 185.42 58.42 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "9669a1ae-5f9d-534e-907d-115d0ba80392")) + (wire + (pts (xy 254 60.96) (xy 254 63.5)) + (stroke (width 0) (type default)) + (uuid "a17f4214-d404-57ce-980a-a18c6c4ede49")) + (label + "GND" + (at 254 63.5 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "835210ff-5cc0-5e32-ad94-0ce6f9686682")) + (wire + (pts (xy 330.2 43.18) (xy 332.74 43.18)) + (stroke (width 0) (type default)) + (uuid "1a3998ba-cd26-5a2c-829c-4b5fd0d07cab")) + (label + "3V3" + (at 332.74 43.18 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "f43657eb-73d6-5ede-89f4-456fe2290223")) + (wire + (pts (xy 340.36 82.55) (xy 340.36 85.09)) + (stroke (width 0) (type default)) + (uuid "8ecb2079-2cba-5cc6-8618-1981195a5d34")) + (label + "GND" + (at 340.36 85.09 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "0a7edbd8-4aca-5332-b901-85120cfd4c88")) + (wire + (pts (xy 350.52 60.96) (xy 347.98 60.96)) + (stroke (width 0) (type default)) + (uuid "0b186af4-b1c3-5346-976f-91a697190cdc")) + (label + "GND" + (at 347.98 60.96 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "0818bc51-5258-59dd-833e-ab8501d23eb6")) + (wire + (pts (xy 365.76 60.96) (xy 368.3 60.96)) + (stroke (width 0) (type default)) + (uuid "d3d6fee2-b739-5292-9b52-a488aaa26c55")) + (label + "3V3" + (at 368.3 60.96 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "fa303972-cb23-5ef1-b1bd-701e4bd14df1")) + (wire + (pts (xy 375.92 82.55) (xy 375.92 85.09)) + (stroke (width 0) (type default)) + (uuid "05ad59c7-96c7-5767-b5d0-7a7349116784")) + (label + "GND" + (at 375.92 85.09 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "d4e8c05a-a20a-55af-906a-44718cc34b5c")) + (wire + (pts (xy 386.08 91.44) (xy 386.08 93.98)) + (stroke (width 0) (type default)) + (uuid "771550aa-5a2f-5663-852c-5770a4207bfd")) + (label + "3V3" + (at 386.08 93.98 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "f3e47a1f-175f-524b-b4c7-732b45158c03")) + (wire + (pts (xy 398.78 91.44) (xy 398.78 93.98)) + (stroke (width 0) (type default)) + (uuid "35c35fb8-2f92-52b1-8d17-c235cbaa0a18")) + (label + "GND" + (at 398.78 93.98 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "a1e2a43a-7ea0-59b9-a83e-069745adda9f")) + (wire + (pts (xy 38.1 157.48) (xy 35.56 157.48)) + (stroke (width 0) (type default)) + (uuid "55b06cf5-9fdf-52d3-a438-2eeef50184dd")) + (label + "BENCH_24V" + (at 35.56 157.48 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "4bbe9770-5a1c-55ea-ab01-ab5a65eb7e19")) + (wire + (pts (xy 38.1 160.02) (xy 35.56 160.02)) + (stroke (width 0) (type default)) + (uuid "db2d2653-6bf3-5d6b-adf3-6c0146b05210")) + (label + "BENCH_GND" + (at 35.56 160.02 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "77c08dc7-3b8d-521f-803c-b471bd2aee26")) + (wire + (pts (xy 99.06 184.15) (xy 99.06 186.69)) + (stroke (width 0) (type default)) + (uuid "a22ce4fb-2ef7-59c6-81c9-a6a861367b96")) + (label + "BENCH_GND" + (at 99.06 186.69 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "81ccd6a0-aee0-5eca-a60d-18da02289971")) + (wire + (pts (xy 137.16 168.91) (xy 137.16 171.45)) + (stroke (width 0) (type default)) + (uuid "532724ea-2f23-5f47-ae5c-02c00f0088ea")) + (label + "FAN_GND" + (at 137.16 171.45 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "d0980eaf-e6df-5688-893c-63564628d159")) + (wire + (pts (xy 165.1 165.1) (xy 165.1 167.64)) + (stroke (width 0) (type default)) + (uuid "0507b3b8-808d-507f-a64d-b81327109f17")) + (label + "FAN_GND" + (at 165.1 167.64 270) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "50e81814-55b9-5287-bd2e-7af9213db173")) + (wire + (pts (xy 55.88 198.12) (xy 58.42 198.12)) + (stroke (width 0) (type default)) + (uuid "3651467a-ab17-58c5-8994-5b3ac8c04f7b")) + (label + "FAN_GND" + (at 58.42 198.12 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "a07b6dc5-312a-51fd-8ebf-47e6bb91dec8")) + (wire + (pts (xy 55.88 213.36) (xy 58.42 213.36)) + (stroke (width 0) (type default)) + (uuid "fd1a968e-10bd-525d-a2e0-0c075be4bde6")) + (label + "GND" + (at 58.42 213.36 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "3e767cad-1594-59f2-86ef-48d710dd27ef")) + (wire + (pts (xy 246.38 154.94) (xy 243.84 154.94)) + (stroke (width 0) (type default)) + (uuid "48b69dd9-8780-5453-8056-af2c92fd7697")) + (label + "FAN_24V" + (at 243.84 154.94 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "4382385a-54c6-5953-8785-82909d07e0c0")) + (wire + (pts (xy 246.38 157.48) (xy 243.84 157.48)) + (stroke (width 0) (type default)) + (uuid "51cf7ba1-8e2e-5feb-8ea9-5f85f6fd2d17")) + (label + "FAN_GND" + (at 243.84 157.48 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "e0b58000-e715-5530-bddd-f37450920549")) + (wire + (pts (xy 246.38 160.02) (xy 243.84 160.02)) + (stroke (width 0) (type default)) + (uuid "42f715aa-1ac2-5291-a924-a10882cd43a1")) + (label + "FAN_PWM_RAW" + (at 243.84 160.02 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "fdf3f539-7f36-5322-88a6-f470a3ebd9d8")) + (wire + (pts (xy 246.38 162.56) (xy 243.84 162.56)) + (stroke (width 0) (type default)) + (uuid "58c7e380-3b3b-5a82-aa26-4f8b3d1ed188")) + (label + "FAN_TACH_RAW" + (at 243.84 162.56 180) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right bottom)) + (uuid "6e437389-604c-599d-b396-46de7b8a5170")) + (wire + (pts (xy 134.62 50.8) (xy 144.78 50.8)) + (stroke (width 0) (type default)) + (uuid "6360c556-1e0d-57de-b26f-d454d1acbc33")) + (wire + (pts (xy 144.78 50.8) (xy 148.59 50.8)) + (stroke (width 0) (type default)) + (uuid "bfe8956a-382c-5ca7-8e14-408fdd2bd244")) + (wire + (pts (xy 144.78 43.18) (xy 144.78 50.8)) + (stroke (width 0) (type default)) + (uuid "5e4e831f-e0b2-5361-a7cd-dab36e7f0b2c")) + (wire + (pts (xy 156.21 50.8) (xy 167.64 50.8)) + (stroke (width 0) (type default)) + (uuid "5ca3fd25-ba0d-5bfc-a250-04642cd8aa21")) + (wire + (pts (xy 167.64 50.8) (xy 172.72 50.8)) + (stroke (width 0) (type default)) + (uuid "e1b0d3dc-306f-5630-b4de-2f58ac1a3e67")) + (wire + (pts (xy 172.72 50.8) (xy 177.8 50.8)) + (stroke (width 0) (type default)) + (uuid "11967f44-595b-5bf9-be46-83f0102c2e7e")) + (wire + (pts (xy 167.64 57.15) (xy 167.64 50.8)) + (stroke (width 0) (type default)) + (uuid "86df1ddc-9f96-5348-9cc2-b36a94bde6d1")) + (wire + (pts (xy 172.72 43.18) (xy 172.72 50.8)) + (stroke (width 0) (type default)) + (uuid "155e30ba-cabe-58f9-847b-82749fc3f79d")) + (wire + (pts (xy 185.42 45.72) (xy 185.42 38.1)) + (stroke (width 0) (type default)) + (uuid "281f3395-b97e-560b-82e2-e11eda3cad59")) + (wire + (pts (xy 185.42 38.1) (xy 208.28 38.1)) + (stroke (width 0) (type default)) + (uuid "8d0c6705-1d7c-5133-8fc5-ff157d80cde4")) + (wire + (pts (xy 208.28 38.1) (xy 215.9 38.1)) + (stroke (width 0) (type default)) + (uuid "c169c215-a6cf-5003-8ea0-9847b7d5a873")) + (wire + (pts (xy 208.28 30.48) (xy 208.28 38.1)) + (stroke (width 0) (type default)) + (uuid "2218581a-41ea-5e23-8865-6d314744d815")) + (wire + (pts (xy 226.06 38.1) (xy 233.68 38.1)) + (stroke (width 0) (type default)) + (uuid "a6e2a771-e58e-5f6f-9c5f-294aedb9ce41")) + (wire + (pts (xy 233.68 38.1) (xy 243.84 38.1)) + (stroke (width 0) (type default)) + (uuid "26c2d1a3-08c8-582f-a0d9-7da5888228a1")) + (wire + (pts (xy 233.68 30.48) (xy 233.68 38.1)) + (stroke (width 0) (type default)) + (uuid "91e7c8a0-4169-5aaf-906f-61eb9129cf06")) + (wire + (pts (xy 276.86 55.88) (xy 287.02 55.88)) + (stroke (width 0) (type default)) + (uuid "f1c0c1d6-dd4e-57f1-9582-a247e663da31")) + (wire + (pts (xy 287.02 55.88) (xy 294.64 55.88)) + (stroke (width 0) (type default)) + (uuid "445924fc-a1f6-53f7-b50e-e9cbd9a590c9")) + (wire + (pts (xy 294.64 43.18) (xy 294.64 55.88)) + (stroke (width 0) (type default)) + (uuid "58e23606-8d98-53ad-97f0-d6266a63ef4f")) + (wire + (pts (xy 294.64 55.88) (xy 294.64 68.58)) + (stroke (width 0) (type default)) + (uuid "d8239363-1705-5032-a874-0193eb020960")) + (wire + (pts (xy 294.64 43.18) (xy 299.72 43.18)) + (stroke (width 0) (type default)) + (uuid "099bae97-624f-52a6-9623-d6e83cb17115")) + (wire + (pts (xy 294.64 68.58) (xy 299.72 68.58)) + (stroke (width 0) (type default)) + (uuid "9f3261eb-4af2-5882-9543-8989051715ef")) + (wire + (pts (xy 287.02 63.5) (xy 287.02 55.88)) + (stroke (width 0) (type default)) + (uuid "d2a2871e-9c7b-519b-bc08-abc3b7fbbd42")) + (wire + (pts (xy 309.88 43.18) (xy 322.58 43.18)) + (stroke (width 0) (type default)) + (uuid "3ed83ce4-d82c-5e95-9846-de57ae8e9216")) + (wire + (pts (xy 309.88 68.58) (xy 322.58 68.58)) + (stroke (width 0) (type default)) + (uuid "d0105362-7f07-5451-87e0-af9b7b335c18")) + (wire + (pts (xy 330.2 68.58) (xy 340.36 68.58)) + (stroke (width 0) (type default)) + (uuid "941cf1f4-3247-5891-af1c-565945a684c1")) + (wire + (pts (xy 340.36 68.58) (xy 358.14 68.58)) + (stroke (width 0) (type default)) + (uuid "e4e6c24a-81fe-55e9-88a3-a3811cec5fa9")) + (wire + (pts (xy 358.14 68.58) (xy 375.92 68.58)) + (stroke (width 0) (type default)) + (uuid "bcac0b5e-cf96-5cef-b683-a045be3037e4")) + (wire + (pts (xy 375.92 68.58) (xy 386.08 68.58)) + (stroke (width 0) (type default)) + (uuid "d2d6c66e-5b14-5908-86c0-2aa788c01129")) + (wire + (pts (xy 386.08 68.58) (xy 391.16 68.58)) + (stroke (width 0) (type default)) + (uuid "db72d13f-ce1c-5067-a941-59d398dc7159")) + (wire + (pts (xy 340.36 74.93) (xy 340.36 68.58)) + (stroke (width 0) (type default)) + (uuid "d1fb730f-00f6-583b-8fba-e0135addd825")) + (wire + (pts (xy 358.14 66.04) (xy 358.14 68.58)) + (stroke (width 0) (type default)) + (uuid "d6d79fbb-cdf8-5ca9-ba8b-70a10835212a")) + (wire + (pts (xy 375.92 74.93) (xy 375.92 68.58)) + (stroke (width 0) (type default)) + (uuid "0be7282a-6c7f-5995-98b0-6cfaddf7089c")) + (wire + (pts (xy 386.08 60.96) (xy 386.08 68.58)) + (stroke (width 0) (type default)) + (uuid "95a960bf-eec0-5c85-a053-1022e41f0aec")) + (wire + (pts (xy 50.8 154.94) (xy 66.04 154.94)) + (stroke (width 0) (type default)) + (uuid "bfb48ce8-ed8c-5ea7-860d-809d42894f4a")) + (wire + (pts (xy 66.04 154.94) (xy 72.39 154.94)) + (stroke (width 0) (type default)) + (uuid "fdc452f8-fe92-5245-892e-006508491a03")) + (wire + (pts (xy 66.04 147.32) (xy 66.04 154.94)) + (stroke (width 0) (type default)) + (uuid "9f530a1a-7f95-534c-a179-c00415c8739c")) + (wire + (pts (xy 80.01 154.94) (xy 99.06 154.94)) + (stroke (width 0) (type default)) + (uuid "3d9dcc58-774c-591b-9c8c-cc940bcdde3f")) + (wire + (pts (xy 99.06 154.94) (xy 106.68 154.94)) + (stroke (width 0) (type default)) + (uuid "8b8da78c-b355-54c5-947f-f15724ecee29")) + (wire + (pts (xy 99.06 161.29) (xy 99.06 154.94)) + (stroke (width 0) (type default)) + (uuid "cb7ca8a5-d5b6-5f98-bd38-bf7fb4d47553")) + (wire + (pts (xy 99.06 168.91) (xy 99.06 176.53)) + (stroke (width 0) (type default)) + (uuid "605f4eb1-2b5c-52b8-821e-c3d797c6edda")) + (wire + (pts (xy 116.84 154.94) (xy 124.46 154.94)) + (stroke (width 0) (type default)) + (uuid "0d423abc-5726-5ca0-b9f7-d44a1e52359f")) + (wire + (pts (xy 124.46 154.94) (xy 137.16 154.94)) + (stroke (width 0) (type default)) + (uuid "c505d4ce-46e5-508c-b4f0-3af856b5da0b")) + (wire + (pts (xy 137.16 154.94) (xy 152.4 154.94)) + (stroke (width 0) (type default)) + (uuid "0cd389b3-0d23-5ff2-808d-3cb0d19a5978")) + (wire + (pts (xy 124.46 147.32) (xy 124.46 154.94)) + (stroke (width 0) (type default)) + (uuid "c14ab4e7-196c-58ff-814b-162a0d0631cc")) + (wire + (pts (xy 137.16 161.29) (xy 137.16 154.94)) + (stroke (width 0) (type default)) + (uuid "751d8996-a087-54fc-bb8a-6563e3d8c01f")) + (wire + (pts (xy 30.48 205.74) (xy 43.18 205.74)) + (stroke (width 0) (type default)) + (uuid "3ec2561e-ac3a-59af-ab34-21be58a0746e")) + (wire + (pts (xy 43.18 198.12) (xy 43.18 205.74)) + (stroke (width 0) (type default)) + (uuid "9310010a-4a17-5219-a9f7-205a55c01588")) + (wire + (pts (xy 43.18 205.74) (xy 43.18 213.36)) + (stroke (width 0) (type default)) + (uuid "0b5cc576-aeaa-52c3-8999-d008ff993058")) + (wire + (pts (xy 43.18 198.12) (xy 50.8 198.12)) + (stroke (width 0) (type default)) + (uuid "9396c3ef-3e88-5952-91d8-7b048b75136f")) + (wire + (pts (xy 43.18 213.36) (xy 50.8 213.36)) + (stroke (width 0) (type default)) + (uuid "aa544eb5-c038-5107-bfc5-8b6d1bd1f2e6")) + (junction + (at 144.78 50.8) + (diameter 0) + (color 0 0 0 0) + (uuid "05e080e1-3b1f-520d-9302-d75b1aa0e528")) + (junction + (at 167.64 50.8) + (diameter 0) + (color 0 0 0 0) + (uuid "a4d49b08-52b0-5ad4-914d-669487be7a58")) + (junction + (at 172.72 50.8) + (diameter 0) + (color 0 0 0 0) + (uuid "770700bd-7ebc-5145-9a08-0bc48133e878")) + (junction + (at 208.28 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "42afd080-6caf-5d13-9d36-d58f212207e0")) + (junction + (at 233.68 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "66b96962-3448-5244-b2a5-975718b453bc")) + (junction + (at 294.64 55.88) + (diameter 0) + (color 0 0 0 0) + (uuid "fe990034-034a-5fa0-a2ff-2d85ab2484d9")) + (junction + (at 287.02 55.88) + (diameter 0) + (color 0 0 0 0) + (uuid "610a50a5-b039-5094-a197-d6f268a3e1b0")) + (junction + (at 340.36 68.58) + (diameter 0) + (color 0 0 0 0) + (uuid "51221f44-1afe-5283-96ac-b2d608bf6918")) + (junction + (at 358.14 68.58) + (diameter 0) + (color 0 0 0 0) + (uuid "61f2b328-8eae-534d-afa3-2e4d8d5b1548")) + (junction + (at 375.92 68.58) + (diameter 0) + (color 0 0 0 0) + (uuid "017ee773-e2f2-50e3-9ecc-857afbe4e093")) + (junction + (at 386.08 68.58) + (diameter 0) + (color 0 0 0 0) + (uuid "aad47119-3961-52f6-9cd9-dfdd6d08cfa8")) + (junction + (at 66.04 154.94) + (diameter 0) + (color 0 0 0 0) + (uuid "aaec5fe6-0ebf-5524-b371-7d0041d57064")) + (junction + (at 99.06 154.94) + (diameter 0) + (color 0 0 0 0) + (uuid "1070fc42-f85b-59be-9d5a-551508b69930")) + (junction + (at 124.46 154.94) + (diameter 0) + (color 0 0 0 0) + (uuid "2e6c6c86-6f2c-5efa-8a15-5a2861ca3e21")) + (junction + (at 137.16 154.94) + (diameter 0) + (color 0 0 0 0) + (uuid "76912324-0994-595d-94a7-2265f509eb90")) + (junction + (at 43.18 205.74) + (diameter 0) + (color 0 0 0 0) + (uuid "86643e9b-89eb-5231-b626-d232f0eb3258")) + (label + "PWM_IN" + (at 135.89 50.8 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "36fc6162-0bf9-5817-8227-aa6fd3831e5f")) + (label + "PWM_GATE" + (at 157.48 50.8 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "ba6ba88f-3678-5d30-ae3f-680b47658972")) + (label + "PWM_DRAIN" + (at 186.69 38.1 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "b8fd648c-4efa-50ed-99dc-71946c117c52")) + (label + "FAN_PWM_RAW" + (at 243.84 38.1 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "cdfe4676-58f1-5ead-bb9b-9640a5fcf2a7")) + (label + "FAN_TACH_RAW" + (at 276.86 55.88 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "afdd4826-9631-5705-93c7-7de00009b979")) + (label + "TACH_PU" + (at 311.15 43.18 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "cb2bc870-2fcd-50d0-95e1-e697ad2425d9")) + (label + "TACH_SER" + (at 311.15 68.58 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "b85d2945-cbb4-5029-bf16-606f522ea398")) + (label + "TACH_GPIO" + (at 391.16 68.58 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "9722bf88-b245-515f-8d51-4ce28aa56c08")) + (label + "BENCH_24V" + (at 50.8 154.94 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "a67162e3-afb3-5825-a096-8db8af1cb792")) + (label + "24V_FUSED" + (at 81.28 154.94 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "703aea90-884a-5fb0-92da-343b01bd1f30")) + (label + "LED_A" + (at 99.06 172.72 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "43c2943b-48fe-532b-a6b8-38c992cd8c58")) + (label + "FAN_24V" + (at 152.4 154.94 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "3813cf6d-6251-5114-b58f-3c9a30fe2d84")) + (label + "BENCH_GND" + (at 30.48 205.74 0) + (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid "533f557c-4ab2-5511-bc88-69fe33ecc505")) + (rectangle + (start 15.24 20.32) + (end 106.68 124.46) + (stroke (width 0.254) (type dash)) + (fill (type none)) + (uuid "78512e2a-e135-5c6a-824d-8f87cdf554a1")) + (text + "1. MCU / DragonBench interface" + (at 16.51 21.59 0) + (effects (font (size 1.8 1.8) bold) (justify left top)) + (uuid "86065258-a0e5-562c-822d-acec861ea3ff")) + (rectangle + (start 111.76 20.32) + (end 266.7 124.46) + (stroke (width 0.254) (type dash)) + (fill (type none)) + (uuid "12ab47ca-f992-521e-9bb2-9ced3a7d0065")) + (text + "2. PWM open-drain driver" + (at 113.03 21.59 0) + (effects (font (size 1.8 1.8) bold) (justify left top)) + (uuid "c26539c5-f046-5418-8e3d-98f55eb8efd8")) + (rectangle + (start 271.78 20.32) + (end 406.4 124.46) + (stroke (width 0.254) (type dash)) + (fill (type none)) + (uuid "121d994d-ce2c-509c-b973-f866055eec1b")) + (text + "3. Tach input / conditioning" + (at 273.05 21.59 0) + (effects (font (size 1.8 1.8) bold) (justify left top)) + (uuid "f58480f0-2cd8-5544-8875-664322381a95")) + (rectangle + (start 15.24 132.08) + (end 213.36 248.92) + (stroke (width 0.254) (type dash)) + (fill (type none)) + (uuid "cebadaf1-0dc0-5365-9b4e-5167e1f6909f")) + (text + "4. 24 V fan supply and ground topology" + (at 16.51 133.35 0) + (effects (font (size 1.8 1.8) bold) (justify left top)) + (uuid "6158755b-261c-5efc-82cb-1bf9fdd9635e")) + (rectangle + (start 218.44 132.08) + (end 289.56 248.92) + (stroke (width 0.254) (type dash)) + (fill (type none)) + (uuid "932efa88-2819-5579-aa40-115918dd0ba0")) + (text + "5. Fan connector" + (at 219.71 133.35 0) + (effects (font (size 1.8 1.8) bold) (justify left top)) + (uuid "26879b89-f201-5b2c-a3e1-484b60ea6116")) + (rectangle + (start 294.64 132.08) + (end 406.4 248.92) + (stroke (width 0.254) (type dash)) + (fill (type none)) + (uuid "a2a355b6-570f-5ea9-b052-47930ca12e31")) + (text + "6. Test points / configuration jumpers" + (at 295.91 133.35 0) + (effects (font (size 1.8 1.8) bold) (justify left top)) + (uuid "da2c1947-b1fb-51d1-8701-ead1f56e7cda")) + (text + "Controller-agnostic link. Board wiring is a LOCAL overlay.\nN16R8 Rev 0 bench overlay (provisional, NOT JumpJet GPIOs):\n J1.1 MCU_PWM <- GPIO6\n J1.2 TACH_GPIO -> GPIO7\n J1.3 3V3 <- board 3V3 (never 5V)\n J1.4 GND <- board GND\nsdkconfig.fan-characterization.local:\n CONFIG_DB_FAN_PWM_GATE_GPIO=6\n CONFIG_DB_FAN_GATE_SINK_LEVEL=1\n CONFIG_DB_FAN_TACH_GPIO=7\nTinyS3[D]: same J1 functions, own overlay.\nController terminals are passive: no protection assumed." + (at 19.05 78.74 0) + (effects (font (size 1.27 1.27)) (justify left top)) + (uuid "1f62a043-3aa5-5f24-a714-1d51354dadeb")) + (text + "Q1 non-inverting: gate HIGH = sink => CONFIG_DB_FAN_GATE_SINK_LEVEL=1. sink_duty_pct = Q1 on-time.\nFan control input, 9GA0424P3J001 drawing Rev C: 25 kHz specified; open-collector/open-drain drive OK;\n control open = same speed as 100 %; 0 % = stopped; open voltage <= 5.25 V; source <= 2 mA at 0 V; VIL <= 0.4 V.\nQ1 NTR4003NT1G is a signal-interface FET here: normal stress VDS <= 5.25 V, ID <= 2 mA.\n Low level at 2 mA: 2 mA x 2.0 ohm (RDS(on) max, VGS 2.5 V) = 4 mV, << 0.4 V.\nR1 220R: gate charge current <= 3.3/220 = 15 mA peak; RC < 25 ns even at 100 pF, vs 20 us half-period.\n Driven gate = VOH x 10k/10.22k = 3.23 V at 3.3 V (2.94 V at a 3.0 V rail): above the 2.5 V RDS(on) row.\nR2 10k: GPIO6 undriven -> gate = IGSS x 10k (<= 0.1 V at 10 uA, assumed). Reset/flash state unproven: check TP4.\nNOT rated for FAN_PWM_RAW landed on FAN_24V: verify lead identity before landing (BRINGUP step 2).\nNo RC filter and no fixture pull-up on FAN_PWM_RAW. JP2 open = line fully released for open-line tests." + (at 116.84 86.36 0) + (effects (font (size 1.27 1.27)) (justify left top)) + (uuid "03081c9f-7a63-592d-a9eb-181d2c53f76e")) + (text + "Sensor, Sanyo spec 9D0001H202: open collector,\n VCE <= 27.6 V, IC <= 5 mA, VCE(sat) <= 0.8 V.\n Spec suggests 2 pulses/rev; configured PPR stays 0\n (unknown) until an optical RPM check on the specimen.\nDefault JP3 OPEN, JP4 OPEN: raw tach sees only TP8.\nJP3: R3 10k to 3V3 -> 0.33 mA sink (IC max 5 mA).\nJP4: R4 22k, D1 clamp, R5 470k. High ~3.09 V (VIH\n 2.475 V); low <= 0.76 V at VCE(sat) 0.8 V (VIL 0.825 V).\nBack-power if the tach lead is faulted to 26.4 V:\n R4/D1 <= 1.2 mA, R3 (JP3) <= 2.7 mA into 3V3.\nRULE: controller 3V3 ON before JP3/JP4 close; keep it\n on until fan power is off or JP3/JP4 are open.\nC2 DNP (no glitch filter). Internal pull-up stays OFF." + (at 275.59 86.36 0) + (effects (font (size 1.27 1.27)) (justify left top)) + (uuid "dd407949-ede8-5e5e-98c7-ff1fdef58ab2")) + (text + "Ground topology: single star point at J2.2 through NT1/NT2.\n FAN_GND: fan supply return only. GND: Q1 source, tach clamp/pulldowns, J1.4, scope ground.\n Fan motor current never flows in GND; the <= 2 mA PWM and tach currents return through the star.\n Controller USB ground meets the PSU negative ONLY here: use a floating PSU output.\nF1: 5x20 holder; rating TBD until startup/locked-rotor current is measured. The bench PSU current\n limit is the first protection during characterization (holder may carry a labelled 0R link).\nJP5 I_MEAS: remove link to insert an ammeter. D2/R6 (~2.2 mA) sit upstream of JP5.\nNo reverse-polarity element: confirm polarity at TP12 before landing the fan. C1 DNP." + (at 19.05 226.06 0) + (effects (font (size 1.27 1.27)) (justify left top)) + (uuid "25cd6c35-987c-5443-ba9a-d1dab7bd1137")) + (text + "J3 positions are fixture functions,\nnot the fan's physical wire order.\nLand each lead only after it is\nidentified on the specimen by\nphoto + continuity + manufacturer\ndocumentation.\nCatalog convention / not yet\nverified on specimen:\n red +, black -, brown PWM,\n yellow sensor." + (at 222.25 187.96 0) + (effects (font (size 1.27 1.27)) (justify left top)) + (uuid "6cd557a6-7478-5bc0-ac52-fe478a5dba51")) + (text + "Jumpers (Rev 0 shipping state)\nJP1 GATE_EN OPEN MCU_PWM -> R1/Q1 gate\nJP2 PWM_LINE_EN OPEN Q1 drain -> FAN_PWM_RAW\nJP3 TACH_PU_EN OPEN R3 3V3 pull-up on raw tach\nJP4 TACH_GPIO_EN OPEN raw tach -> R4/D1/R5 -> GPIO\nJP5 I_MEAS FITTED 24V_FUSED -> FAN_24V\n\nTest points\nTP12 BENCH_24V TP13 FAN_24V TP14 FAN_GND\nTP1, TP10 3V3 TP2, TP7, TP11 GND\nTP3 PWM_IN (signal-generator injection with JP1 open)\nTP4 PWM_GATE TP5 PWM_DRAIN TP6 FAN_PWM_RAW\nTP8 FAN_TACH_RAW TP9 TACH_GPIO\n\n25 kHz is the manufacturer-specified control frequency\nfor 9GA0424P3J001; bench characterization still\nverifies specimen behaviour. Configured PPR = 0 (unknown).\nNot defined here: JumpJet GPIOs, thresholds, startup\nduty, stall limits, fan-safety policy." + (at 298.45 140.97 0) + (effects (font (size 1.27 1.27)) (justify left top)) + (uuid "1ce7477f-0728-599c-9144-95bbc3c3d89e")) + (symbol + (lib_id "Connector:Screw_Terminal_01x04") + (at 45.72 55.88 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "58014179-ab32-5fde-b25d-d46ad16835d5") + (property "Reference" "J1" (at 43.18 49.53 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "MCU_IF" (at 43.18 67.31 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-4-5.08_1x04_P5.08mm_Horizontal" + (at 45.72 55.88 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 45.72 55.88 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 45.72 55.88 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Controller link. Pin 1 MCU_PWM (out), 2 TACH_GPIO (in), 3 3V3 from controller, 4 GND" + (at 45.72 55.88 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "4057427a-448a-5be6-ad44-0c6323568af8")) + (pin "2" (uuid "d73f9d24-88d3-547f-8718-36b4bbc4edcc")) + (pin "3" (uuid "9ef15d10-781f-58ba-9b13-fad1694aca82")) + (pin "4" (uuid "e622feba-a6c7-5bff-b004-7273c6acb2e9")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "J1") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 78.74 50.8 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "baf7cb10-c19f-5236-8d4e-5b09c797d62c") + (property "Reference" "TP1" (at 80.01 47.625 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "3V3" (at 78.74 50.8 0) (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 78.74 50.8 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 78.74 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 78.74 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property "Function" "Test point 3V3" (at 78.74 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "f9e5bb03-9328-5e8d-afad-bd68b2f238dc")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP1") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 93.98 50.8 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0a020483-d842-5979-9f37-bbbf52b8848a") + (property "Reference" "TP2" (at 95.25 47.625 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "GND" (at 93.98 50.8 0) (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 93.98 50.8 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 93.98 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 93.98 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property "Function" "Test point GND" (at 93.98 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "d9b07c5e-7e75-55cd-b5ad-6adcb16f0ef0")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP2") (unit 1))))) + (symbol + (lib_id "Jumper:Jumper_2_Open") + (at 129.54 50.8 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7a714b5f-7d32-515a-8d1f-d40f63e711e6") + (property "Reference" "JP1" (at 129.54 45.72 0) (effects (font (size 1.27 1.27)))) + (property "Value" "GATE_EN" (at 129.54 54.61 0) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 129.54 50.8 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 129.54 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 129.54 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Open: controller disconnected from gate; PWM_IN free for a signal generator" + (at 129.54 50.8 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Default" "OPEN" (at 129.54 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "faabac08-8f67-50d4-9bb5-c2ed9df2403b")) + (pin "2" (uuid "d17a88fa-8a34-5237-801a-15db468032d3")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "JP1") (unit 1))))) + (symbol + (lib_id "Device:R") + (at 152.4 50.8 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a17676a9-8ea2-5ac9-80b5-e6d74c9a8748") + (property "Reference" "R1" (at 152.4 48.26 90) (effects (font (size 1.27 1.27)))) + (property "Value" "220R" (at 152.4 53.34 90) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Resistor_SMD:R_0805_2012Metric" + (at 152.4 50.8 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 152.4 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 152.4 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Gate series resistor" + (at 152.4 50.8 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "26aac648-2dc3-5c75-b425-1c7bc9756211")) + (pin "2" (uuid "23a0f207-bfa7-5fc2-9f06-ca2b2449e5c8")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "R1") (unit 1))))) + (symbol + (lib_id "Device:R") + (at 167.64 60.96 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "19b73542-3c8c-5eca-b189-e856d8fafb77") + (property "Reference" "R2" (at 170.18 59.69 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "10k" (at 170.18 62.23 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "Resistor_SMD:R_0805_2012Metric" + (at 167.64 60.96 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 167.64 60.96 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 167.64 60.96 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Gate pulldown: Q1 OFF whenever the gate is not actively driven high" + (at 167.64 60.96 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "77875bc8-d5e7-5fa0-9481-7407cba72d65")) + (pin "2" (uuid "e7454a2e-b364-55d3-a10a-b7a4a63b7469")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "R2") (unit 1))))) + (symbol + (lib_id "Transistor_FET:Q_NMOS_GSD") + (at 182.88 50.8 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8473c55f-66f7-5816-834a-391f8fde8140") + (property "Reference" "Q1" (at 187.96 49.53 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "NTR4003NT1G" + (at 187.96 52.07 0) + (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "Package_TO_SOT_SMD:SOT-23" + (at 182.88 50.8 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 182.88 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 182.88 50.8 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Signal-interface open-drain sink for the fan control input; VDS <= 5.25 V, ID <= 2 mA in normal use" + (at 182.88 50.8 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "bcfe8768-b382-564c-8b8a-142f2b475b2d")) + (pin "3" (uuid "c6ee80c3-87d4-5a1b-971b-f016798a117b")) + (pin "2" (uuid "cc97a263-33f5-5603-a3bd-b6a8b4416053")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "Q1") (unit 1))))) + (symbol + (lib_id "Jumper:Jumper_2_Open") + (at 220.98 38.1 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0b39f9af-2d29-5d81-96d9-64e050b62b47") + (property "Reference" "JP2" (at 220.98 33.02 0) (effects (font (size 1.27 1.27)))) + (property "Value" "PWM_LINE_EN" (at 220.98 41.91 0) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 220.98 38.1 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 220.98 38.1 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 220.98 38.1 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Open: fan PWM line carries no fixture load at all" + (at 220.98 38.1 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Default" "OPEN" (at 220.98 38.1 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "a128adf9-e8c2-5e74-808a-a95d574e8a41")) + (pin "2" (uuid "dc3f51f5-90b8-5262-a358-e49162622455")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "JP2") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 144.78 43.18 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "51b62456-2264-51ca-9ac0-e65f24ff7352") + (property "Reference" "TP3" (at 146.05 40.005 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "PWM_IN" + (at 144.78 43.18 0) + (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 144.78 43.18 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 144.78 43.18 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 144.78 43.18 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Test point PWM_IN" + (at 144.78 43.18 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "9cfee3ba-b7af-5302-921b-52bf193539a8")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP3") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 172.72 43.18 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6b7df92e-1631-530b-a161-78e569c2bca0") + (property "Reference" "TP4" (at 173.99 40.005 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "PWM_GATE" + (at 172.72 43.18 0) + (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 172.72 43.18 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 172.72 43.18 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 172.72 43.18 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Test point PWM_GATE" + (at 172.72 43.18 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "ed7a66a2-0234-5b85-8a6a-6f7a04ef526b")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP4") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 208.28 30.48 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2aae5f40-9032-5ea7-b1d4-dfa92214b5cf") + (property "Reference" "TP5" (at 209.55 27.305 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "PWM_DRAIN" + (at 208.28 30.48 0) + (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 208.28 30.48 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 208.28 30.48 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 208.28 30.48 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Test point PWM_DRAIN" + (at 208.28 30.48 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "e3c84b28-97ea-5d41-a6c6-c734b9382914")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP5") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 233.68 30.48 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3dbe44ea-393b-50f9-abd5-ebd27d65a3d4") + (property "Reference" "TP6" (at 234.95 27.305 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "FAN_PWM_RAW" + (at 233.68 30.48 0) + (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 233.68 30.48 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 233.68 30.48 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 233.68 30.48 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Test point FAN_PWM_RAW" + (at 233.68 30.48 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "0e37a978-0999-5817-b625-eb4d5adda7c0")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP6") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 254 60.96 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8f7ab7af-e077-5704-b7c2-e6ef6bc171a4") + (property "Reference" "TP7" (at 255.27 57.785 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "GND" (at 254 60.96 0) (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 254 60.96 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 254 60.96 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 254 60.96 0) (effects (font (size 1.27 1.27)) hide)) + (property "Function" "Test point GND" (at 254 60.96 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "65ff83a9-aa82-5545-a0b9-3261cad47d00")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP7") (unit 1))))) + (symbol + (lib_id "Jumper:Jumper_2_Open") + (at 304.8 43.18 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "95d38fa7-b904-5cc9-8e81-270df6652796") + (property "Reference" "JP3" (at 304.8 38.1 0) (effects (font (size 1.27 1.27)))) + (property "Value" "TACH_PU_EN" (at 304.8 46.99 0) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 304.8 43.18 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 304.8 43.18 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 304.8 43.18 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Closed: R3 pulls raw tach to 3V3" + (at 304.8 43.18 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Default" "OPEN" (at 304.8 43.18 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "f8e4ef74-270e-503f-bd5e-ad815d10fd14")) + (pin "2" (uuid "09732047-7ccf-56ab-94ff-eb143c5b1d1e")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "JP3") (unit 1))))) + (symbol + (lib_id "Device:R") + (at 326.39 43.18 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6b090135-fdd3-5d76-89d2-a397efdcebb2") + (property "Reference" "R3" (at 326.39 40.64 90) (effects (font (size 1.27 1.27)))) + (property "Value" "10k" (at 326.39 45.72 90) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Resistor_SMD:R_0805_2012Metric" + (at 326.39 43.18 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 326.39 43.18 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 326.39 43.18 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "External tach pull-up to 3V3 (0.33 mA vs 5 mA IC max)" + (at 326.39 43.18 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "a3558ae4-1b31-533b-8e6f-279009de41db")) + (pin "2" (uuid "5ef882b4-3c98-5dd4-abb4-b77398ebccdb")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "R3") (unit 1))))) + (symbol + (lib_id "Jumper:Jumper_2_Open") + (at 304.8 68.58 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "eca214bb-30f9-568a-a357-344367fe26f8") + (property "Reference" "JP4" (at 304.8 63.5 0) (effects (font (size 1.27 1.27)))) + (property "Value" "TACH_GPIO_EN" (at 304.8 72.39 0) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 304.8 68.58 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 304.8 68.58 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 304.8 68.58 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Open: raw tach isolated from R4/D1/R5 and the GPIO" + (at 304.8 68.58 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Default" "OPEN" (at 304.8 68.58 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "4f5e1230-b064-56ca-829b-9bf853e6533b")) + (pin "2" (uuid "2b8cab68-350e-51a8-8a66-78b950355eb6")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "JP4") (unit 1))))) + (symbol + (lib_id "Device:R") + (at 326.39 68.58 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ea23a7dd-5795-5771-b0e9-e72c96075ead") + (property "Reference" "R4" (at 326.39 66.04 90) (effects (font (size 1.27 1.27)))) + (property "Value" "22k" (at 326.39 71.12 90) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Resistor_SMD:R_0805_2012Metric" + (at 326.39 68.58 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 326.39 68.58 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 326.39 68.58 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Series protection: limits clamp/back-power current to ~1.2 mA at 26.4 V" + (at 326.39 68.58 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "ad125f81-825d-5350-865c-529088783c98")) + (pin "2" (uuid "02529255-6511-52ab-8599-6b3846f24122")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "R4") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 287.02 63.5 180) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6e2de640-8c82-53a6-8f87-d8180c7a8dd9") + (property "Reference" "TP8" (at 290.195 67.945 0) (effects (font (size 1.27 1.27)))) + (property "Value" "FAN_TACH_RAW" (at 287.02 63.5 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 287.02 63.5 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 287.02 63.5 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 287.02 63.5 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Test point FAN_TACH_RAW" + (at 287.02 63.5 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "4d597e07-d81e-52fc-93fa-5e831980f0ab")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP8") (unit 1))))) + (symbol + (lib_id "Device:R") + (at 340.36 78.74 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e9dd1c45-a655-5746-8591-818dd221e510") + (property "Reference" "R5" (at 342.9 77.47 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "470k" (at 342.9 80.01 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "Resistor_SMD:R_0805_2012Metric" + (at 340.36 78.74 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 340.36 78.74 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 340.36 78.74 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Holds TACH_GPIO low when JP4 is open" + (at 340.36 78.74 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "ef58d0e3-2de0-5b0a-a036-95abe750cea3")) + (pin "2" (uuid "627ba648-35b7-5b37-8bca-bebf54640a25")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "R5") (unit 1))))) + (symbol + (lib_id "Diode:BAT54S") + (at 358.14 60.96 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a2bb8f69-12fe-50fa-9747-28a02b682306") + (property "Reference" "D1" (at 358.14 53.34 0) (effects (font (size 1.27 1.27)))) + (property "Value" "BAT54S" (at 358.14 55.88 0) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Package_TO_SOT_SMD:SOT-23" + (at 358.14 60.96 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 358.14 60.96 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 358.14 60.96 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Schottky clamp of TACH_GPIO to GND and 3V3" + (at 358.14 60.96 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "8eeb08c7-b890-5efb-9b9f-63b27954db31")) + (pin "3" (uuid "fd338d0b-ad43-5122-a73b-a9240e176f3b")) + (pin "2" (uuid "dcba9f22-6442-519e-b66c-40eda6246c10")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "D1") (unit 1))))) + (symbol + (lib_id "Device:C") + (at 375.92 78.74 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "aef61e7f-cc5e-52cd-ab21-4d07369f4cd3") + (property "Reference" "C2" (at 378.46 77.47 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "DNP" (at 378.46 80.01 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "Capacitor_SMD:C_0805_2012Metric" + (at 375.92 78.74 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 375.92 78.74 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "DNP/TBD" (at 375.92 78.74 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Footprint only for a later glitch filter; value from scope data" + (at 375.92 78.74 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "4cc8435c-6d05-56c0-a8cd-a1857f019745")) + (pin "2" (uuid "87829c1a-6497-52f1-837d-d0900d9483b0")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "C2") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 386.08 60.96 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a40f6c5f-c4d8-54cf-b212-1ead56eb35f7") + (property "Reference" "TP9" (at 387.35 57.785 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "TACH_GPIO" + (at 386.08 60.96 0) + (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 386.08 60.96 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 386.08 60.96 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 386.08 60.96 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Test point TACH_GPIO" + (at 386.08 60.96 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "7523879f-9a70-50db-87c8-2fcfdfbec11c")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP9") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 386.08 91.44 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4389bbd6-1d9b-543c-b781-a6d12fbd9326") + (property "Reference" "TP10" (at 387.35 88.265 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "3V3" (at 386.08 91.44 0) (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 386.08 91.44 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 386.08 91.44 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 386.08 91.44 0) (effects (font (size 1.27 1.27)) hide)) + (property "Function" "Test point 3V3" (at 386.08 91.44 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "012c19a3-6328-5c25-9d75-0c3d2f999fc7")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP10") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 398.78 91.44 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d9ca34ba-eb68-5685-aec7-92b4c0f24bc6") + (property "Reference" "TP11" (at 400.05 88.265 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "GND" (at 398.78 91.44 0) (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 398.78 91.44 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 398.78 91.44 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 398.78 91.44 0) (effects (font (size 1.27 1.27)) hide)) + (property "Function" "Test point GND" (at 398.78 91.44 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "cbeea541-a50c-5792-8bdd-73c347e07f58")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP11") (unit 1))))) + (symbol + (lib_id "Connector:Screw_Terminal_01x02") + (at 43.18 157.48 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "df61572d-a88c-5045-a8af-9d7b74ec9861") + (property "Reference" "J2" (at 40.64 151.13 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "BENCH_PSU" (at 40.64 163.83 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2-5.08_1x02_P5.08mm_Horizontal" + (at 43.18 157.48 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 43.18 157.48 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 43.18 157.48 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Current-limited 24 V bench supply. Pin 1 BENCH_24V, pin 2 BENCH_GND" + (at 43.18 157.48 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "54c36625-caff-55db-b9bc-50d4990934a3")) + (pin "2" (uuid "4d2b7908-a437-568e-ae0d-1611b1196acb")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "J2") (unit 1))))) + (symbol + (lib_id "Device:Fuse") + (at 76.2 154.94 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2617b277-4d18-5dd5-b4ef-32a84b6f4454") + (property "Reference" "F1" (at 76.2 152.4 90) (effects (font (size 1.27 1.27)))) + (property "Value" "Fuse TBD" (at 76.2 157.48 90) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Fuse:Fuseholder_Clip-5x20mm_Littelfuse_111_Inline_P20.00x5.00mm_D1.05mm_Horizontal" + (at 76.2 154.94 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 76.2 154.94 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "DNP/TBD" (at 76.2 154.94 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "5x20 mm holder; element rating TBD until startup/locked-rotor current is measured" + (at 76.2 154.94 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "47a3a793-6646-5421-9074-e5f2daa7cc02")) + (pin "2" (uuid "82d0716d-c1d7-599f-bac5-7d1d93ae445a")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "F1") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 66.04 147.32 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9b652c7e-818e-54fa-bf37-7ca91874168a") + (property "Reference" "TP12" (at 67.31 144.145 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "BENCH_24V" + (at 66.04 147.32 0) + (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 66.04 147.32 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 66.04 147.32 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 66.04 147.32 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Test point BENCH_24V" + (at 66.04 147.32 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "0212a617-8b40-5db3-95c2-4d761d236157")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP12") (unit 1))))) + (symbol + (lib_id "Jumper:Jumper_2_Bridged") + (at 111.76 154.94 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3a817eec-93fa-5043-9dfd-00dea44ea735") + (property "Reference" "JP5" (at 111.76 149.86 0) (effects (font (size 1.27 1.27)))) + (property "Value" "I_MEAS" (at 111.76 158.75 0) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 111.76 154.94 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 111.76 154.94 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 111.76 154.94 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Link fitted, or remove and insert a series ammeter" + (at 111.76 154.94 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Default" "FITTED" (at 111.76 154.94 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "aed49a53-157b-5e09-8670-c01825cd36e6")) + (pin "2" (uuid "48794b79-0a81-532b-b4df-18f73aff16e7")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "JP5") (unit 1))))) + (symbol + (lib_id "Device:R") + (at 99.06 165.1 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b37a1dba-0f18-5cdc-95a2-673e31cef2ec") + (property "Reference" "R6" (at 101.6 163.83 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "10k" (at 101.6 166.37 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "Resistor_SMD:R_0805_2012Metric" + (at 99.06 165.1 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 99.06 165.1 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 99.06 165.1 0) (effects (font (size 1.27 1.27)) hide)) + (property "Function" "LED current limit" (at 99.06 165.1 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "ac7b9662-07bc-5881-a1cd-acf3cd9a7d0d")) + (pin "2" (uuid "45248dc8-1d93-5211-91cc-dcab3f82d996")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "R6") (unit 1))))) + (symbol + (lib_id "Device:LED") + (at 99.06 180.34 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3b1df940-26b5-5a43-a0cb-ed63bb90c220") + (property "Reference" "D2" (at 105.41 179.07 90) (effects (font (size 1.27 1.27)))) + (property "Value" "LED green" (at 106.68 181.61 90) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "LED_SMD:LED_0805_2012Metric" + (at 99.06 180.34 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 99.06 180.34 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 99.06 180.34 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "24 V present (upstream of I_MEAS)" + (at 99.06 180.34 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "e3a228ff-c0ae-5b3e-a04d-472a0e688da3")) + (pin "2" (uuid "a16851a4-6d22-59cf-b867-afa8e513e1d1")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "D2") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 124.46 147.32 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "30282521-2d51-5d4d-93d3-43b79d129a14") + (property + "Reference" + "TP13" + (at 125.73 144.145 0) + (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "FAN_24V" + (at 124.46 147.32 0) + (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 124.46 147.32 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 124.46 147.32 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 124.46 147.32 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Test point FAN_24V" + (at 124.46 147.32 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "842824fe-a5e8-5f14-94f7-4c239a834af1")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP13") (unit 1))))) + (symbol + (lib_id "Device:C_Polarized") + (at 137.16 165.1 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "25fecdef-4c1d-5e5f-94be-2e80dc28492b") + (property "Reference" "C1" (at 139.7 163.83 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "DNP" (at 139.7 166.37 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "Capacitor_THT:CP_Radial_D6.3mm_P2.50mm" + (at 137.16 165.1 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 137.16 165.1 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "DNP/TBD" (at 137.16 165.1 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Optional bulk capacitor at the fan terminal; fitted only for a measured need" + (at 137.16 165.1 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "c17f97da-c30f-514f-b880-5752029f68a8")) + (pin "2" (uuid "c31c65ad-723d-5fc0-8a33-0bc23b4fb3ec")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "C1") (unit 1))))) + (symbol + (lib_id "Connector:TestPoint") + (at 165.1 165.1 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b2beeac0-a002-5c80-92b1-f3e5e41b093d") + (property + "Reference" + "TP14" + (at 166.37 161.925 0) + (effects (font (size 1.27 1.27)) (justify left))) + (property + "Value" + "FAN_GND" + (at 165.1 165.1 0) + (effects (font (size 1.27 1.27)) (justify left) hide)) + (property + "Footprint" + "TestPoint:TestPoint_Keystone_5000-5004_Miniature" + (at 165.1 165.1 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 165.1 165.1 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 165.1 165.1 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Test point FAN_GND" + (at 165.1 165.1 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "32d768ec-c53a-5fae-8c02-8329be5739ac")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "TP14") (unit 1))))) + (symbol + (lib_id "Device:NetTie_2") + (at 53.34 198.12 0) + (unit 1) + (in_bom no) + (on_board yes) + (dnp no) + (uuid "8eb455fd-6d5a-5d2a-b10d-941ab54a1d24") + (property "Reference" "NT1" (at 53.34 195.58 0) (effects (font (size 1.27 1.27)))) + (property "Value" "NetTie" (at 53.34 200.66 0) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "NetTie:NetTie-2_SMD_Pad2.0mm" + (at 53.34 198.12 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 53.34 198.12 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 53.34 198.12 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Star point: fan power-return branch" + (at 53.34 198.12 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "02690403-d5b8-5709-9543-a1918ad15106")) + (pin "2" (uuid "a98ebc2f-085d-560b-b0f4-6430b3e51154")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "NT1") (unit 1))))) + (symbol + (lib_id "Device:NetTie_2") + (at 53.34 213.36 0) + (unit 1) + (in_bom no) + (on_board yes) + (dnp no) + (uuid "13705c46-8ebb-5fc0-8fd7-eb0a927aa0fa") + (property "Reference" "NT2" (at 53.34 210.82 0) (effects (font (size 1.27 1.27)))) + (property "Value" "NetTie" (at 53.34 215.9 0) (effects (font (size 1.27 1.27)))) + (property + "Footprint" + "NetTie:NetTie-2_SMD_Pad0.5mm" + (at 53.34 213.36 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 53.34 213.36 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "FINAL" (at 53.34 213.36 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Star point: signal/controller reference branch" + (at 53.34 213.36 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "a7493c33-2bbd-5dff-a9e0-8cb9d23e3174")) + (pin "2" (uuid "3b5a2def-cc5e-51d0-a6aa-ee9e661147cd")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "NT2") (unit 1))))) + (symbol + (lib_id "Connector:Screw_Terminal_01x04") + (at 251.46 157.48 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "94d1285d-9996-5318-98d1-9f697158dce9") + (property "Reference" "J3" (at 248.92 151.13 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "FAN_DUT" (at 248.92 168.91 0) (effects (font (size 1.27 1.27)) (justify left))) + (property + "Footprint" + "TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-4-5.08_1x04_P5.08mm_Horizontal" + (at 251.46 157.48 0) + (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "~" (at 251.46 157.48 0) (effects (font (size 1.27 1.27)) hide)) + (property "Status" "PROVISIONAL" (at 251.46 157.48 0) (effects (font (size 1.27 1.27)) hide)) + (property + "Function" + "Fixture-side terminal, one lead per position by VERIFIED function; the DUT lead order/colours are not assumed" + (at 251.46 157.48 0) + (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid "f995a3ab-cdd5-58a0-bbd8-42ab7095b103")) + (pin "2" (uuid "fa19eaa2-8791-5fae-b155-947a236d72ea")) + (pin "3" (uuid "94fe9174-18c9-5eff-929e-22649458048e")) + (pin "4" (uuid "06be40cd-8966-5e55-a44c-91ab12442483")) + (instances + (project + "fan-characterization-fixture" + (path "/40c81846-c604-5f80-a432-156beefa23ca" (reference "J3") (unit 1))))) + (sheet_instances (path "/" (page "1")))) diff --git a/hardware/fan-characterization-fixture/fan-characterization-fixture.pdf b/hardware/fan-characterization-fixture/fan-characterization-fixture.pdf new file mode 100644 index 0000000..36402dc Binary files /dev/null and b/hardware/fan-characterization-fixture/fan-characterization-fixture.pdf differ diff --git a/hardware/fan-characterization-fixture/fan-characterization-fixture.svg b/hardware/fan-characterization-fixture/fan-characterization-fixture.svg new file mode 100644 index 0000000..09cfa94 --- /dev/null +++ b/hardware/fan-characterization-fixture/fan-characterization-fixture.svg @@ -0,0 +1,108629 @@ + + + +SVG Image created as fan-characterization-fixture.svg date 2026/09/30 13:14:55 + Image generated by Eeschema-SVG + + + + + + + + + + + + + + + + +1 +1 + + + + + +2 +2 + + + + + + + + + + +3 +3 + + + + + + + + + + + + + +4 +4 + + + +5 +5 + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + +7 +7 + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + +2 +2 + + + + + + + + + + +3 +3 + + + + + + + + + + + + + +4 +4 + + + +5 +5 + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + +7 +7 + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A +A + + + +B +B + + + + + + + + + + + + + + + + + + +C +C + + + + + + + + + + + + + + + +D +D + + + + + + + + + + + + +E +E + + + + +F +F + + + + + + + + +A +A + + + +B +B + + + + + + + + + + + + + + + + + + +C +C + + + + + + + + + + + + + + + +D +D + + + + + + + + + + + + +E +E + + + + +F +F + + + +Date: 2026-09-28 +Date: 2026-09-28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +KiCad E.D.A. 9.0.9 +KiCad E.D.A. 9.0.9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rev: 0-draft +Rev: 0-draft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Size: A3 +Size: A3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Id: 1/1 +Id: 1/1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Title: DragonBench fan-characterization fixture (BENCH ONLY) +Title: DragonBench fan-characterization fixture (BENCH ONLY) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +File: fan-characterization-fixture.kicad_sch +File: fan-characterization-fixture.kicad_sch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sheet: / +Sheet: / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +thetechbenders / DragonBench +thetechbenders / DragonBench + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +BENCH characterization hardware. NOT JumpJet production. +BENCH characterization hardware. NOT JumpJet production. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DUT: San Ace 9GA0424P3J001 (24 V, 4-wire), drawing Rev C +DUT: San Ace 9GA0424P3J001 (24 V, 4-wire), drawing Rev C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rev 0: JP1-JP4 OPEN, JP5 fitted +Rev 0: JP1-JP4 OPEN, JP5 fitted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specimen lead ID and configured PPR: UNVERIFIED +Specimen lead ID and configured PPR: UNVERIFIED + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NT2 +NT2 + + + + + + + + + + + + + + + +NetTie +NetTie + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP6 +TP6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP8 +TP8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP7 +TP7 + + + + + + + + + + + + + + + + + + + + + + + +R3 +R3 + + + + + + + + + + + + + + + + + + + + + + + + +10k +10k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + + +3 + +3 + + + + + + + + + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + +Q1 +Q1 + + + + + + + + + + + + + + + + + + + + + + + + + + +NTR4003NT1G +NTR4003NT1G + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R2 +R2 + + + + + + + + + + + + + + + + + + + + + +10k +10k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP2 +JP2 + + + + + + + + + + + + + + + + + + + + + + + + + +PWM_LINE_EN +PWM_LINE_EN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP3 +JP3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TACH_PU_EN +TACH_PU_EN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP4 +TP4 + + + + + + + + + + + + + + + + + + + + + +TP5 +TP5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP13 +TP13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NT1 +NT1 + + + + + + + + + + +NetTie +NetTie + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP12 +TP12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + +J2 +J2 + + + + + + + + + + + + + + + +BENCH_PSU +BENCH_PSU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +4 +4 + + + + + +J3 +J3 + + + + + + + + + + + + + + + + + + +FAN_DUT +FAN_DUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R1 +R1 + + + + + + + + + + + + + + + + +220R +220R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP2 +TP2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP1 +TP1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +4 +4 + + + + + +J1 +J1 + + + + + + + + + + +MCU_IF +MCU_IF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP1 +JP1 + + + + + + + + + + + + + + + + + + + + +GATE_EN +GATE_EN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP3 +TP3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R6 +R6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +10k +10k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP11 +TP11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +F1 +F1 + + + + + + + + +Fuse TBD +Fuse TBD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP9 +TP9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C2 +C2 + + + + + + + + + + + + + + + + + + + + + + + + + +DNP +DNP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP10 +TP10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A +A + + + + + +1 +1 + + + + + + + + + + + +COM + +COM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 + +3 + + + + + + + + + + + + + + + + + + +K +K + + + + + +2 +2 + + + + + + + + + + + + +D1 +D1 + + + + + + + + + + + + + + + + + +BAT54S +BAT54S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R5 +R5 + + + + + + + + + + + + + + + + + + + + + + + + + + +470k +470k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP5 +JP5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +I_MEAS +I_MEAS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R4 +R4 + + + + + + + + + + + + + + +22k +22k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP4 +JP4 + + + + + + + + + + + + + + + + + + +TACH_GPIO_EN +TACH_GPIO_EN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP14 +TP14 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D2 +D2 + + + + + + + + + + + + + + + + + + + + + + +LED green +LED green + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C1 +C1 + + + + + + + + + + + + + + + + + + + + +DNP +DNP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +FAN_TACH_RAW +FAN_TACH_RAW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TACH_PU +TACH_PU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TACH_SER +TACH_SER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +24V_FUSED +24V_FUSED + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +BENCH_24V +BENCH_24V + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +BENCH_GND +BENCH_GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +BENCH_24V +BENCH_24V + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +LED_A +LED_A + + + + + + + + + + + + + + + + + + + + + + + + +FAN_24V +FAN_24V + + + + + + + + + + + + + + + + + + + + + + + + + + + + +FAN_GND + +FAN_GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +FAN_GND +FAN_GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +BENCH_GND +BENCH_GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +BENCH_GND + +BENCH_GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +FAN_GND + +FAN_GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TACH_GPIO +TACH_GPIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MCU_PWM +MCU_PWM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MCU_PWM +MCU_PWM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TACH_GPIO +TACH_GPIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +FAN_GND +FAN_GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +FAN_24V +FAN_24V + + + + + + + + + + + + + + + + + + + + + + + + + + + +PWM_DRAIN +PWM_DRAIN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +FAN_PWM_RAW +FAN_PWM_RAW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +FAN_TACH_RAW +FAN_TACH_RAW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +FAN_PWM_RAW +FAN_PWM_RAW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PWM_IN +PWM_IN + + + + + + + + + + + + + + + + + + + + + + + + + +PWM_GATE +PWM_GATE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3. Tach input / conditioning +3. Tach input / conditioning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Controller-agnostic link. Board wiring is a LOCAL overlay. +Controller-agnostic link. Board wiring is a LOCAL overlay. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +N16R8 Rev 0 bench overlay (provisional, NOT JumpJet GPIOs): +N16R8 Rev 0 bench overlay (provisional, NOT JumpJet GPIOs): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + J1.1 MCU_PWM <- GPIO6 + J1.1 MCU_PWM <- GPIO6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + J1.2 TACH_GPIO -> GPIO7 + J1.2 TACH_GPIO -> GPIO7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + J1.3 3V3 <- board 3V3 (never 5V) + J1.3 3V3 <- board 3V3 (never 5V) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + J1.4 GND <- board GND + J1.4 GND <- board GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sdkconfig.fan-characterization.local: +sdkconfig.fan-characterization.local: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CONFIG_DB_FAN_PWM_GATE_GPIO=6 + CONFIG_DB_FAN_PWM_GATE_GPIO=6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CONFIG_DB_FAN_GATE_SINK_LEVEL=1 + CONFIG_DB_FAN_GATE_SINK_LEVEL=1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CONFIG_DB_FAN_TACH_GPIO=7 + CONFIG_DB_FAN_TACH_GPIO=7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TinyS3[D]: same J1 functions, own overlay. +TinyS3[D]: same J1 functions, own overlay. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Controller terminals are passive: no protection assumed. +Controller terminals are passive: no protection assumed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +6. Test points / configuration jumpers +6. Test points / configuration jumpers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J3 positions are fixture functions, +J3 positions are fixture functions, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +not the fan's physical wire order. +not the fan's physical wire order. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Land each lead only after it is +Land each lead only after it is + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +identified on the specimen by +identified on the specimen by + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +photo + continuity + manufacturer +photo + continuity + manufacturer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +documentation. +documentation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Catalog convention / not yet +Catalog convention / not yet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +verified on specimen: +verified on specimen: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + red +, black -, brown PWM, + red +, black -, brown PWM, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yellow sensor. + yellow sensor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Jumpers (Rev 0 shipping state) +Jumpers (Rev 0 shipping state) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP1 GATE_EN OPEN MCU_PWM -> R1/Q1 gate +JP1 GATE_EN OPEN MCU_PWM -> R1/Q1 gate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP2 PWM_LINE_EN OPEN Q1 drain -> FAN_PWM_RAW +JP2 PWM_LINE_EN OPEN Q1 drain -> FAN_PWM_RAW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP3 TACH_PU_EN OPEN R3 3V3 pull-up on raw tach +JP3 TACH_PU_EN OPEN R3 3V3 pull-up on raw tach + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP4 TACH_GPIO_EN OPEN raw tach -> R4/D1/R5 -> GPIO +JP4 TACH_GPIO_EN OPEN raw tach -> R4/D1/R5 -> GPIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP5 I_MEAS FITTED 24V_FUSED -> FAN_24V +JP5 I_MEAS FITTED 24V_FUSED -> FAN_24V + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Test points +Test points + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP12 BENCH_24V TP13 FAN_24V TP14 FAN_GND +TP12 BENCH_24V TP13 FAN_24V TP14 FAN_GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP1, TP10 3V3 TP2, TP7, TP11 GND +TP1, TP10 3V3 TP2, TP7, TP11 GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP3 PWM_IN (signal-generator injection with JP1 open) +TP3 PWM_IN (signal-generator injection with JP1 open) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP4 PWM_GATE TP5 PWM_DRAIN TP6 FAN_PWM_RAW +TP4 PWM_GATE TP5 PWM_DRAIN TP6 FAN_PWM_RAW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TP8 FAN_TACH_RAW TP9 TACH_GPIO +TP8 FAN_TACH_RAW TP9 TACH_GPIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +25 kHz is the manufacturer-specified control frequency +25 kHz is the manufacturer-specified control frequency + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +for 9GA0424P3J001; bench characterization still +for 9GA0424P3J001; bench characterization still + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +verifies specimen behaviour. Configured PPR = 0 (unknown). +verifies specimen behaviour. Configured PPR = 0 (unknown). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Not defined here: JumpJet GPIOs, thresholds, startup +Not defined here: JumpJet GPIOs, thresholds, startup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +duty, stall limits, fan-safety policy. +duty, stall limits, fan-safety policy. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sensor, Sanyo spec 9D0001H202: open collector, +Sensor, Sanyo spec 9D0001H202: open collector, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VCE <= 27.6 V, IC <= 5 mA, VCE(sat) <= 0.8 V. + VCE <= 27.6 V, IC <= 5 mA, VCE(sat) <= 0.8 V. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Spec suggests 2 pulses/rev; configured PPR stays 0 + Spec suggests 2 pulses/rev; configured PPR stays 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (unknown) until an optical RPM check on the specimen. + (unknown) until an optical RPM check on the specimen. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Default JP3 OPEN, JP4 OPEN: raw tach sees only TP8. +Default JP3 OPEN, JP4 OPEN: raw tach sees only TP8. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP3: R3 10k to 3V3 -> 0.33 mA sink (IC max 5 mA). +JP3: R3 10k to 3V3 -> 0.33 mA sink (IC max 5 mA). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP4: R4 22k, D1 clamp, R5 470k. High ~3.09 V (VIH +JP4: R4 22k, D1 clamp, R5 470k. High ~3.09 V (VIH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.475 V); low <= 0.76 V at VCE(sat) 0.8 V (VIL 0.825 V). + 2.475 V); low <= 0.76 V at VCE(sat) 0.8 V (VIL 0.825 V). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Back-power if the tach lead is faulted to 26.4 V: +Back-power if the tach lead is faulted to 26.4 V: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R4/D1 <= 1.2 mA, R3 (JP3) <= 2.7 mA into 3V3. + R4/D1 <= 1.2 mA, R3 (JP3) <= 2.7 mA into 3V3. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RULE: controller 3V3 ON before JP3/JP4 close; keep it +RULE: controller 3V3 ON before JP3/JP4 close; keep it + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + on until fan power is off or JP3/JP4 are open. + on until fan power is off or JP3/JP4 are open. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C2 DNP (no glitch filter). Internal pull-up stays OFF. +C2 DNP (no glitch filter). Internal pull-up stays OFF. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4. 24 V fan supply and ground topology +4. 24 V fan supply and ground topology + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1. MCU / DragonBench interface +1. MCU / DragonBench interface + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5. Fan connector +5. Fan connector + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Q1 non-inverting: gate HIGH = sink => CONFIG_DB_FAN_GATE_SINK_LEVEL=1. sink_duty_pct = Q1 on-time. +Q1 non-inverting: gate HIGH = sink => CONFIG_DB_FAN_GATE_SINK_LEVEL=1. sink_duty_pct = Q1 on-time. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Fan control input, 9GA0424P3J001 drawing Rev C: 25 kHz specified; open-collector/open-drain drive OK; +Fan control input, 9GA0424P3J001 drawing Rev C: 25 kHz specified; open-collector/open-drain drive OK; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + control open = same speed as 100 %; 0 % = stopped; open voltage <= 5.25 V; source <= 2 mA at 0 V; VIL <= 0.4 V. + control open = same speed as 100 %; 0 % = stopped; open voltage <= 5.25 V; source <= 2 mA at 0 V; VIL <= 0.4 V. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Q1 NTR4003NT1G is a signal-interface FET here: normal stress VDS <= 5.25 V, ID <= 2 mA. +Q1 NTR4003NT1G is a signal-interface FET here: normal stress VDS <= 5.25 V, ID <= 2 mA. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Low level at 2 mA: 2 mA x 2.0 ohm (RDS(on) max, VGS 2.5 V) = 4 mV, << 0.4 V. + Low level at 2 mA: 2 mA x 2.0 ohm (RDS(on) max, VGS 2.5 V) = 4 mV, << 0.4 V. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R1 220R: gate charge current <= 3.3/220 = 15 mA peak; RC < 25 ns even at 100 pF, vs 20 us half-period. +R1 220R: gate charge current <= 3.3/220 = 15 mA peak; RC < 25 ns even at 100 pF, vs 20 us half-period. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Driven gate = VOH x 10k/10.22k = 3.23 V at 3.3 V (2.94 V at a 3.0 V rail): above the 2.5 V RDS(on) row. + Driven gate = VOH x 10k/10.22k = 3.23 V at 3.3 V (2.94 V at a 3.0 V rail): above the 2.5 V RDS(on) row. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R2 10k: GPIO6 undriven -> gate = IGSS x 10k (<= 0.1 V at 10 uA, assumed). Reset/flash state unproven: check TP4. +R2 10k: GPIO6 undriven -> gate = IGSS x 10k (<= 0.1 V at 10 uA, assumed). Reset/flash state unproven: check TP4. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NOT rated for FAN_PWM_RAW landed on FAN_24V: verify lead identity before landing (BRINGUP step 2). +NOT rated for FAN_PWM_RAW landed on FAN_24V: verify lead identity before landing (BRINGUP step 2). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +No RC filter and no fixture pull-up on FAN_PWM_RAW. JP2 open = line fully released for open-line tests. +No RC filter and no fixture pull-up on FAN_PWM_RAW. JP2 open = line fully released for open-line tests. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Ground topology: single star point at J2.2 through NT1/NT2. +Ground topology: single star point at J2.2 through NT1/NT2. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FAN_GND: fan supply return only. GND: Q1 source, tach clamp/pulldowns, J1.4, scope ground. + FAN_GND: fan supply return only. GND: Q1 source, tach clamp/pulldowns, J1.4, scope ground. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fan motor current never flows in GND; the <= 2 mA PWM and tach currents return through the star. + Fan motor current never flows in GND; the <= 2 mA PWM and tach currents return through the star. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Controller USB ground meets the PSU negative ONLY here: use a floating PSU output. + Controller USB ground meets the PSU negative ONLY here: use a floating PSU output. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +F1: 5x20 holder; rating TBD until startup/locked-rotor current is measured. The bench PSU current +F1: 5x20 holder; rating TBD until startup/locked-rotor current is measured. The bench PSU current + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + limit is the first protection during characterization (holder may carry a labelled 0R link). + limit is the first protection during characterization (holder may carry a labelled 0R link). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +JP5 I_MEAS: remove link to insert an ammeter. D2/R6 (~2.2 mA) sit upstream of JP5. +JP5 I_MEAS: remove link to insert an ammeter. D2/R6 (~2.2 mA) sit upstream of JP5. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +No reverse-polarity element: confirm polarity at TP12 before landing the fan. C1 DNP. +No reverse-polarity element: confirm polarity at TP12 before landing the fan. C1 DNP. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2. PWM open-drain driver +2. PWM open-drain driver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hardware/fan-characterization-fixture/generator/build_schematic.py b/hardware/fan-characterization-fixture/generator/build_schematic.py new file mode 100644 index 0000000..2d4a7a5 --- /dev/null +++ b/hardware/fan-characterization-fixture/generator/build_schematic.py @@ -0,0 +1,179 @@ +"""Generate the fixture's KiCad 9 schematic and project file from fixture.py. + + python3 build_schematic.py OUT_DIR + +writes OUT_DIR/fan-characterization-fixture.kicad_sch, .kicad_pro, and +intent.json (the per-pin net assignment check_netlist.py compares against). +Output is deterministic: UUIDs derive from content, so an unchanged +fixture.py reproduces the checked-in files byte for byte. Symbols are +embedded from the KiCad 9 libraries in KICAD_SYMBOL_DIR. +""" +import json +import math +import os +import sys +import uuid + +import sexp +from sexp import Sym as S, dump, pins +import fixture as F + +NS = uuid.UUID('6f1a3c52-7d0e-4c1b-9a51-0d4a2b7e9c11') + + +def U(*k): return str(uuid.uuid5(NS, '/'.join(map(str, k)))) + + +ROOT = U('root') +STUB = 2.54 +C = F.COMPONENTS + + +def rot(px, py, a): + r = math.radians(a) + return (px * math.cos(r) - py * math.sin(r), px * math.sin(r) + py * math.cos(r)) + + +def g(v): return round(round(v / 1.27) * 1.27, 4) + + +items = [] + + +def wire(x1, y1, x2, y2): + items.append([S('wire'), [S('pts'), [S('xy'), x1, y1], [S('xy'), x2, y2]], + [S('stroke'), [S('width'), 0], [S('type'), S('default')]], [S('uuid'), U('w', x1, y1, x2, y2)]]) + + +def label(name, x, y, ang): + just = [S('left'), S('bottom')] if ang in (0, 90) else [S('right'), S('bottom')] + items.append([S('label'), name, [S('at'), x, y, ang], [S('fields_autoplaced')], + [S('effects'), [S('font'), [S('size'), 1.27, 1.27]], [S('justify')] + just], [S('uuid'), U('l', name, x, y)]]) + + +def text(t, x, y, size=1.27, bold=False): + font = [S('font'), [S('size'), size, size]] + ([S('bold')] if bold else []) + items.append([S('text'), t, [S('at'), x, y, 0], [S('effects'), font, [S('justify'), S('left'), S('top')]], + [S('uuid'), U('t', t[:40], x, y)]]) + + +def rect(x1, y1, x2, y2, title): + items.append([S('rectangle'), [S('start'), x1, y1], [S('end'), x2, y2], + [S('stroke'), [S('width'), 0.254], [S('type'), S('dash')]], [S('fill'), [S('type'), S('none')]], + [S('uuid'), U('r', title)]]) + text(title, x1 + 1.27, y1 + 1.27, 1.8, True) + + +def prop(name, val, x, y, hide=False, just=None, ang=0): + eff = [S('effects'), [S('font'), [S('size'), 1.27, 1.27]]] + if just: eff.append([S('justify')] + [S(j) for j in just]) + if hide: eff.append(S('hide')) + return [S('property'), name, val, [S('at'), x, y, ang], eff] + + +def field_positions(c): + """Reference/Value placement per symbol kind: (ref xy, value xy, justify).""" + x, y, r, kind = c['x'], c['y'], c['rot'], c['sym'] + if kind in ('R', 'C', 'C_Polarized', 'Fuse'): + if r == 90: return (x, y - 2.54), (x, y + 2.54), None + return (x + 2.54, y - 1.27), (x + 2.54, y + 1.27), ['left'] + if kind.startswith('Jumper'): return (x, y - 5.08), (x, y + 3.81), None + if kind == 'TestPoint' and r == 180: return (x + 3.175, y + 4.445), (x, y), None + if kind == 'TestPoint': return (x + 1.27, y - 3.175), (x, y), ['left'] + if kind.startswith('Screw'): return (x - 2.54, y - 6.35), (x - 2.54, y + (11.43 if '04' in kind else 6.35)), ['left'] + if c['ref'].startswith('Q'): return (x + 5.08, y - 1.27), (x + 5.08, y + 1.27), ['left'] + if kind == 'BAT54S': return (x, y - 7.62), (x, y - 5.08), None + if kind == 'NetTie_2': return (x, y - 2.54), (x, y + 2.54), None + if kind == 'LED' and r == 90: return (x + 6.35, y - 1.27), (x + 7.62, y + 1.27), None + raise SystemExit(f"no field placement for {c['ref']} ({kind})") + + +def build(out_dir): + libs, pinpos = {}, {} + wired = {p for _, pts in F.WIRES for p in pts if isinstance(p, str)} + for c in C: + key = f"{c['lib']}:{c['sym']}" + ls = sexp.flat(c['lib'], c['sym']) + libs[key] = ls + if sorted(p['num'] for p in pins(ls)) != sorted(c['nets']): + raise SystemExit(f"{c['ref']}: pin/net mismatch") + for p in pins(ls): + rx, ry = rot(p['x'], p['y'], c['rot']) + px, py = g(c['x'] + rx), g(c['y'] - ry) + name = f"{c['ref']}.{p['num']}" + pinpos[name] = (px, py) + if name in wired: continue + # Unwired pin: short stub pointing away from the body, ending in a net label. + ox, oy = rot(1, 0, p['rot'] + 180 + c['rot']) + dx, dy = round(ox), -round(oy) + ex, ey = px + dx * STUB, py + dy * STUB + wire(px, py, ex, ey) + label(c['nets'][p['num']], ex, ey, {(1, 0): 0, (-1, 0): 180, (0, -1): 90, (0, 1): 270}[(dx, dy)]) + + junctions = [(g(x), g(y)) for x, y in F.JUNCTIONS] + for net, pts in F.WIRES: + for p in pts: + if isinstance(p, str): + ref, num = p.split('.') + want = next(c for c in C if c['ref'] == ref)['nets'][num] + if want != net: raise SystemExit(f"wire {net} touches {p} ({want})") + xy = [pinpos[p] if isinstance(p, str) else (g(p[0]), g(p[1])) for p in pts] + for a, b in zip(xy, xy[1:]): + if a[0] != b[0] and a[1] != b[1]: raise SystemExit(f"diagonal wire in {net}: {a}->{b}") + # eeschema does not split a segment at a junction on load: cut it here so every + # tap is a real segment endpoint. + cuts = sorted({q for q in junctions if q not in (a, b) and + min(a[0], b[0]) <= q[0] <= max(a[0], b[0]) and min(a[1], b[1]) <= q[1] <= max(a[1], b[1])}, + key=lambda q: abs(q[0] - a[0]) + abs(q[1] - a[1])) + for u, v in zip([a] + cuts, cuts + [b]): + wire(u[0], u[1], v[0], v[1]) + for x, y in junctions: + items.append([S('junction'), [S('at'), x, y], [S('diameter'), 0], [S('color'), 0, 0, 0, 0], [S('uuid'), U('j', x, y)]]) + for net, x, y, a in F.LABELS: + label(net, g(x), g(y), a) + for block in F.BLOCKS: + rect(*block) + for t, x, y in F.NOTES: + text(t, x, y) + + syms = [] + for c in C: + x, y, r, kind = c['x'], c['y'], c['rot'], c['sym'] + rp, vp, j = field_positions(c) + fang = r if r in (90, 270) else 0 + s = [S('symbol'), [S('lib_id'), f"{c['lib']}:{kind}"], [S('at'), x, y, r], [S('unit'), 1], + [S('in_bom'), S('no') if kind == 'NetTie_2' else S('yes')], [S('on_board'), S('yes')], + [S('dnp'), S('yes') if c['dnp'] else S('no')], [S('uuid'), U('s', c['ref'])], + prop('Reference', c['ref'], *rp, just=j, ang=fang), + prop('Value', c['value'], *vp, just=j, ang=fang, hide=kind == 'TestPoint'), + prop('Footprint', c['fp'], x, y, hide=True), prop('Datasheet', '~', x, y, hide=True), + prop('Status', c['status'], x, y, hide=True), prop('Function', c['function'], x, y, hide=True)] + if c['default']: + s.append(prop('Default', c['default'], x, y, hide=True)) + for p in pins(libs[f"{c['lib']}:{kind}"]): + s.append([S('pin'), p['num'], [S('uuid'), U('p', c['ref'], p['num'])]]) + s.append([S('instances'), [S('project'), F.PROJECT, [S('path'), '/' + ROOT, [S('reference'), c['ref']], [S('unit'), 1]]]]) + syms.append(s) + + tb = F.TITLE_BLOCK + lib_symbols = [S('lib_symbols')] + [[v[0], k] + list(v[2:]) for k, v in libs.items()] + doc = [S('kicad_sch'), [S('version'), 20250114], [S('generator'), 'eeschema'], [S('generator_version'), '9.0'], + [S('uuid'), ROOT], [S('paper'), 'A3'], + [S('title_block'), [S('title'), tb['title']], [S('date'), tb['date']], [S('rev'), tb['rev']], + [S('company'), tb['company']]] + [[S('comment'), i + 1, t] for i, t in enumerate(tb['comments'])], + lib_symbols] + items + syms + [[S('sheet_instances'), [S('path'), '/', [S('page'), '1']]]] + + base = os.path.join(out_dir, F.PROJECT) + with open(base + '.kicad_sch', 'w') as f: + f.write(dump(doc) + '\n') + with open(base + '.kicad_pro', 'w') as f: + json.dump({'meta': {'filename': F.PROJECT + '.kicad_pro', 'version': 1}, + 'schematic': {'legacy_lib_dir': '', 'legacy_lib_list': []}, + 'sheets': [[ROOT, '']]}, f, indent=2) + f.write('\n') + with open(os.path.join(out_dir, 'intent.json'), 'w') as f: + json.dump([dict(ref=c['ref'], nets=c['nets'], default=c['default']) for c in C], f, indent=1) + + +if __name__ == '__main__': + build(sys.argv[1]) diff --git a/hardware/fan-characterization-fixture/generator/check_netlist.py b/hardware/fan-characterization-fixture/generator/check_netlist.py new file mode 100644 index 0000000..18870c7 --- /dev/null +++ b/hardware/fan-characterization-fixture/generator/check_netlist.py @@ -0,0 +1,67 @@ +"""Compare the netlist KiCad extracted from the schematic with the intended design. + + python3 check_netlist.py NETLIST.xml INTENT.json EXPECTED_NETS.txt + +Fails unless all three connectivity views agree exactly, and unless every +configuration jumper carries its required Rev 0 default. +""" +import json +import sys +import xml.etree.ElementTree as ET + +REQUIRED_DEFAULTS = {'JP1': 'OPEN', 'JP2': 'OPEN', 'JP3': 'OPEN', 'JP4': 'OPEN', 'JP5': 'FITTED'} + + +def from_kicad(path): + root = ET.parse(path).getroot() + nets = {n.get('name').lstrip('/'): {f"{x.get('ref')}.{x.get('pin')}" for x in n} for n in root.find('nets')} + defaults = {} + for comp in root.find('components'): + for f in comp.iter('field'): + if f.get('name') == 'Default': + defaults[comp.get('ref')] = f.text + return nets, defaults + + +def from_intent(path): + nets = {} + for c in json.load(open(path)): + for pin, net in c['nets'].items(): + nets.setdefault(net, set()).add(f"{c['ref']}.{pin}") + return nets + + +def from_expected(path): + nets = {} + for line in open(path): + line = line.split('#', 1)[0].split() + if line: nets[line[0]] = set(line[1:]) + return nets + + +def diff(name_a, a, name_b, b): + bad = [] + for net in sorted(set(a) | set(b)): + if a.get(net) != b.get(net): + bad.append(f" {net}: {name_a}={sorted(a.get(net, []))} {name_b}={sorted(b.get(net, []))}") + return bad + + +def main(netlist, intent, expected): + kicad, defaults = from_kicad(netlist) + problems = diff('kicad', kicad, 'fixture.py', from_intent(intent)) + \ + diff('kicad', kicad, 'expected-nets.txt', from_expected(expected)) + for ref, want in REQUIRED_DEFAULTS.items(): + if defaults.get(ref) != want: + problems.append(f" {ref}: default {defaults.get(ref)!r}, required {want!r}") + if problems: + print('NETLIST CHECK FAILED') + print('\n'.join(problems)) + return 1 + print(f"netlist check: {len(kicad)} nets match fixture.py and expected-nets.txt; " + f"jumper defaults {', '.join(f'{k}={v}' for k, v in REQUIRED_DEFAULTS.items())}") + return 0 + + +if __name__ == '__main__': + sys.exit(main(*sys.argv[1:4])) diff --git a/hardware/fan-characterization-fixture/generator/expected-nets.txt b/hardware/fan-characterization-fixture/generator/expected-nets.txt new file mode 100644 index 0000000..8daa479 --- /dev/null +++ b/hardware/fan-characterization-fixture/generator/expected-nets.txt @@ -0,0 +1,30 @@ +# Expected connectivity of the Rev 0 fixture, maintained by hand and reviewed +# independently of fixture.py. check_netlist.py compares the netlist KiCad +# extracts from the schematic against this file AND against fixture.py's +# per-pin assignments; all three must agree. +# Format: NET REF.PIN ... (order does not matter) + +# Controller link +MCU_PWM J1.1 JP1.1 +TACH_GPIO J1.2 R4.2 R5.1 D1.3 C2.1 TP9.1 +3V3 J1.3 R3.2 D1.2 TP1.1 TP10.1 +GND J1.4 R2.2 Q1.2 R5.2 D1.1 C2.2 NT2.2 TP2.1 TP7.1 TP11.1 + +# PWM open-drain stage +PWM_IN JP1.2 R1.1 TP3.1 +PWM_GATE R1.2 R2.1 Q1.1 TP4.1 +PWM_DRAIN Q1.3 JP2.1 TP5.1 +FAN_PWM_RAW JP2.2 J3.3 TP6.1 + +# Tach +FAN_TACH_RAW J3.4 JP3.1 JP4.1 TP8.1 +TACH_PU JP3.2 R3.1 +TACH_SER JP4.2 R4.1 + +# 24 V supply and ground star +BENCH_24V J2.1 F1.1 TP12.1 +24V_FUSED F1.2 JP5.1 R6.1 +LED_A R6.2 D2.2 +FAN_24V JP5.2 J3.1 C1.1 TP13.1 +BENCH_GND J2.2 D2.1 NT1.1 NT2.1 +FAN_GND NT1.2 J3.2 C1.2 TP14.1 diff --git a/hardware/fan-characterization-fixture/generator/fixture.py b/hardware/fan-characterization-fixture/generator/fixture.py new file mode 100644 index 0000000..25264c6 --- /dev/null +++ b/hardware/fan-characterization-fixture/generator/fixture.py @@ -0,0 +1,250 @@ +"""Design data for the DragonBench fan-characterization fixture, Rev 0. + +This file is the schematic's source. build_schematic.py turns it into +fan-characterization-fixture.kicad_sch; verify.sh checks that the checked-in +schematic is exactly what this file produces. Edit here, never in eeschema. + +Coordinates are millimetres on the A3 sheet, snapped to a 1.27 mm grid. +""" + +PROJECT = 'fan-characterization-fixture' + +TITLE_BLOCK = { + 'title': 'DragonBench fan-characterization fixture (BENCH ONLY)', + 'date': '2026-09-28', + 'rev': '0-draft', + 'company': 'thetechbenders / DragonBench', + 'comments': [ + 'BENCH characterization hardware. NOT JumpJet production.', + 'DUT: San Ace 9GA0424P3J001 (24 V, 4-wire), drawing Rev C', + 'Rev 0: JP1-JP4 OPEN, JP5 fitted', + 'Specimen lead ID and configured PPR: UNVERIFIED', + ], +} + +TP_FP = 'TestPoint:TestPoint_Keystone_5000-5004_Miniature' +HDR2 = 'Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical' +R0805 = 'Resistor_SMD:R_0805_2012Metric' + +COMPONENTS, WIRES, JUNCTIONS, LABELS, NOTES = [], [], [], [], [] + + +def comp(ref, lib, sym, x, y, rot, value, fp, nets, status, function, dnp=False, default=None): + COMPONENTS.append(dict(ref=ref, lib=lib, sym=sym, x=x, y=y, rot=rot, value=value, fp=fp, nets=nets, + status=status, function=function, dnp=dnp, default=default)) + + +def W(net, *pts): + """Wire polyline; points are 'REF.PIN' or (x, y). Every pin named must be on `net`.""" + WIRES.append((net, pts)) + + +def J(x, y): JUNCTIONS.append((x, y)) +def L(net, x, y, ang=0): LABELS.append((net, x, y, ang)) +def note(x, y, *lines): NOTES.append(('\n'.join(lines), x, y)) + + +def tp(ref, x, y, net): + """Stand-alone test point with its own net label.""" + comp(ref, 'Connector', 'TestPoint', x, y, 0, net, TP_FP, {'1': net}, 'FINAL', f'Test point {net}') + + +def tpw(ref, x, y, net, bus_y): + """Test point above (bus_y > y) or below a horizontal wire, tapped with a junction.""" + comp(ref, 'Connector', 'TestPoint', x, y, 0 if bus_y > y else 180, net, TP_FP, {'1': net}, 'FINAL', f'Test point {net}') + W(net, f'{ref}.1', (x, bus_y)); J(x, bus_y) + + +BLOCKS = [ + (15.24, 20.32, 106.68, 124.46, '1. MCU / DragonBench interface'), + (111.76, 20.32, 266.7, 124.46, '2. PWM open-drain driver'), + (271.78, 20.32, 406.4, 124.46, '3. Tach input / conditioning'), + (15.24, 132.08, 213.36, 248.92, '4. 24 V fan supply and ground topology'), + (218.44, 132.08, 289.56, 248.92, '5. Fan connector'), + (294.64, 132.08, 406.4, 248.92, '6. Test points / configuration jumpers'), +] + +# ================= 1. MCU / DragonBench interface +comp('J1', 'Connector', 'Screw_Terminal_01x04', 45.72, 55.88, 0, 'MCU_IF', + 'TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-4-5.08_1x04_P5.08mm_Horizontal', + {'1': 'MCU_PWM', '2': 'TACH_GPIO', '3': '3V3', '4': 'GND'}, 'PROVISIONAL', + 'Controller link. Pin 1 MCU_PWM (out), 2 TACH_GPIO (in), 3 3V3 from controller, 4 GND') +tp('TP1', 78.74, 50.8, '3V3') +tp('TP2', 93.98, 50.8, 'GND') +note(19.05, 78.74, + 'Controller-agnostic link. Board wiring is a LOCAL overlay.', + 'N16R8 Rev 0 bench overlay (provisional, NOT JumpJet GPIOs):', + ' J1.1 MCU_PWM <- GPIO6', + ' J1.2 TACH_GPIO -> GPIO7', + ' J1.3 3V3 <- board 3V3 (never 5V)', + ' J1.4 GND <- board GND', + 'sdkconfig.fan-characterization.local:', + ' CONFIG_DB_FAN_PWM_GATE_GPIO=6', + ' CONFIG_DB_FAN_GATE_SINK_LEVEL=1', + ' CONFIG_DB_FAN_TACH_GPIO=7', + 'TinyS3[D]: same J1 functions, own overlay.', + 'Controller terminals are passive: no protection assumed.') + +# ================= 2. PWM open-drain driver (main line y = 50.8) +Y = 50.8 +comp('JP1', 'Jumper', 'Jumper_2_Open', 129.54, Y, 0, 'GATE_EN', HDR2, + {'1': 'MCU_PWM', '2': 'PWM_IN'}, 'FINAL', 'Open: controller disconnected from gate; PWM_IN free for a signal generator', + default='OPEN') +comp('R1', 'Device', 'R', 152.4, Y, 90, '220R', R0805, + {'1': 'PWM_IN', '2': 'PWM_GATE'}, 'PROVISIONAL', 'Gate series resistor') +comp('R2', 'Device', 'R', 167.64, 60.96, 0, '10k', R0805, + {'1': 'PWM_GATE', '2': 'GND'}, 'PROVISIONAL', 'Gate pulldown: Q1 OFF whenever the gate is not actively driven high') +comp('Q1', 'Transistor_FET', 'Q_NMOS_GSD', 182.88, Y, 0, 'NTR4003NT1G', 'Package_TO_SOT_SMD:SOT-23', + {'1': 'PWM_GATE', '2': 'GND', '3': 'PWM_DRAIN'}, 'PROVISIONAL', + 'Signal-interface open-drain sink for the fan control input; VDS <= 5.25 V, ID <= 2 mA in normal use') +comp('JP2', 'Jumper', 'Jumper_2_Open', 220.98, 38.1, 0, 'PWM_LINE_EN', HDR2, + {'1': 'PWM_DRAIN', '2': 'FAN_PWM_RAW'}, 'FINAL', 'Open: fan PWM line carries no fixture load at all', + default='OPEN') +W('PWM_IN', 'JP1.2', 'R1.1'); L('PWM_IN', 135.89, Y) +tpw('TP3', 144.78, 43.18, 'PWM_IN', Y) +W('PWM_GATE', 'R1.2', 'Q1.1'); L('PWM_GATE', 157.48, Y) +W('PWM_GATE', 'R2.1', (167.64, Y)); J(167.64, Y) +tpw('TP4', 172.72, 43.18, 'PWM_GATE', Y) +W('PWM_DRAIN', 'Q1.3', (185.42, 38.1), 'JP2.1'); L('PWM_DRAIN', 186.69, 38.1) +tpw('TP5', 208.28, 30.48, 'PWM_DRAIN', 38.1) +W('FAN_PWM_RAW', 'JP2.2', (243.84, 38.1)); L('FAN_PWM_RAW', 243.84, 38.1) +tpw('TP6', 233.68, 30.48, 'FAN_PWM_RAW', 38.1) +tp('TP7', 254.0, 60.96, 'GND') +note(116.84, 86.36, + 'Q1 non-inverting: gate HIGH = sink => CONFIG_DB_FAN_GATE_SINK_LEVEL=1. sink_duty_pct = Q1 on-time.', + 'Fan control input, 9GA0424P3J001 drawing Rev C: 25 kHz specified; open-collector/open-drain drive OK;', + ' control open = same speed as 100 %; 0 % = stopped; open voltage <= 5.25 V; source <= 2 mA at 0 V; VIL <= 0.4 V.', + 'Q1 NTR4003NT1G is a signal-interface FET here: normal stress VDS <= 5.25 V, ID <= 2 mA.', + ' Low level at 2 mA: 2 mA x 2.0 ohm (RDS(on) max, VGS 2.5 V) = 4 mV, << 0.4 V.', + 'R1 220R: gate charge current <= 3.3/220 = 15 mA peak; RC < 25 ns even at 100 pF, vs 20 us half-period.', + ' Driven gate = VOH x 10k/10.22k = 3.23 V at 3.3 V (2.94 V at a 3.0 V rail): above the 2.5 V RDS(on) row.', + 'R2 10k: GPIO6 undriven -> gate = IGSS x 10k (<= 0.1 V at 10 uA, assumed). Reset/flash state unproven: check TP4.', + 'NOT rated for FAN_PWM_RAW landed on FAN_24V: verify lead identity before landing (BRINGUP step 2).', + 'No RC filter and no fixture pull-up on FAN_PWM_RAW. JP2 open = line fully released for open-line tests.') + +# ================= 3. Tach input / conditioning +X0 = 294.64 +W('FAN_TACH_RAW', (276.86, 55.88), (X0, 55.88)); L('FAN_TACH_RAW', 276.86, 55.88) +W('FAN_TACH_RAW', (X0, 43.18), (X0, 68.58)); J(X0, 55.88) +comp('JP3', 'Jumper', 'Jumper_2_Open', 304.8, 43.18, 0, 'TACH_PU_EN', HDR2, + {'1': 'FAN_TACH_RAW', '2': 'TACH_PU'}, 'FINAL', 'Closed: R3 pulls raw tach to 3V3', default='OPEN') +comp('R3', 'Device', 'R', 326.39, 43.18, 90, '10k', R0805, + {'1': 'TACH_PU', '2': '3V3'}, 'PROVISIONAL', 'External tach pull-up to 3V3 (0.33 mA vs 5 mA IC max)') +comp('JP4', 'Jumper', 'Jumper_2_Open', 304.8, 68.58, 0, 'TACH_GPIO_EN', HDR2, + {'1': 'FAN_TACH_RAW', '2': 'TACH_SER'}, 'FINAL', 'Open: raw tach isolated from R4/D1/R5 and the GPIO', default='OPEN') +comp('R4', 'Device', 'R', 326.39, 68.58, 90, '22k', R0805, + {'1': 'TACH_SER', '2': 'TACH_GPIO'}, 'PROVISIONAL', 'Series protection: limits clamp/back-power current to ~1.2 mA at 26.4 V') +W('FAN_TACH_RAW', (X0, 43.18), 'JP3.1'); W('FAN_TACH_RAW', (X0, 68.58), 'JP4.1') +tpw('TP8', 287.02, 63.5, 'FAN_TACH_RAW', 55.88) +W('TACH_PU', 'JP3.2', 'R3.1'); L('TACH_PU', 311.15, 43.18) +W('TACH_SER', 'JP4.2', 'R4.1'); L('TACH_SER', 311.15, 68.58) +YT = 68.58 +W('TACH_GPIO', 'R4.2', (391.16, YT)); L('TACH_GPIO', 391.16, YT) +comp('R5', 'Device', 'R', 340.36, 78.74, 0, '470k', R0805, + {'1': 'TACH_GPIO', '2': 'GND'}, 'PROVISIONAL', 'Holds TACH_GPIO low when JP4 is open') +W('TACH_GPIO', 'R5.1', (340.36, YT)); J(340.36, YT) +comp('D1', 'Diode', 'BAT54S', 358.14, 60.96, 0, 'BAT54S', 'Package_TO_SOT_SMD:SOT-23', + {'1': 'GND', '2': '3V3', '3': 'TACH_GPIO'}, 'PROVISIONAL', 'Schottky clamp of TACH_GPIO to GND and 3V3') +W('TACH_GPIO', 'D1.3', (358.14, YT)); J(358.14, YT) +comp('C2', 'Device', 'C', 375.92, 78.74, 0, 'DNP', 'Capacitor_SMD:C_0805_2012Metric', + {'1': 'TACH_GPIO', '2': 'GND'}, 'DNP/TBD', 'Footprint only for a later glitch filter; value from scope data', dnp=True) +W('TACH_GPIO', 'C2.1', (375.92, YT)); J(375.92, YT) +tpw('TP9', 386.08, 60.96, 'TACH_GPIO', YT) +tp('TP10', 386.08, 91.44, '3V3') +tp('TP11', 398.78, 91.44, 'GND') +note(275.59, 86.36, + 'Sensor, Sanyo spec 9D0001H202: open collector,', + ' VCE <= 27.6 V, IC <= 5 mA, VCE(sat) <= 0.8 V.', + ' Spec suggests 2 pulses/rev; configured PPR stays 0', + ' (unknown) until an optical RPM check on the specimen.', + 'Default JP3 OPEN, JP4 OPEN: raw tach sees only TP8.', + 'JP3: R3 10k to 3V3 -> 0.33 mA sink (IC max 5 mA).', + 'JP4: R4 22k, D1 clamp, R5 470k. High ~3.09 V (VIH', + ' 2.475 V); low <= 0.76 V at VCE(sat) 0.8 V (VIL 0.825 V).', + 'Back-power if the tach lead is faulted to 26.4 V:', + ' R4/D1 <= 1.2 mA, R3 (JP3) <= 2.7 mA into 3V3.', + 'RULE: controller 3V3 ON before JP3/JP4 close; keep it', + ' on until fan power is off or JP3/JP4 are open.', + 'C2 DNP (no glitch filter). Internal pull-up stays OFF.') + +# ================= 4. 24 V fan supply and ground topology (main line y = 154.94) +YP = 154.94 +comp('J2', 'Connector', 'Screw_Terminal_01x02', 43.18, 157.48, 0, 'BENCH_PSU', + 'TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2-5.08_1x02_P5.08mm_Horizontal', + {'1': 'BENCH_24V', '2': 'BENCH_GND'}, 'PROVISIONAL', 'Current-limited 24 V bench supply. Pin 1 BENCH_24V, pin 2 BENCH_GND') +W('BENCH_24V', (50.8, YP), 'F1.1'); L('BENCH_24V', 50.8, YP) +comp('F1', 'Device', 'Fuse', 76.2, YP, 90, 'Fuse TBD', + 'Fuse:Fuseholder_Clip-5x20mm_Littelfuse_111_Inline_P20.00x5.00mm_D1.05mm_Horizontal', + {'1': 'BENCH_24V', '2': '24V_FUSED'}, 'DNP/TBD', '5x20 mm holder; element rating TBD until startup/locked-rotor current is measured') +tpw('TP12', 66.04, 147.32, 'BENCH_24V', YP) +comp('JP5', 'Jumper', 'Jumper_2_Bridged', 111.76, YP, 0, 'I_MEAS', HDR2, + {'1': '24V_FUSED', '2': 'FAN_24V'}, 'PROVISIONAL', 'Link fitted, or remove and insert a series ammeter', default='FITTED') +W('24V_FUSED', 'F1.2', 'JP5.1'); L('24V_FUSED', 81.28, YP) +comp('R6', 'Device', 'R', 99.06, 165.1, 0, '10k', R0805, + {'1': '24V_FUSED', '2': 'LED_A'}, 'PROVISIONAL', 'LED current limit') +W('24V_FUSED', 'R6.1', (99.06, YP)); J(99.06, YP) +comp('D2', 'Device', 'LED', 99.06, 180.34, 90, 'LED green', 'LED_SMD:LED_0805_2012Metric', + {'2': 'LED_A', '1': 'BENCH_GND'}, 'PROVISIONAL', '24 V present (upstream of I_MEAS)') +W('LED_A', 'R6.2', 'D2.2'); L('LED_A', 99.06, 172.72) +W('FAN_24V', 'JP5.2', (152.4, YP)); L('FAN_24V', 152.4, YP) +tpw('TP13', 124.46, 147.32, 'FAN_24V', YP) +comp('C1', 'Device', 'C_Polarized', 137.16, 165.1, 0, 'DNP', 'Capacitor_THT:CP_Radial_D6.3mm_P2.50mm', + {'1': 'FAN_24V', '2': 'FAN_GND'}, 'DNP/TBD', 'Optional bulk capacitor at the fan terminal; fitted only for a measured need', dnp=True) +W('FAN_24V', 'C1.1', (137.16, YP)); J(137.16, YP) +tp('TP14', 165.1, 165.1, 'FAN_GND') +XS = 43.18 +W('BENCH_GND', (30.48, 205.74), (XS, 205.74)); L('BENCH_GND', 30.48, 205.74) +W('BENCH_GND', (XS, 198.12), (XS, 213.36)); J(XS, 205.74) +comp('NT1', 'Device', 'NetTie_2', 53.34, 198.12, 0, 'NetTie', 'NetTie:NetTie-2_SMD_Pad2.0mm', + {'1': 'BENCH_GND', '2': 'FAN_GND'}, 'FINAL', 'Star point: fan power-return branch') +comp('NT2', 'Device', 'NetTie_2', 53.34, 213.36, 0, 'NetTie', 'NetTie:NetTie-2_SMD_Pad0.5mm', + {'1': 'BENCH_GND', '2': 'GND'}, 'FINAL', 'Star point: signal/controller reference branch') +W('BENCH_GND', (XS, 198.12), 'NT1.1'); W('BENCH_GND', (XS, 213.36), 'NT2.1') +note(19.05, 226.06, + 'Ground topology: single star point at J2.2 through NT1/NT2.', + ' FAN_GND: fan supply return only. GND: Q1 source, tach clamp/pulldowns, J1.4, scope ground.', + ' Fan motor current never flows in GND; the <= 2 mA PWM and tach currents return through the star.', + ' Controller USB ground meets the PSU negative ONLY here: use a floating PSU output.', + 'F1: 5x20 holder; rating TBD until startup/locked-rotor current is measured. The bench PSU current', + ' limit is the first protection during characterization (holder may carry a labelled 0R link).', + 'JP5 I_MEAS: remove link to insert an ammeter. D2/R6 (~2.2 mA) sit upstream of JP5.', + 'No reverse-polarity element: confirm polarity at TP12 before landing the fan. C1 DNP.') + +# ================= 5. Fan connector +comp('J3', 'Connector', 'Screw_Terminal_01x04', 251.46, 157.48, 0, 'FAN_DUT', + 'TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-4-5.08_1x04_P5.08mm_Horizontal', + {'1': 'FAN_24V', '2': 'FAN_GND', '3': 'FAN_PWM_RAW', '4': 'FAN_TACH_RAW'}, 'PROVISIONAL', + 'Fixture-side terminal, one lead per position by VERIFIED function; the DUT lead order/colours are not assumed') +note(222.25, 187.96, + 'J3 positions are fixture functions,', + "not the fan's physical wire order.", + 'Land each lead only after it is', + 'identified on the specimen by', + 'photo + continuity + manufacturer', + 'documentation.', + 'Catalog convention / not yet', + 'verified on specimen:', + ' red +, black -, brown PWM,', + ' yellow sensor.') + +# ================= 6. Test points / configuration jumpers +note(298.45, 140.97, + 'Jumpers (Rev 0 shipping state)', + 'JP1 GATE_EN OPEN MCU_PWM -> R1/Q1 gate', + 'JP2 PWM_LINE_EN OPEN Q1 drain -> FAN_PWM_RAW', + 'JP3 TACH_PU_EN OPEN R3 3V3 pull-up on raw tach', + 'JP4 TACH_GPIO_EN OPEN raw tach -> R4/D1/R5 -> GPIO', + 'JP5 I_MEAS FITTED 24V_FUSED -> FAN_24V', + '', + 'Test points', + 'TP12 BENCH_24V TP13 FAN_24V TP14 FAN_GND', + 'TP1, TP10 3V3 TP2, TP7, TP11 GND', + 'TP3 PWM_IN (signal-generator injection with JP1 open)', + 'TP4 PWM_GATE TP5 PWM_DRAIN TP6 FAN_PWM_RAW', + 'TP8 FAN_TACH_RAW TP9 TACH_GPIO', + '', + '25 kHz is the manufacturer-specified control frequency', + 'for 9GA0424P3J001; bench characterization still', + 'verifies specimen behaviour. Configured PPR = 0 (unknown).', + 'Not defined here: JumpJet GPIOs, thresholds, startup', + 'duty, stall limits, fan-safety policy.') diff --git a/hardware/fan-characterization-fixture/generator/sexp.py b/hardware/fan-characterization-fixture/generator/sexp.py new file mode 100644 index 0000000..7171a51 --- /dev/null +++ b/hardware/fan-characterization-fixture/generator/sexp.py @@ -0,0 +1,114 @@ +"""Minimal S-expression reader/writer for KiCad library and schematic files.""" +import os, re + +# KiCad 9 symbol libraries; verify.sh runs this inside the pinned kicad/kicad:9.0 image. +SYMBOL_DIR = os.environ.get('KICAD_SYMBOL_DIR', '/usr/share/kicad/symbols') +TOK = re.compile(r'\s*(?:(\()|(\))|("(?:[^"\\]|\\.)*")|([^\s()"]+))') +class Sym(str): + """A bare atom (keyword, number, flag). dump() writes it unquoted; a plain str is quoted.""" +ESC = re.compile(r'\\(.)', re.S) +UNESC = {'\\': '\\', '"': '"', 'n': '\n'} +def unq(s): + """Decode the body of a quoted string in one pass, reversing exactly what q() escapes. + + \\\\, \\" and \\n become a backslash, a quote and a newline. Any other escape, + such as \\x, is kept as written, so text parse() cannot interpret survives unchanged. + """ + return ESC.sub(lambda m: UNESC.get(m.group(1), m.group(0)), s) +def parse(text): + """Parse KiCad S-expression text into nested lists; returns the list of top-level forms. + + Only the subset KiCad writes: parentheses, double-quoted strings (decoded by unq()) + and bare atoms. Atoms, numbers included, stay Sym strings, so parse -> dump + reproduces every token, provided strings use only the escapes q() writes (an + unknown escape such as \\x is kept by parse but dumped as \\\\x). Whitespace + and line layout are dump()'s own. + There is no error reporting: the input is trusted KiCad output, and parsing just + stops at the first text that is not a token. + """ + pos = 0; stack = [[]] + while True: + m = TOK.match(text, pos) + if not m or m.end() == pos: break + pos = m.end() + if m.group(1): stack.append([]) + elif m.group(2): + l = stack.pop(); stack[-1].append(l) + elif m.group(3): stack[-1].append(unq(m.group(3)[1:-1])) + else: stack[-1].append(Sym(m.group(4))) + return stack[0] +def q(s): + """Quote a str for KiCad. Escapes only backslash, quote and newline; unq() reverses it.""" + return '"' + s.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n') + '"' +def dump(x, ind=0): + """Serialise a parse()/build tree: Sym bare, str via q(), int/float via fmt(). + + A list goes on one line if that is under 100 characters, otherwise one child + per line indented two spaces per level, the layout the checked-in schematic uses. + """ + if isinstance(x, list): + inner = [dump(e, ind + 1) for e in x] + one = '(' + ' '.join(inner) + ')' + if len(one) < 100 and '\n' not in one: return one + return '(' + inner[0] + ''.join('\n' + ' ' * (ind + 1) + i for i in inner[1:]) + ')' + if isinstance(x, Sym): return str(x) + if isinstance(x, (int, float)): return fmt(x) + return q(x) +def fmt(v): + """Format a number: floats to at most 4 decimals with trailing zeros and "-0" removed.""" + if isinstance(v, float): + s = ('%.4f' % v).rstrip('0').rstrip('.') + return '0' if s in ('-0', '') else s + return str(v) +def find(lst, head): + return [e for e in lst if isinstance(e, list) and e and e[0] == head] +_libcache = {} +def libsym(lib, name): + """Return symbol NAME from LIB.kicad_sym in SYMBOL_DIR, as written in the library. + + Each library file is parsed once and cached. Raises KeyError if the library has no + such symbol. A derived symbol still carries (extends ...); use flat() to embed it. + """ + if lib not in _libcache: + _libcache[lib] = parse(open(os.path.join(SYMBOL_DIR, f'{lib}.kicad_sym')).read())[0] + for s in find(_libcache[lib], 'symbol'): + if s[1] == name: return s + raise KeyError(name) +def pins(sym): + """List every pin in SYM and its unit sub-symbols, in library coordinates. + + Each is a dict: num, name, x, y, rot (degrees, 0 if omitted) and the electrical + type. Pass flat()'s result for a derived symbol; libsym() alone has no pins for it. + """ + out = [] + def walk(n): + for e in n: + if isinstance(e, list) and e and e[0] == 'pin': + at = find(e, 'at')[0]; num = find(e, 'number')[0][1]; nm = find(e, 'name')[0][1] + out.append(dict(num=num, name=nm, x=float(at[1]), y=float(at[2]), rot=float(at[3]) if len(at) > 3 else 0.0, type=str(e[1]))) + elif isinstance(e, list): walk(e) + walk(sym); return out +def flat(lib, name): + """Return LIB:NAME with (extends ...) resolved, as eeschema embeds a derived symbol. + + The result is the parent's body under the child's name: the child's properties + replace same-named parent ones, child-only properties follow the parent's, and unit + sub-symbols are renamed from the parent's prefix to NAME. Chains resolve recursively. + """ + s = libsym(lib, name) + ext = find(s, 'extends') + if not ext: return s + parent = flat(lib, ext[0][1]) + out = [s[0], name] + child_props = {p[1]: p for p in find(s, 'property')} + for e in parent[2:]: + if isinstance(e, list) and e and e[0] == 'property': + out.append(child_props.pop(e[1], e)) + elif isinstance(e, list) and e and e[0] == 'symbol': + sub = list(e); sub[1] = name + sub[1][len(parent[1]):]; out.append(sub) + else: + out.append(e) + # Child-only properties go after the parent's, before the unit bodies. + idx = max(i for i, e in enumerate(out) if isinstance(e, list) and e and e[0] == 'property') + 1 + out[idx:idx] = list(child_props.values()) + return out diff --git a/hardware/fan-characterization-fixture/verify.sh b/hardware/fan-characterization-fixture/verify.sh new file mode 100755 index 0000000..f427235 --- /dev/null +++ b/hardware/fan-characterization-fixture/verify.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# Regenerate and verify the fan-characterization fixture schematic. +# +# ./verify.sh check: the checked-in .kicad_sch/.kicad_pro are exactly what +# generator/ produces, ERC is clean, and the extracted netlist +# matches generator/fixture.py and generator/expected-nets.txt +# ./verify.sh --update regenerate .kicad_sch, .kicad_pro, .pdf and .svg, run the same +# checks on the regenerated files, and copy them into place only +# if every check passes; on any failure the fixture is unchanged +# +# Everything runs inside one pinned KiCad 9 image, so the generator reads the same +# symbol libraries that ERC checks against. ERC report and netlist go to a temporary +# directory (printed at the end); they are validation output, not source. +set -euo pipefail + +IMAGE="kicad/kicad:9.0@sha256:e638b79b0321f29395a5b783e94bb9f3c73303e8da15da27b8f5cb4b67a37729" +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +NAME=fan-characterization-fixture +MODE=check +case "${1:-}" in + "") ;; + --update) MODE=update ;; + *) echo "usage: $0 [--update]" >&2; exit 2 ;; +esac +# Private to this user (mktemp's 0700); the container runs as the same uid, so it can write here. +OUT="$(mktemp -d "${TMPDIR:-/tmp}/fixture-verify.XXXXXX")" +# Check mode only reads the fixture; --update copies regenerated files back into it. +FIXTURE_MOUNT="$HERE:/fixture:ro" +[ "$MODE" = update ] && FIXTURE_MOUNT="$HERE:/fixture" + +docker run --rm --network none -u "$(id -u):$(id -g)" \ + -v "$FIXTURE_MOUNT" -v "$OUT:/out" -e MODE="$MODE" -e NAME="$NAME" \ + "$IMAGE" bash -euo pipefail -c ' + # kicad-cli needs the image'\''s global library tables; give any uid a writable HOME with them. + export HOME=/tmp/home && mkdir -p $HOME/.config/kicad/9.0 + cp /home/kicad/.config/kicad/9.0/*-lib-table $HOME/.config/kicad/9.0/ + kicad-cli version | sed "s/^/kicad-cli /" + mkdir -p /out/gen + cd /fixture/generator && PYTHONDONTWRITEBYTECODE=1 python3 build_schematic.py /out/gen + if [ "$MODE" = check ]; then + for f in $NAME.kicad_sch $NAME.kicad_pro; do + cmp -s /out/gen/$f /fixture/$f || { echo "STALE: $f differs from generator output (run ./verify.sh --update)"; exit 1; } + done + echo "generator: checked-in $NAME.kicad_sch and $NAME.kicad_pro reproduce byte for byte" + fi + # Every check runs on the generated copy in /out/gen. In check mode it is byte-identical + # to the checked-in files (compared above); in update mode it is what will be copied in. + cd /out/gen + kicad-cli sch erc --severity-all --format report -o /out/erc.rpt $NAME.kicad_sch >/dev/null + grep "ERC messages" /out/erc.rpt | sed "s/^ *\*\* /ERC: /" + grep -q "ERC messages: 0 Errors 0 Warnings 0" /out/erc.rpt || { cat /out/erc.rpt; exit 1; } + kicad-cli sch export netlist --format kicadxml -o /out/netlist.xml $NAME.kicad_sch >/dev/null + python3 /fixture/generator/check_netlist.py /out/netlist.xml /out/gen/intent.json /fixture/generator/expected-nets.txt + kicad-cli sch export pdf -o /out/$NAME.pdf $NAME.kicad_sch >/dev/null + kicad-cli sch export svg -o /out $NAME.kicad_sch >/dev/null + # Reached only when every check above passed (bash -e): now update the fixture. + if [ "$MODE" = update ]; then + cp /out/gen/$NAME.kicad_sch /out/gen/$NAME.kicad_pro /out/$NAME.pdf /out/$NAME.svg /fixture/ + echo "updated: .kicad_sch .kicad_pro .pdf .svg" + fi + ' +echo "validation output: $OUT (erc.rpt, netlist.xml, $NAME.pdf, $NAME.svg)" diff --git a/tests/test_fixture_sexp.py b/tests/test_fixture_sexp.py new file mode 100644 index 0000000..5aac75e --- /dev/null +++ b/tests/test_fixture_sexp.py @@ -0,0 +1,46 @@ +import importlib.util +import unittest +from pathlib import Path + +SEXP = Path(__file__).resolve().parents[1] / "hardware/fan-characterization-fixture/generator/sexp.py" +_spec = importlib.util.spec_from_file_location("fixture_sexp", SEXP) +sexp = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(sexp) + + +class StringEscapeTests(unittest.TestCase): + """parse() must decode exactly the escapes q() writes, so library text survives parse -> dump.""" + + CASES = { + "plain": "Resistor", + "quote": 'say "hi"', + "backslash": "C:\\path", + "newline": "line one\nline two", + "escaped backslash before n": "\\n", + "all together": 'a\\b "c"\nd', + } + + def test_quoted_strings_round_trip(self): + for name, text in self.CASES.items(): + with self.subTest(name): + self.assertEqual(sexp.parse(sexp.q(text)), [text]) + + def test_parse_then_dump_is_unchanged(self): + for name, text in self.CASES.items(): + with self.subTest(name): + source = "(property " + sexp.q(text) + ")" + self.assertEqual(sexp.dump(sexp.parse(source)[0]), source) + + def test_newline_escape_decodes_to_a_newline(self): + self.assertEqual(sexp.parse(r'"a\nb"'), ["a\nb"]) + + def test_unknown_escape_is_kept_as_written(self): + self.assertEqual(sexp.parse(r'"a\xb"'), ["a\\xb"]) + + def test_unknown_escape_is_dumped_with_its_backslash_escaped(self): + # parse() keeps the backslash as text, so q() escapes it on the way out. + self.assertEqual(sexp.dump(sexp.parse(r'"a\xb"')[0]), r'"a\\xb"') + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_fixture_verify_script.py b/tests/test_fixture_verify_script.py new file mode 100644 index 0000000..0b7ee5c --- /dev/null +++ b/tests/test_fixture_verify_script.py @@ -0,0 +1,29 @@ +import re +import unittest +from pathlib import Path + +VERIFY = (Path(__file__).resolve().parents[1] / "hardware/fan-characterization-fixture/verify.sh").read_text() + + +class VerifyScriptTests(unittest.TestCase): + """verify.sh needs Docker and KiCad, so CI checks its structure; the behaviour is run by hand.""" + + def test_update_copies_into_the_fixture_only_after_every_check(self): + copies = [m.start() for m in re.finditer(r"\bcp [^\n]*/fixture/", VERIFY)] + self.assertEqual(len(copies), 1, "one copy-back, at the end") + for step in ("kicad-cli sch erc", "ERC messages: 0 Errors 0 Warnings 0", + "check_netlist.py", "kicad-cli sch export pdf", "kicad-cli sch export svg"): + self.assertLess(VERIFY.index(step), copies[0], step) + + def test_checks_run_on_the_generated_schematic(self): + self.assertLess(VERIFY.index("cd /out/gen"), VERIFY.index("kicad-cli sch erc")) + + def test_fixture_is_read_only_in_check_mode_and_output_stays_private(self): + self.assertIn('FIXTURE_MOUNT="$HERE:/fixture:ro"', VERIFY) + self.assertIn('[ "$MODE" = update ] && FIXTURE_MOUNT="$HERE:/fixture"', VERIFY) + self.assertNotIn("chmod 777", VERIFY) + self.assertIn("--network none", VERIFY) + + +if __name__ == "__main__": + unittest.main()