[UNVERIFIED] Astra diagram pass

This commit is contained in:
2026-09-10 23:39:49 +02:00
parent 45c0d7f8ec
commit 31b3595ac0
81 changed files with 3762 additions and 192 deletions
+13 -22
View File
@@ -68,13 +68,14 @@ external analogue-pin pool, so they increase concurrent conversion capacity
rather than doubling the number of physical sensor pins. The proposed V1 rather than doubling the number of physical sensor pins. The proposed V1
allocation occupies 16 conditioned ADC channels: allocation occupies 16 conditioned ADC channels:
```text | Conditioned ADC input class | Channels |
4 thermistor inputs | --- | ---: |
9 general 0-5 V inputs | Thermistors | 4 |
1 VBAT_PROT sense input | General 05 V inputs | 9 |
1 +5V_SENS sense input | `VBAT_PROT` sense | 1 |
1 +12V_SENS sense input | `+5V_SENS` sense | 1 |
``` | `+12V_SENS` sense | 1 |
| **Total** | **16** |
This leaves meaningful MCU ADC and pin margin, but the final STM32 package and This leaves meaningful MCU ADC and pin margin, but the final STM32 package and
pin assignment must reserve all analogue pins alongside timer, CAN, debug, pin assignment must reserve all analogue pins alongside timer, CAN, debug,
@@ -90,11 +91,7 @@ because an open thermistor drives the node towards 5 V. Firmware calculates the
thermistor resistance from the ratio of its ADC result to the `+5V_SENS` ADC thermistor resistance from the ratio of its ADC result to the `+5V_SENS` ADC
result, then applies the calibration map for the selected sensor. result, then applies the calibration map for the selected sensor.
```text ![Thermistor](diagrams/thermistor.svg)
+5V_SENS -- precision pull-up --+-- thermistor -- sensor ground
|
attenuation/filter --> ADC
```
The pull-up value is selected from the actual NTC curve and required The pull-up value is selected from the actual NTC curve and required
temperature range, balancing resolution against self-heating. The attenuation temperature range, balancing resolution against self-heating. The attenuation
@@ -169,13 +166,9 @@ released. It has two independent destinations:
- `DEADMAN_OK` is combined in hardware with the MCU's `MCU_RUN_PERMIT` output - `DEADMAN_OK` is combined in hardware with the MCU's `MCU_RUN_PERMIT` output
to produce `ENGINE_PERMIT`. to produce `ENGINE_PERMIT`.
```text ![Deadman inputs](diagrams/deadman-inputs.svg)
deadman contact A --> protected input --> DEADMAN_A_HELD --------+
+--> valid-state logic --> DEADMAN_OK --+ ![Deadman permit](diagrams/deadman-permit.svg)
deadman contact B --> protected input --> inverted --> DEADMAN_B_RELEASED -+ |
AND --> ENGINE_PERMIT
MCU_RUN_PERMIT ----------------------------------------------------------------------------------------------+
```
`ENGINE_PERMIT` controls the enable inputs of the injector and ignition drivers `ENGINE_PERMIT` controls the enable inputs of the injector and ignition drivers
where those inputs are provided. If a selected driver has no suitable enable where those inputs are provided. If a selected driver has no suitable enable
@@ -239,9 +232,7 @@ only when the selected external starter switch accepts that interface.
Analogue output is not a V1 functional requirement. Reserve two MCU pins and Analogue output is not a V1 functional requirement. Reserve two MCU pins and
board footprints for future 0-5 V outputs. The intended future path is: board footprints for future 0-5 V outputs. The intended future path is:
```text ![Dac output](diagrams/dac-output.svg)
DAC --> rail-to-rail buffer --> protection / series impedance --> connector
```
A true calibrated 0-5 V output may require an external 5 V-referenced DAC or A true calibrated 0-5 V output may require an external 5 V-referenced DAC or
a suitably characterised buffer stage. A general 0-12 V analogue output is not a suitably characterised buffer stage. A general 0-12 V analogue output is not
+2 -12
View File
@@ -9,13 +9,7 @@ use `SENSOR_GND` and are kept separate from ignition/injector return currents.
## General 0--5 V channels ## General 0--5 V channels
```text ![Analog input](../diagrams/analog-input.svg)
connector -- transient clamp -- R_TOP --+-- ADC-local C_HOLD -- ADC
|
R_BOTTOM
|
SENSOR_GND
```
`R_TOP` is the divider's upper resistor; do not add a separate series `R_TOP` is the divider's upper resistor; do not add a separate series
`R_PROT` in the normal passive channel. It is the element that limits current `R_PROT` in the normal passive channel. It is the element that limits current
@@ -45,11 +39,7 @@ of `+5V_SENS` and sample it close to the sensor channel.
## NTC temperature channels ## NTC temperature channels
```text ![Thermistor](../diagrams/thermistor.svg)
+5V_SENS -- R_PULLUP --+-- NTC -- SENSOR_GND
|
attenuator / local filter --> ADC
```
The attenuator and ADC protection are required even if a normal temperature The attenuator and ADC protection are required even if a normal temperature
range appears below 3.3 V: an open thermistor raises the node to `+5V_SENS`. range appears below 3.3 V: an open thermistor raises the node to `+5V_SENS`.
+4 -15
View File
@@ -48,22 +48,11 @@ not the safety-critical shutoff path.
The permission gates operate from `+5V_MAIN` and accept 3.3 V MCU logic The permission gates operate from `+5V_MAIN` and accept 3.3 V MCU logic
levels. Their outputs are 5 V logic levels. levels. Their outputs are 5 V logic levels.
```text ![Deadman inputs](../diagrams/deadman-inputs.svg)
protected 5 V --> independent NO contact A --> protected A input
+--> 3.3 V --> DEADMAN_A_STATUS --> MCU
`--> 5 V --> DEADMAN_A_HELD -----+
|
protected 5 V --> independent NO contact B --> protected B input +--> AND --> DEADMAN_OK --+
+--> 3.3 V --> DEADMAN_B_STATUS --> MCU ^ |
`--> inverter --> DEADMAN_B_RELEASED -- NOT-+ |
|
MCU_RUN_PERMIT ---------------------------------------------------------------------------------------------AND --> ENGINE_PERMIT --+
|
ignition-permission inverter
--> SAFE_IGNITION_INHIBIT
MCU_INJECTOR_SIG -------------------------------------------------------------------------------------------AND --> SAFE_INJECTOR_SIG ![Deadman permit](../diagrams/deadman-permit.svg)
```
![Deadman outputs](../diagrams/deadman-outputs.svg)
The logic equations are: The logic equations are:
@@ -113,9 +113,6 @@ The comparator's 40 V fail-safe input capability eliminates power-backfeed
through the comparator; it does not replace harness fault protection. Every through the comparator; it does not replace harness fault protection. Every
channel shall include the following protection functions: channel shall include the following protection functions:
The right-hand side of the figure above shows the required functional
protection arrangement.
- **Primary positive clamp:** use a connector-side TVS or equivalent - **Primary positive clamp:** use a connector-side TVS or equivalent
protection element. Its working standoff shall exceed the 16.8 V maximum protection element. Its working standoff shall exceed the 16.8 V maximum
normal battery input. Its worst-case dynamic clamp voltage, including normal battery input. Its worst-case dynamic clamp voltage, including
+4 -29
View File
@@ -22,15 +22,7 @@ may use either class only when the external starter interface accepts it.
Use the automotive-qualified TI `TPS4H000-Q1` quad smart high-side switch. Use the automotive-qualified TI `TPS4H000-Q1` quad smart high-side switch.
It is supplied from `+5V_AUX`, not directly from `+5V_MAIN`. It is supplied from `+5V_AUX`, not directly from `+5V_MAIN`.
```text ![Logic output](../diagrams/logic-output.svg)
+5V_MAIN --> +5V_AUX eFuse / load switch --> TPS4H000-Q1 VBB
|
MCU GPIO --> TPS4H000-Q1 INx OUTx --> LOGIC_OUTx --> connector
| |
R_IN_PD R_OUT_PD
| |
GND GND
```
- `+5V_AUX` isolates an external logic-output fault from `+5V_MAIN`, the MCU, - `+5V_AUX` isolates an external logic-output fault from `+5V_MAIN`, the MCU,
and the sensor-excitation rail. and the sensor-excitation rail.
@@ -67,28 +59,11 @@ fault and transient specification before schematic freeze.
Use the automotive-qualified Infineon `TLE9104SH` smart quad low-side switch. Use the automotive-qualified Infineon `TLE9104SH` smart quad low-side switch.
It drives battery-domain loads supplied from `VBAT_PROT`. It drives battery-domain loads supplied from `VBAT_PROT`.
```text ![Sink power](../diagrams/sink-power.svg)
VBAT_PROT --> external load --> SINK_OUTx --> TLE9104SH OUTx
|
internal low-side MOSFET
|
OUT_PGND --> power-entry ground star
VBAT_PROT --> TLE9104SH VS +5V_MAIN --> TLE9104SH VDD ![Sink interfaces](../diagrams/sink-interfaces.svg)
+3V3_MAIN --> TLE9104SH VIO
MCU GPIO --> TLE9104SH INx MCU SPI <--> TLE9104SH SPI ![Sink command](../diagrams/sink-command.svg)
| |
R_IN_PD diagnostics
|
TLE9104SH local ground reference
MCU enable --> TLE9104SH EN
|
R_EN_PD
|
TLE9104SH local ground reference
```
- The TLE9104SH supplies active inductive-load clamping, configurable - The TLE9104SH supplies active inductive-load clamping, configurable
overcurrent protection, short-circuit and thermal protection, direct channel overcurrent protection, short-circuit and thermal protection, direct channel
@@ -39,18 +39,7 @@ freezing `R_PULLUP`. The crank-sensor part number remains to be selected.
## Electrical interface ## Electrical interface
```text ![Trigger input](../diagrams/trigger-input.svg)
ECU
+12V_SENS ------------------------+--------------------------> sensor supply
SENSOR_GND ---------------------------------------------------> sensor return
|
+12V_SENS -- R_PULLUP -- TRIG_x ---+-- connector -- sensor output
|
+-- connector-side transient protection
+-- R_DIV_TOP --+-- Schmitt buffer --> 3.3 V timer input
+-- R_DIV_BOTTOM -- SENSOR_GND
+-- C_FILTER ------ SENSOR_GND
```
- Supply the sensor from `+12V_SENS`; its rail generation, protection, current - Supply the sensor from `+12V_SENS`; its rail generation, protection, current
limit, and diagnostics belong to `POWER_ARCHITECTURE.md`. limit, and diagnostics belong to `POWER_ARCHITECTURE.md`.
+4 -34
View File
@@ -14,13 +14,7 @@ confirmed.
## Power path ## Power path
```text ![Ignition power](../diagrams/ignition-power.svg)
VBAT_PROT --> coil primary --> VBG08H HVC
|
internal IGBT
|
PGND1 + PGND2 --> IGN_PGND --> power-entry ground
```
- `HVC` connects to one coil-primary terminal; the other terminal connects to - `HVC` connects to one coil-primary terminal; the other terminal connects to
`VBAT_PROT`. `VBAT_PROT`.
@@ -37,23 +31,7 @@ VBAT_PROT --> coil primary --> VBG08H HVC
`INP` is active high: a rising edge begins coil dwell and a falling edge `INP` is active high: a rising edge begins coil dwell and a falling edge
causes the normal spark event. causes the normal spark event.
```text ![Ignition command](../diagrams/ignition-command.svg)
STM32 ignition timing output
--> 3.3 V-to-5 V non-inverting buffer --> 1 kOhm --> INP
|
low-capacitance
Zener clamp
|
VBG local Kelvin-ground reference
SAFE_IGNITION_INHIBIT
--> 1 kOhm --> EN
|
low-capacitance
Zener clamp
|
VBG local Kelvin-ground reference
```
The VBG08H-E input-high requirement is 3 V. A 5 V buffer is used rather than The VBG08H-E input-high requirement is 3 V. A 5 V buffer is used rather than
direct STM32 drive to preserve high-level margin across MCU output tolerance, direct STM32 drive to preserve high-level margin across MCU output tolerance,
@@ -91,9 +69,7 @@ and must not create a path that can pull `EN` low during a fault.
internal threshold and releases when the current reaches the nominal 6.5 A internal threshold and releases when the current reaches the nominal 6.5 A
threshold. The threshold is not externally programmable. threshold. The threshold is not externally programmable.
```text ![Ignition flag](../diagrams/ignition-flag.svg)
VBG08H C.F. --> reference-style R/C filter and 3.3 V pull-up --> STM32 GPIO
```
The pull-up voltage must not exceed 5.5 V; `+3V3_MAIN` is suitable. The signal The pull-up voltage must not exceed 5.5 V; `+3V3_MAIN` is suitable. The signal
is a diagnostic confirmation of primary-current buildup and is not part of the is a diagnostic confirmation of primary-current buildup and is not part of the
@@ -105,13 +81,7 @@ maximum dwell time.
Define `IGN_PGND` as the ignition module's high-current return domain. Define `IGN_PGND` as the ignition module's high-current return domain.
```text ![Ignition ground](../diagrams/ignition-ground.svg)
PGND1 -- matched heavy copper --+
+--> IGN_PGND local joining point --> power-entry ground
PGND2 -- matched heavy copper --+
|
VBG08H GND -- short, separate Kelvin reference trace --+
```
- `PGND1` and `PGND2` must use equal-length, equal-width, and similarly - `PGND1` and `PGND2` must use equal-length, equal-width, and similarly
shaped copper paths to the `IGN_PGND` joining point. The VBG08H-E uses these shaped copper paths to the `IGN_PGND` joining point. The VBG08H-E uses these
+4 -19
View File
@@ -13,13 +13,7 @@ low-impedance injector requires a different architecture.
## Power path ## Power path
```text ![Injector power](../diagrams/injector-power.svg)
VBAT_PROT --> injector positive terminal --> injector coil --> VNL5050 DRAIN
|
internal low-side MOSFET
|
SOURCE --> INJ_PGND --> power-entry ground
```
- The injector's positive terminal connects to `VBAT_PROT`; its negative - The injector's positive terminal connects to `VBAT_PROT`; its negative
terminal connects to `DRAIN`. terminal connects to `DRAIN`.
@@ -37,12 +31,7 @@ VBAT_PROT --> injector positive terminal --> injector coil --> VNL5050 DRAIN
`INPUT` is active high. It receives only the hardware-permitted injector `INPUT` is active high. It receives only the hardware-permitted injector
command defined by the two-channel deadman interlock. command defined by the two-channel deadman interlock.
```text ![Injector command](../diagrams/injector-command.svg)
SAFE_INJECTOR_SIG --> 1 kOhm Rprot --> INPUT
|-- 10 kOhm ---------> INJ_PGND
`-- low-capacitance
Zener clamp ------> INJ_PGND
```
```text ```text
SAFE_INJECTOR_SIG = ENGINE_PERMIT AND MCU_INJECTOR_SIG SAFE_INJECTOR_SIG = ENGINE_PERMIT AND MCU_INJECTOR_SIG
@@ -70,9 +59,7 @@ status inputs disagree.
`STATUS` is an open-drain diagnostic output. It is read by the MCU through a `STATUS` is an open-drain diagnostic output. It is read by the MCU through a
1 kOhm protection resistor and a `+3V3_MAIN` pull-up. 1 kOhm protection resistor and a `+3V3_MAIN` pull-up.
```text ![Injector status](../diagrams/injector-status.svg)
+3V3_MAIN pull-up --> MCU-side status node --> 1 kOhm Rprot --> STATUS
```
The 3.3 V pull-up is within the pin rating and provides a safe MCU logic level. The 3.3 V pull-up is within the pin rating and provides a safe MCU logic level.
The diagnostic path supports off-state open-load detection and indicates The diagnostic path supports off-state open-load detection and indicates
@@ -84,9 +71,7 @@ separate, unambiguous MCU-readable short-circuit/current-limit indication.
Define `INJ_PGND` as the injector module's high-current return domain. Define `INJ_PGND` as the injector module's high-current return domain.
```text ![Injector ground](../diagrams/injector-ground.svg)
VNL5050 SOURCE --> short, low-impedance INJ_PGND copper --> power-entry ground star
```
- `INJ_PGND` runs directly to the power-entry ground star, where it joins the - `INJ_PGND` runs directly to the power-entry ground star, where it joins the
battery return, `IGN_PGND`, `DGND`, and sensor return domains. battery return, `IGN_PGND`, `DGND`, and sensor return domains.
+4 -46
View File
@@ -25,39 +25,9 @@ part numbers remain to be selected after the loads and packaging are confirmed.
## Rail Tree ## Rail Tree
```text ![Power sources](diagrams/power-sources.svg)
4S LiPo
|
+-- input fuse, reverse-polarity protection, TVS/transient protection
|
+-- VBAT_PROT ---------------------------------> ignition branch
| injector branch
| protected low-side outputs
| protected VBAT sense
|
+-- synchronous buck --------------------------> +5V_MAIN
| | internal 5 V circuitry
| |
| +-- eFuse / load switch ------------------> +5V_AUX
| | external logic-level outputs
| |
| +-- eFuse / load switch, ferrite/filter --> +5V_SENS
| protected sensor supply
|
+-- synchronous buck --------------------------> +3V3_MAIN
| | MCU digital supplies
| | 3.3 V logic / communications
| |
| +-- ferrite bead / filtering -------------> +5V_AUX
| MCU analogue domain
| analogue front ends
| ADC reference
|
+-- regulated buck-boost ----------------------> +12V_SENS
12 V sensor supply
crank/cam Hall sensors
``` ![Power branches](diagrams/power-branches.svg)
## Input and Raw-Battery Domain ## Input and Raw-Battery Domain
@@ -148,13 +118,7 @@ to track `+5V_SENS`. Therefore 5 V ratiometric sensor readings are made
ratiometric in measurement and firmware rather than by requiring a fixed ratiometric in measurement and firmware rather than by requiring a fixed
relationship between the rails. relationship between the rails.
```text ![Ratiometric](diagrams/ratiometric.svg)
+5V_SENS ----> sensor excitation
|
+--> sensor output -- matched divider --> ADC sensor channel
|
+--> +5V_SENS sense - matched divider --> ADC 5-V-sense channel
```
Firmware shall calculate the sensor signal as a ratio of the two ADC readings: Firmware shall calculate the sensor signal as a ratio of the two ADC readings:
@@ -186,13 +150,7 @@ conventional automotive ECU sensor interface. The thermistor itself is passive
and would operate with a 3.3 V excitation, but using the protected 5 V sensor and would operate with a 3.3 V excitation, but using the protected 5 V sensor
rail gives a common, diagnosable excitation supply for external sensors. rail gives a common, diagnosable excitation supply for external sensors.
```text ![Thermistor](diagrams/thermistor.svg)
+5V_SENS -- precision pull-up --+-- thermistor -- sensor ground
|
+-- matched divider/filter --> ADC thermistor channel
+5V_SENS ------ matched divider/filter -----------------> ADC 5-V-sense channel
```
Firmware shall use the ratio of the thermistor-channel and 5-V-sense ADC Firmware shall use the ratio of the thermistor-channel and 5-V-sense ADC
readings to calculate the thermistor resistance. This cancels variation in readings to calculate the thermistor resistance. This cancels variation in
+5
View File
@@ -143,3 +143,8 @@ selection are finalised:
requirements. requirements.
5. CAN connector and bus topology. 5. CAN connector and bus topology.
6. Detailed trigger sensor wiring, connector, and cable-length information. 6. Detailed trigger sensor wiring, connector, and cable-length information.
## Diagram sources
The architecture figures are embedded as SVGs. Editable sources, PNG previews,
and regeneration instructions are in [diagrams/](diagrams/README.md).
+79
View File
@@ -0,0 +1,79 @@
# Architecture diagram sources
The architecture Markdown embeds these 22 SVG figures. Matching PNG previews
are provided for viewers that do not support SVG. Diagrams describe the working
architecture; component qualification and schematic-release requirements remain
in the parent documents.
## Figures
| Topic | Figures |
| --- | --- |
| Power | [Sources](power-sources.svg), [protected branches](power-branches.svg) |
| Analogue acquisition | [Passive input](analog-input.svg), [thermistor](thermistor.svg), [ratiometric acquisition](ratiometric.svg) |
| Timing inputs | [Crank/cam interface](trigger-input.svg) |
| Deadman | [Contacts and diagnostics](deadman-inputs.svg), [permit gates](deadman-permit.svg), [output gates](deadman-outputs.svg) |
| Ignition | [Power](ignition-power.svg), [commands](ignition-command.svg), [current flag](ignition-flag.svg), [grounding](ignition-ground.svg) |
| Injection | [Power](injector-power.svg), [command](injector-command.svg), [status](injector-status.svg), [grounding](injector-ground.svg) |
| Generic outputs | [5 V logic](logic-output.svg), [low-side power](sink-power.svg), [supplies and SPI](sink-interfaces.svg), [command bias](sink-command.svg) |
| Optional DAC | [Output provision](dac-output.svg) |
## Editing and regeneration
- The 12 block figures have editable `.drawio` sources. Open them in draw.io.
`build_blocks.py` recreates their baseline layout and `block-connections.json`.
Running it overwrites manual layout edits, so update the generator when those
edits should be reproducible, or export the edited `.drawio` directly.
- The 10 circuit/logic figures are generated by `build_circuits.py`, with a
separate `*.topology.json` connection manifest for each figure. Change the
relevant component/net definitions and layout together in that script;
rerunning it overwrites the generated topology and images. JSON is a review
manifest, not an independently interpreted rendering input.
- Reference designators introduced by these drawings are documentation labels,
not KiCad assignments. Named continuation ports are electrically identical
only when their names match within the documented domain.
Run from this directory using the configured schematic environment:
```bash
python build_blocks.py
~/.venvs/codex-schematics/bin/python export_blocks.py
~/.venvs/codex-schematics/bin/python build_circuits.py
```
`export_blocks.py` requires the installed draw.io desktop renderer; restricted
Electron sandboxes may require an authorized external execution. It exports
only `.drawio` inputs, keeps editable sources, checks for native SVG text, and
creates PNG previews. The circuit builder uses Schemdraw and CairoSVG.
Inspect changed figures at their intended embedded size after rebuilding.
Validate each circuit manifest with the installed topology validator:
```bash
~/.venvs/codex-schematics/bin/python \
~/.codex/skills/electronics-schematic-rendering/scripts/validate_topology.py \
analog-input.topology.json
```
## Source clarifications in this redraw
- The former power-tree branch labelled `+5V_AUX` after 3.3 V filtering is now
`+3V3_ANA`, matching the dedicated rail description. `+5V_AUX` remains a
protected branch of `+5V_MAIN`.
- The passive ADC drawing now shows `C_HOLD` as a shunt capacitor after the
small isolation resistor specified in the prose. It does not add a separate
connector-side `R_PROT`. Exact values remain unspecified.
- The Hall-input drawing separates sensor supply, sensor return and signal;
the original ASCII alignment could suggest an unintended join. The pull-up,
divider and parallel filter follow the existing prose.
- The deadman equations are unchanged. Contact observations, permission gates
and output gates occupy separate figures; shared net names connect them.
- `VBG_LOCAL_KELVIN` labels the documented local ignition reference at the
`IGN_PGND` joining point. `LOCAL_GND` in the sink-command figure denotes the
TLE9104SH local ground reference. Neither denotes a new remote ground path.
- The obsolete reference to a missing figure in `DIGITAL_INPUTS.md` was removed.
That module remains described by its existing component-level prose.
Protection blocks whose devices or ratings remain unselected are deliberately
functional. Supply-loss behavior, real pin mappings, ratings and physical fault
responses still require the validation specified in the module documents.
Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.6 KiB

@@ -0,0 +1,130 @@
{
"title": "Passive 0\u20135 V ADC channel",
"source": "IO_MODULES/ANALOG_INPUTS.md: General 0--5 V channels",
"reference_scope": "documentation only",
"components": [
{
"ref": "J",
"kind": "port",
"pins": [
"P"
],
"value": "Sensor signal"
},
{
"ref": "CLAMP",
"kind": "transient-protection",
"pins": [
"SIG",
"RET"
],
"value": "Connector clamp\nPart / rating TBD"
},
{
"ref": "GC",
"kind": "ground-port",
"pins": [
"P"
],
"value": "SENSOR_GND"
},
{
"ref": "R_TOP",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_TOP"
},
{
"ref": "R_BOTTOM",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_BOTTOM"
},
{
"ref": "GR",
"kind": "ground-port",
"pins": [
"P"
],
"value": "SENSOR_GND"
},
{
"ref": "R_ISO",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "Isolation R\nValue TBD"
},
{
"ref": "C_HOLD",
"kind": "capacitor",
"pins": [
"1",
"2"
],
"value": "C_HOLD"
},
{
"ref": "GH",
"kind": "ground-port",
"pins": [
"P"
],
"value": "SENSOR_GND"
},
{
"ref": "ADC",
"kind": "port",
"pins": [
"P"
],
"value": "ADC_IN"
}
],
"nets": [
{
"name": "Sensor signal",
"connections": [
"J.P",
"CLAMP.SIG",
"R_TOP.1"
]
},
{
"name": "SENSOR_GND",
"connections": [
"CLAMP.RET",
"GC.P",
"R_BOTTOM.2",
"GR.P",
"C_HOLD.2",
"GH.P"
]
},
{
"name": "DIVIDED",
"connections": [
"R_TOP.2",
"R_BOTTOM.1",
"R_ISO.1"
]
},
{
"name": "ADC_IN",
"connections": [
"R_ISO.2",
"C_HOLD.1",
"ADC.P"
]
}
],
"no_connects": []
}
File diff suppressed because it is too large Load Diff
+144
View File
@@ -0,0 +1,144 @@
"""Rebuild editable architectural figures (standard-library Python).
Export the resulting .drawio files with the installed draw.io desktop renderer.
Node/edge records are retained as a source-traceable connection manifest.
"""
from pathlib import Path
import json
import xml.etree.ElementTree as ET
OUT = Path(__file__).resolve().parent
COLORS = {'power': '#fff1d6', 'signal': '#e8f0fc', 'device': '#e8f4ed',
'ground': '#eef0f3', 'note': '#ffffff'}
manifest = {}
class Figure:
def __init__(self, name, title, source, width=1040, height=620):
self.name, self.width, self.height = name, width, height
self.data = {'title': title, 'source': source, 'nodes': {}, 'connections': []}
self.root = ET.Element('mxfile', host='app.diagrams.net')
diagram = ET.SubElement(self.root, 'diagram', name=title, id=name)
model = ET.SubElement(diagram, 'mxGraphModel', page='1', pageWidth=str(width), pageHeight=str(height), grid='1', gridSize='10')
self.cells = ET.SubElement(model, 'root')
ET.SubElement(self.cells, 'mxCell', id='0')
ET.SubElement(self.cells, 'mxCell', id='1', parent='0')
self.node('title', title, 30, 18, width-60, 42, 'note', text=True, size=26)
def node(self, key, label, x, y, w=220, h=74, kind='signal', text=False, size=18):
style = f'rounded=1;html=0;fontFamily=DejaVu Sans;fontSize={size};fontColor=#172b40;strokeColor=#577086;fillColor={COLORS[kind]};spacing=10;'
if text:
style += 'strokeColor=none;fillColor=none;align=left;'
cell = ET.SubElement(self.cells, 'mxCell', id='node_'+key, value=label, style=style, vertex='1', parent='1')
ET.SubElement(cell, 'mxGeometry', x=str(x), y=str(y), width=str(w), height=str(h), **{'as':'geometry'})
self.data['nodes'][key] = {'label': label, 'kind':kind, 'bounds':[x,y,w,h]}
return key
def edge(self, a, b, label='', points=(), exit=(1,.5), entry=(0,.5), kind='signal', arrows=True):
assert a in self.data['nodes'] and b in self.data['nodes']
idx = 'e'+str(len(self.data['connections']))
color = '#946221' if kind=='power' else '#416680'
bidirectional = label == 'Bidirectional'
if bidirectional: label = ''
style = f'edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor={color};fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow={"block" if arrows else "none"};endFill=1;exitX={exit[0]};exitY={exit[1]};entryX={entry[0]};entryY={entry[1]};'
if bidirectional: style += 'startArrow=block;startFill=1;'
cell = ET.SubElement(self.cells, 'mxCell', id=idx, source='node_'+a, target='node_'+b, value=label, style=style, edge='1', parent='1')
geo = ET.SubElement(cell, 'mxGeometry', relative='1', **{'as':'geometry'})
if points:
arr = ET.SubElement(geo, 'Array', **{'as':'points'})
for x,y in points: ET.SubElement(arr, 'mxPoint', x=str(x), y=str(y))
self.data['connections'].append({'from':a,'to':b,'label':label,'kind':kind})
def note(self, label, y):
self.node('note'+str(y), label, 30, y, self.width-60, 60, 'note', text=True, size=16)
def save(self):
ET.indent(self.root)
ET.ElementTree(self.root).write(OUT/(self.name+'.drawio'), encoding='utf-8', xml_declaration=True)
manifest[self.name] = self.data
def chain(name, title, source, labels, note='', kind='signal'):
f = Figure(name,title,source,1040,270)
w = (960-(len(labels)-1)*40)/len(labels)
for i,label in enumerate(labels):
f.node(str(i),label,40+i*(w+40),95,w,85,kind)
if i: f.edge(str(i-1),str(i),kind=kind)
if note: f.note(note,195)
f.save()
f = Figure('power-sources','Power sources and battery loads','POWER_ARCHITECTURE.md: Rail Tree',1040,790)
f.node('battery','4S LiPo\n14.8 V nominal · 16.8 V full',30,90,290,80,'power')
f.node('protection','Input fuse · reverse protection\nTVS / transient protection',390,90,310,80,'power')
f.node('vbat','VBAT_PROT',770,90,230,80,'power')
f.edge('battery','protection',kind='power'); f.edge('protection','vbat',kind='power')
for i,(key,label,out) in enumerate([
('loads','Protected battery branches','Ignition · injector\nLow-side outputs · VBAT sense'),
('five','Synchronous buck · 5 V','+5V_MAIN\nInternal 5 V circuitry'),
('three','Synchronous buck · 3.3 V','+3V3_MAIN\nMCU / digital / communications'),
('twelve','Regulated buck-boost · 12 V','+12V_SENS\nProtected Hall-sensor supply')]):
y=245+i*120
f.node(key+'in','VBAT_PROT',30,y,190,74,'power')
f.node(key,label,300,y,310,74,'power'); f.node(key+'out',out,690,y,310,74,'power')
f.edge(key+'in',key,kind='power'); f.edge(key,key+'out',kind='power')
f.note('Repeated VBAT_PROT labels denote the same rail. Protected branch details are shown separately.',725); f.save()
f = Figure('power-branches','Protected and filtered rail branches','POWER_ARCHITECTURE.md: rail descriptions',1040,700)
for i,(a,b,c) in enumerate([
('+5V_MAIN','eFuse / protected load switch','+5V_AUX\nExternal logic outputs'),
('+5V_MAIN','eFuse / load switch\nFerrite bead + local filter','+5V_SENS\n5 V sensor excitation'),
('+3V3_MAIN','Ferrite bead + local filter','+3V3_ANA\nAnalogue supplies /\nADC reference'),
('12 V buck-boost output','Current limit / protected switch\nHarness filter + decoupling','+12V_SENS\nCrank / cam Hall sensors')]):
y=95+i*135
f.node(f'a{i}',a,30,y,240,90,'power'); f.node(f'b{i}',b,340,y,320,90,'power'); f.node(f'c{i}',c,730,y,280,90,'power')
f.edge(f'a{i}',f'b{i}',kind='power'); f.edge(f'b{i}',f'c{i}',kind='power')
f.note('Optional analogue LDO and final current limits remain validation items; see the rail descriptions.',630); f.save()
f=Figure('ratiometric','Ratiometric sensor acquisition','POWER_ARCHITECTURE.md: Ratiometric 5 V Sensor Measurements',1040,540)
for key,label,x,y,w,kind in [('rail','+5V_SENS',30,90,220,'power'),('sensor','5 V sensor\nExcitation input',340,90,280,'device'),('sig','Sensor output',30,240,220,'signal'),('div','Matched divider / filter',340,240,280,'signal'),('adc','ADC sensor channel',730,240,280,'signal'),('rail2','+5V_SENS',30,380,220,'power'),('sense','Matched divider / filter',340,380,280,'signal'),('adc2','ADC 5-V-sense channel',730,380,280,'signal')]: f.node(key,label,x,y,w,74,kind)
f.edge('rail','sensor',kind='power'); f.edge('sig','div'); f.edge('div','adc'); f.edge('rail2','sense'); f.edge('sense','adc2')
f.note('Sensor output is the sensors signal pin. Both ADC channels use +3V3_ANA as their reference.',470); f.save()
chain('dac-output','Optional analogue-output provision','IO_ARCHITECTURE.md: Analogue-output provision',['MCU DAC','Rail-to-rail buffer','Protection /\nseries impedance','Connector'],'Provision only; final electrical range, load and protection remain to be defined.')
f=Figure('deadman-inputs','Deadman contacts and observations','IO_MODULES/DEAD_MAN.md: Logic domains',1040,650)
for i,c in enumerate('AB'):
y=100+i*245
f.node(c+'s','Protected 5 V\nIndependent NO contact '+c,30,y,260,80,'power')
f.node(c+'p','Protected input '+c+'\nOwn filter + default-low bias',370,y,290,80,'signal')
f.node(c+'h','DEADMAN_A_HELD\n5 V · non-inverting' if c=='A' else 'DEADMAN_B_RELEASED\n5 V · inverting',750,y,260,80,'signal')
f.node(c+'d','DEADMAN_'+c+'_STATUS\n3.3 V · held = high → MCU',370,y+120,330,75,'device')
f.edge(c+'s',c+'p'); f.edge(c+'p',c+'h'); f.edge(c+'p',c+'d',exit=(.5,1),entry=(.5,0))
f.note('Separate harness paths. MCU status observations are diagnostic; the 5 V signals feed the permit gates.',575);f.save()
for name,title,part,pin,load,ground,source in [
('ignition-power','Ignition power path','VBG08H-E','HVC','Coil primary','IGN_PGND','IGNITION'),
('injector-power','Injector power path','VNL5050S5-E','DRAIN','Injector coil','INJ_PGND','INJECTON'),
('sink-power','Generic low-side power path','TLE9104SH','OUTx','External load\nvia SINK_OUTx','OUT_PGND','DIGITAL_OUTPUTS')]:
f=Figure(name,title,'IO_MODULES/'+source+'.md: Power path',1040,460)
f.node('rail','VBAT_PROT',30,100,230,80,'power'); f.node('load',load,350,100,280,80,'device');f.node('driver',part+'\n'+pin,720,100,290,80,'device')
f.node('switch','Internal IGBT' if source=='IGNITION' else 'Internal low-side MOSFET',720,230,290,70,'device')
f.node('return',('PGND1 + PGND2' if source=='IGNITION' else 'SOURCE' if source=='INJECTON' else 'Power return')+''+ground,350,350,660,60,'ground')
f.edge('rail','load',kind='power');f.edge('load','driver',kind='power');f.edge('driver','switch',exit=(.5,1),entry=(.5,0),kind='power');f.edge('switch','return',exit=(.5,1),entry=(.8,0),kind='power')
f.note('Functional current path. '+ground+' returns separately to the power-entry ground star.',410);f.save()
chain('ignition-flag','Ignition current-flag diagnostic','IO_MODULES/IGNITION.md: Current-flag diagnostic',['VBG08H-E C.F.\nOpen-drain output','Reference-style R/C filter\n+3V3_MAIN pull-up','STM32 GPIO'],'Diagnostic current-threshold observation; separate from the hardware inhibit path.')
f=Figure('ignition-ground','Ignition ground and Kelvin reference','IO_MODULES/IGNITION.md: Ground and layout',1040,480)
for i,(key,label) in enumerate([('p1','VBG08H-E PGND1'),('p2','VBG08H-E PGND2'),('g','VBG08H-E GND')]):
f.node(key,label,30,100+i*115,230,64,'ground')
f.node('join','IGN_PGND\nLocal joining point',490,170,220,105,'ground');f.node('star','Power-entry\nground star',800,170,210,105,'ground')
f.edge('p1','join','Matched heavy copper',points=[(400,132),(400,190)],entry=(0,.2),arrows=False)
f.edge('p2','join','Matched heavy copper',entry=(0,.65),arrows=False)
f.edge('g','join','Separate Kelvin trace',points=[(600,362)],entry=(.5,1),arrows=False)
f.edge('join','star',arrows=False)
f.note('GND carries the local reference, not coil current. No separate remote-DGND connection.',410);f.save()
chain('injector-ground','Injector ground return','IO_MODULES/INJECTON.md: Ground and layout',['VNL5050S5-E SOURCE','INJ_PGND\nShort, low-impedance copper','Power-entry ground star'],'SOURCE is both power return and local logic reference. No separate Kelvin pin.',kind='ground')
f=Figure('sink-interfaces','Low-side driver supplies and diagnostics','IO_MODULES/DIGITAL_OUTPUTS.md: Protected low-side outputs',1040,610)
for i,(a,b) in enumerate([('VBAT_PROT','TLE9104SH VS'),('+5V_MAIN','TLE9104SH VDD'),('+3V3_MAIN','TLE9104SH VIO')]):
y=95+i*110
f.node('s'+str(i),a,30,y,230,70,'power'); f.node('p'+str(i),b,380,y,280,70,'device');f.edge('s'+str(i),'p'+str(i),kind='power')
f.node('mcu','MCU SPI',30,440,230,80);f.node('spi','TLE9104SH SPI\nCommands + diagnostics',380,440,280,80,'device');f.edge('mcu','spi','Bidirectional')
f.note('INx / EN default-low networks are shown in the companion circuit. Decouple supplies locally.',540);f.save()
(OUT/'block-connections.json').write_text(json.dumps(manifest,indent=2)+'\n')
print(f'Wrote {len(manifest)} editable block figures.')
+176
View File
@@ -0,0 +1,176 @@
"""Rebuild documentation schematics with Schemdraw.
Run with ~/.venvs/codex-schematics/bin/python. Topology JSON is emitted beside
each figure. References identify documentation symbols, not CAD placements.
"""
from pathlib import Path
import json
import xml.etree.ElementTree as ET
import schemdraw
import schemdraw.elements as e
import schemdraw.logic as logic
import cairosvg
OUT = Path(__file__).resolve().parent
class Circuit:
def __init__(self,name,title,source):
self.name=name
self.d=schemdraw.Drawing(show=False)
self.d.config(unit=2.5,fontsize=12,font='DejaVu Sans',lw=1.5,color='#20394e',bgcolor='white')
self.top={'title':title,'source':source,'reference_scope':'documentation only','components':[],'nets':[],'no_connects':[]}
self.nets={}
def component(self,ref,kind,pins,value=''):
assert ref not in [c['ref'] for c in self.top['components']],ref
self.top['components'].append({'ref':ref,'kind':kind,'pins':list(pins),'value':value})
for pin,net in pins.items(): self.nets.setdefault(net,[]).append(ref+'.'+pin)
def label(self,xy,text,loc='top',size=12):
self.d.add(e.Label().at(xy).label(text,loc=loc,fontsize=size))
def wire(self,a,b): self.d.add(e.Line().at(a).to(b))
def dot(self,xy): self.d.add(e.Dot().at(xy))
def port(self,ref,xy,net,loc='left'):
self.component(ref,'port',{'P':net},net)
self.d.add(e.Dot(open=True).at(xy).label(net,loc=loc))
def res(self,ref,a,b,n1,n2,label=None):
self.component(ref,'resistor',{'1':n1,'2':n2},label or ref)
self.d.add(e.Resistor().at(a).to(b).label(label or ref))
def cap(self,ref,a,b,n1,n2,label=None):
self.component(ref,'capacitor',{'1':n1,'2':n2},label or ref)
self.d.add(e.Capacitor().at(a).to(b).label(label or ref))
def zener(self,ref,a,b,n1,n2):
self.component(ref,'zener',{'K':n1,'A':n2},'Low-C clamp\nVoltage TBD')
self.d.add(e.Zener().at(a).to(b).reverse().label('Low-C Zener\nVoltage TBD'))
def ground(self,ref,xy,net='SENSOR_GND'):
self.component(ref,'ground-port',{'P':net},net)
self.d.add(e.Ground().at(xy).label(net,loc='bottom'))
def block(self,ref,xy,label,ins,outs,w=3.5,h=2):
pins=[]
for side,ports in [('L',ins),('R',outs)]:
for i,(pin,net) in enumerate(ports):
pins.append(e.IcPin(name=pin,anchorname=pin,side=side,pos=(i+1)/(len(ports)+1)))
self.component(ref,'functional-block',dict(ins+outs),label)
return self.d.add(e.Ic(size=(w,h),pins=pins).at(xy).theta(0).label(label,loc='top'))
def save(self):
for net,ends in self.nets.items():
entry={'name':net,'connections':ends}
if len(ends)==1: entry.update(allow_single=True,note='Named boundary or supply shown in the documentation figure')
self.top['nets'].append(entry)
(OUT/(self.name+'.topology.json')).write_text(json.dumps(self.top,indent=2)+'\n')
self.d.save(str(OUT/(self.name+'.svg')))
svg_path = OUT/(self.name+'.svg')
ET.register_namespace('', 'http://www.w3.org/2000/svg')
tree = ET.parse(svg_path); root = tree.getroot()
x,y,w,h = map(float,root.get('viewBox').split())
root.set('viewBox', f'{x-16} {y-16} {w+32} {h+32}')
root.set('width', f'{w+32}pt'); root.set('height', f'{h+32}pt')
tree.write(svg_path, encoding='utf-8', xml_declaration=True)
cairosvg.svg2png(url=str(OUT/(self.name+'.svg')),write_to=str(OUT/(self.name+'.png')),background_color='white',output_width=1200)
# Shunt protection and ADC reservoir are deliberately drawn as branches.
c=Circuit('analog-input','Passive 05 V ADC channel','IO_MODULES/ANALOG_INPUTS.md: General 0--5 V channels')
c.port('J',(0,0),'Sensor signal')
c.wire((0,0),(2,0));c.dot((2,0))
c.component('CLAMP','transient-protection',{'SIG':'Sensor signal','RET':'SENSOR_GND'},'Connector clamp\nPart / rating TBD')
cl=c.d.add(e.Ic(size=(2,1),pins=[e.IcPin(name='SIG',side='T',anchorname='SIG'),e.IcPin(name='RET',side='B',anchorname='RET')]).at((1,-3)).theta(0).label('Transient clamp',loc='left'))
c.wire((2,0),cl.SIG);c.ground('GC',cl.RET)
c.res('R_TOP',(2,0),(6,0),'Sensor signal','DIVIDED')
c.dot((6,0));c.res('R_BOTTOM',(6,0),(6,-3),'DIVIDED','SENSOR_GND');c.ground('GR',(6,-3))
c.res('R_ISO',(6,0),(10,0),'DIVIDED','ADC_IN','Isolation R\nValue TBD')
c.dot((10,0));c.cap('C_HOLD',(10,0),(10,-3),'ADC_IN','SENSOR_GND');c.ground('GH',(10,-3))
c.wire((10,0),(13,0));c.port('ADC',(13,0),'ADC_IN',loc='right')
c.label((6,2),'Passive analogue input',size=18);c.save()
c=Circuit('thermistor','NTC excitation and acquisition','IO_MODULES/ANALOG_INPUTS.md: NTC temperature channels')
c.port('V',(0,0),'+5V_SENS');c.res('R_PULLUP',(0,0),(4,0),'+5V_SENS','NTC_NODE','R_PULLUP\nSelected for sensor curve');c.dot((4,0))
c.component('NTC','thermistor',{'1':'NTC_NODE','2':'SENSOR_GND'},'NTC')
c.d.add(e.Thermistor().at((4,0)).to((4,-3)).label('NTC'));c.ground('GN',(4,-3))
b=c.block('AFE',(7,-1),'Attenuation / local filter',[('IN','NTC_NODE')],[('OUT','ADC_NTC')],w=4)
c.wire((4,0),b.IN);c.wire(b.OUT,(14,0));c.port('ADC',(14,0),'ADC_NTC',loc='right')
c.port('VS',(0,-6),'+5V_SENS');b2=c.block('SENSE',(7,-7),'Matched divider / filter',[('IN','+5V_SENS')],[('OUT','ADC_5V_SENSE')],w=4)
c.wire((0,-6),b2.IN);c.wire(b2.OUT,(14,-6));c.port('ADCS',(14,-6),'ADC_5V_SENSE',loc='right')
c.label((7,2),'Thermistor + excitation-supply measurement',size=18)
c.label((7,-9),'Both ADC channels use +3V3_ANA as reference. Filter and protection details remain in the text.',size=11);c.save()
c=Circuit('trigger-input','Crank / cam Hall input','IO_MODULES/ENGINE_POSITION_INPUTS.md: Electrical interface')
c.port('J',(0,0),'TRIG_x');c.wire((0,0),(3,0));c.dot((3,0))
c.port('V',(3,4),'+12V_SENS',loc='top');c.res('R_PULLUP',(3,4),(3,0),'+12V_SENS','TRIG_x','R_PULLUP\n4.7 kΩ provision')
c.component('CLAMP','transient-protection',{'SIG':'TRIG_x','RET':'SENSOR_GND'},'Harness clamp / ratings TBD')
b=c.d.add(e.Ic(size=(2,1),pins=[e.IcPin(name='SIG',side='T',anchorname='SIG'),e.IcPin(name='RET',side='B',anchorname='RET')]).at((2,-3)).theta(0).label('Transient\nprotection',loc='left'))
c.wire((3,0),b.SIG);c.ground('GC',b.RET)
c.res('R_DIV_TOP',(3,0),(7,0),'TRIG_x','DIVIDED');c.dot((7,0))
c.res('R_DIV_BOTTOM',(7,0),(7,-3),'DIVIDED','SENSOR_GND');c.ground('GB',(7,-3))
c.wire((7,0),(10,0));c.dot((10,0));c.cap('C_FILTER',(10,0),(10,-3),'DIVIDED','SENSOR_GND','C_FILTER\n1 nF initial');c.ground('GF',(10,-3))
c.wire((10,0),(12,0));s=c.d.add(logic.Schmitt().at((12,0)).right().label('SN74LVC2G17-Q1\nSupply: +3V3_MAIN',loc='top'))
c.component('U','schmitt-buffer',{'IN':'DIVIDED','OUT':'TIMER_3V3'},'SN74LVC2G17-Q1')
c.wire(s.out,(16,0));c.port('MCU',(16,0),'TIMER_3V3',loc='right')
c.label((8,6),'Hall input · repeated for crank and cam',size=18)
c.label((8,-5.5),'Sensor connector: supply = +12V_SENS; return = SENSOR_GND; output = TRIG_x. Pin numbers unassigned.',size=11);c.save()
c=Circuit('ignition-command','Ignition timing and inhibit protection','IO_MODULES/IGNITION.md: Command and inhibit path')
for i,(net,out) in enumerate([('STM32 timing (3.3 V)','INP'),('SAFE_IGNITION_INHIBIT','EN')]):
y=-i*7
c.port('J'+str(i),(0,y),net)
if i==0:
b=c.block('BUFFER',(2,y-1),'Non-inverting\n3.3 V → 5 V',[('IN',net)],[('OUT','TIMING_5V')],w=3)
c.wire((0,y),b.IN);c.wire(b.OUT,(7,y));net2='TIMING_5V'
else:c.wire((0,y),(7,y));net2=net
c.res('RP'+str(i),(7,y),(11,y),net2,out,'1 kΩ')
c.dot((11,y));c.zener('Z'+str(i),(11,y),(11,y-3),out,'VBG_LOCAL_KELVIN');c.ground('G'+str(i),(11,y-3),'VBG_LOCAL_KELVIN')
c.wire((11,y),(14,y));c.port('U'+str(i),(14,y),out,loc='right')
c.label((7,2.5),'VBG08H-E command pins',size=18)
c.label((6,-12),'INP: high = dwell; falling edge = spark. EN: high = inhibit; low = permission.',size=11);c.save()
c=Circuit('injector-command','Injector command protection','IO_MODULES/INJECTON.md: Command path')
c.port('J',(0,0),'SAFE_INJECTOR_SIG');c.res('Rprot',(0,0),(4,0),'SAFE_INJECTOR_SIG','INPUT','Rprot · 1 kΩ');c.dot((4,0))
c.res('R_PD',(4,0),(4,-3),'INPUT','INJ_PGND','10 kΩ');c.ground('GR',(4,-3),'INJ_PGND')
c.wire((4,0),(8,0));c.dot((8,0));c.zener('Z',(8,0),(8,-3),'INPUT','INJ_PGND');c.ground('GZ',(8,-3),'INJ_PGND')
c.wire((8,0),(12,0));c.port('U',(12,0),'INPUT',loc='right');c.label((6,2),'VNL5050S5-E · active-high command',size=18);c.save()
c=Circuit('injector-status','Injector status acquisition','IO_MODULES/INJECTON.md: Status diagnostic')
c.port('U',(0,0),'STATUS');c.res('Rprot',(0,0),(5,0),'STATUS','MCU_STATUS','Rprot · 1 kΩ');c.dot((5,0))
c.port('V',(5,4),'+3V3_MAIN',loc='top');c.res('R_PULLUP',(5,4),(5,0),'+3V3_MAIN','MCU_STATUS','Pull-up\nValue TBD')
c.wire((5,0),(10,0));c.port('M',(10,0),'MCU_STATUS',loc='right');c.label((5,6),'VNL5050S5-E · open-drain diagnostic',size=18);c.save()
c=Circuit('logic-output','Protected 5 V logic output','IO_MODULES/DIGITAL_OUTPUTS.md: Protected 5 V logic outputs')
c.port('J',(0,0),'MCU GPIO');c.wire((0,0),(3,0));c.dot((3,0))
c.res('R_IN_PD',(3,0),(3,-3),'MCU GPIO','GND');c.ground('GI',(3,-3),'GND')
b=c.block('U',(6,-1),'TPS4H000-Q1\nVBB = +5V_AUX',[('INx','MCU GPIO')],[('OUTx','LOGIC_OUTx')],w=4)
c.wire((3,0),b.INx);c.wire(b.OUTx,(13,0));c.dot((13,0));c.res('R_OUT_PD',(13,0),(13,-3),'LOGIC_OUTx','GND');c.ground('GO',(13,-3),'GND')
c.wire((13,0),(17,0));c.port('O',(17,0),'LOGIC_OUTx',loc='right')
c.label((8,3),'5 V high-side logic output',size=18)
c.label((8,-5.5),'+5V_MAIN → eFuse / load switch → +5V_AUX. Connector TVS selection is specified in the text.',size=11);c.save()
c=Circuit('sink-command','Low-side command default states','IO_MODULES/DIGITAL_OUTPUTS.md: Protected low-side outputs')
for i,(net,pin) in enumerate([('MCU GPIO','INx'),('MCU enable','EN')]):
y=-i*6
c.port('J'+str(i),(0,y),net);c.wire((0,y),(4,y));c.dot((4,y))
c.res('R_IN_PD' if i==0 else 'R_EN_PD',(4,y),(4,y-2.5),net,'LOCAL_GND')
c.ground('G'+str(i),(4,y-2.5),'LOCAL_GND')
c.wire((4,y),(9,y));c.component('U'+str(i),'driver-pin',{pin:net},'TLE9104SH '+pin)
c.d.add(e.Dot(open=True).at((9,y)).label('TLE9104SH '+pin,loc='right'))
c.label((4,2),'TLE9104SH · default-low commands',size=18);c.save()
def equation_gate(c,ref,xy,a,b,out,invert_b=False):
x,y=xy
gate=c.d.add(logic.And(inputs=2,inputnots=[2] if invert_b else []).at(xy).right())
c.component(ref,'and-with-inverted-B' if invert_b else 'and',{'A':a,'B':b,'Y':out})
for idx,(anchor,net) in enumerate([(gate.in1,a),(gate.in2,b)]):
yy=y+1.4 if idx==0 else y-1.4
start=(x-5,yy); c.port(ref+'P'+str(idx),start,net)
c.wire(start,(x-1.2,yy));c.wire((x-1.2,yy),(x-1.2,anchor.y));c.wire((x-1.2,anchor.y),anchor)
c.wire(gate.out,(x+5,y));c.port(ref+'O',(x+5,y),out,loc='right')
c=Circuit('deadman-permit','Hardware engine-permit equations','IO_MODULES/DEAD_MAN.md: Logic equations')
equation_gate(c,'VALID',(0,0),'DEADMAN_A_HELD','DEADMAN_B_RELEASED','DEADMAN_OK',True)
equation_gate(c,'PERMIT',(0,-6),'DEADMAN_OK','MCU_RUN_PERMIT','ENGINE_PERMIT')
c.label((0,3),'Hardware permission · 5 V gate outputs',size=18)
c.label((0,-9),'Bubble inverts channel B. MCU_RUN_PERMIT is 3.3 V; gates must accept that input level.',size=11);c.save()
c=Circuit('deadman-outputs','Hardware permitted output commands','IO_MODULES/DEAD_MAN.md: Logic equations')
equation_gate(c,'INJECT',(0,0),'ENGINE_PERMIT','MCU_INJECTOR_SIG','SAFE_INJECTOR_SIG')
gate=c.d.add(logic.Not().at((0,-6)).right());c.component('INHIBIT','not',{'A':'ENGINE_PERMIT','Y':'SAFE_IGNITION_INHIBIT'})
c.port('I',(-5,-6),'ENGINE_PERMIT');c.wire((-5,-6),gate.in1);c.wire(gate.out,(5,-6));c.port('O',(5,-6),'SAFE_IGNITION_INHIBIT',loc='right')
c.label((0,3),'Injector permission and ignition inhibit',size=18)
c.label((0,-8),'SAFE_IGNITION_INHIBIT: high = inhibited. Supply-loss default states require the documented bias networks.',size=11);c.save()
print('Wrote 10 SVG circuits, previews and topology manifests.')
+38
View File
@@ -0,0 +1,38 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Optional analogue-output provision" id="dac-output">
<mxGraphModel page="1" pageWidth="1040" pageHeight="270" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Optional analogue-output provision" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_0" value="MCU DAC" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="40.0" y="95" width="210.0" height="85" as="geometry" />
</mxCell>
<mxCell id="node_1" value="Rail-to-rail buffer" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="290.0" y="95" width="210.0" height="85" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_0" target="node_1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_2" value="Protection /&#10;series impedance" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="540.0" y="95" width="210.0" height="85" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_1" target="node_2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_3" value="Connector" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="790.0" y="95" width="210.0" height="85" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_2" target="node_3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note195" value="Provision only; final electrical range, load and protection remain to be defined." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="195" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.5 KiB

@@ -0,0 +1,59 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Deadman contacts and observations" id="deadman-inputs">
<mxGraphModel page="1" pageWidth="1040" pageHeight="650" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Deadman contacts and observations" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_As" value="Protected 5 V&#10;Independent NO contact A" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="100" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="node_Ap" value="Protected input A&#10;Own filter + default-low bias" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="370" y="100" width="290" height="80" as="geometry" />
</mxCell>
<mxCell id="node_Ah" value="DEADMAN_A_HELD&#10;5 V · non-inverting" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="750" y="100" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="node_Ad" value="DEADMAN_A_STATUS&#10;3.3 V · held = high → MCU" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="370" y="220" width="330" height="75" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_As" target="node_Ap" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_Ap" target="node_Ah" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_Ap" target="node_Ad" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_Bs" value="Protected 5 V&#10;Independent NO contact B" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="345" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="node_Bp" value="Protected input B&#10;Own filter + default-low bias" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="370" y="345" width="290" height="80" as="geometry" />
</mxCell>
<mxCell id="node_Bh" value="DEADMAN_B_RELEASED&#10;5 V · inverting" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="750" y="345" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="node_Bd" value="DEADMAN_B_STATUS&#10;3.3 V · held = high → MCU" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="370" y="465" width="330" height="75" as="geometry" />
</mxCell>
<mxCell id="e3" source="node_Bs" target="node_Bp" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e4" source="node_Bp" target="node_Bh" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5" source="node_Bp" target="node_Bd" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note575" value="Separate harness paths. MCU status observations are diagnostic; the 5 V signals feed the permit gates." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="575" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.6 KiB

@@ -0,0 +1,99 @@
{
"title": "Hardware permitted output commands",
"source": "IO_MODULES/DEAD_MAN.md: Logic equations",
"reference_scope": "documentation only",
"components": [
{
"ref": "INJECT",
"kind": "and",
"pins": [
"A",
"B",
"Y"
],
"value": ""
},
{
"ref": "INJECTP0",
"kind": "port",
"pins": [
"P"
],
"value": "ENGINE_PERMIT"
},
{
"ref": "INJECTP1",
"kind": "port",
"pins": [
"P"
],
"value": "MCU_INJECTOR_SIG"
},
{
"ref": "INJECTO",
"kind": "port",
"pins": [
"P"
],
"value": "SAFE_INJECTOR_SIG"
},
{
"ref": "INHIBIT",
"kind": "not",
"pins": [
"A",
"Y"
],
"value": ""
},
{
"ref": "I",
"kind": "port",
"pins": [
"P"
],
"value": "ENGINE_PERMIT"
},
{
"ref": "O",
"kind": "port",
"pins": [
"P"
],
"value": "SAFE_IGNITION_INHIBIT"
}
],
"nets": [
{
"name": "ENGINE_PERMIT",
"connections": [
"INJECT.A",
"INJECTP0.P",
"INHIBIT.A",
"I.P"
]
},
{
"name": "MCU_INJECTOR_SIG",
"connections": [
"INJECT.B",
"INJECTP1.P"
]
},
{
"name": "SAFE_INJECTOR_SIG",
"connections": [
"INJECT.Y",
"INJECTO.P"
]
},
{
"name": "SAFE_IGNITION_INHIBIT",
"connections": [
"INHIBIT.Y",
"O.P"
]
}
],
"no_connects": []
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.9 KiB

@@ -0,0 +1,115 @@
{
"title": "Hardware engine-permit equations",
"source": "IO_MODULES/DEAD_MAN.md: Logic equations",
"reference_scope": "documentation only",
"components": [
{
"ref": "VALID",
"kind": "and-with-inverted-B",
"pins": [
"A",
"B",
"Y"
],
"value": ""
},
{
"ref": "VALIDP0",
"kind": "port",
"pins": [
"P"
],
"value": "DEADMAN_A_HELD"
},
{
"ref": "VALIDP1",
"kind": "port",
"pins": [
"P"
],
"value": "DEADMAN_B_RELEASED"
},
{
"ref": "VALIDO",
"kind": "port",
"pins": [
"P"
],
"value": "DEADMAN_OK"
},
{
"ref": "PERMIT",
"kind": "and",
"pins": [
"A",
"B",
"Y"
],
"value": ""
},
{
"ref": "PERMITP0",
"kind": "port",
"pins": [
"P"
],
"value": "DEADMAN_OK"
},
{
"ref": "PERMITP1",
"kind": "port",
"pins": [
"P"
],
"value": "MCU_RUN_PERMIT"
},
{
"ref": "PERMITO",
"kind": "port",
"pins": [
"P"
],
"value": "ENGINE_PERMIT"
}
],
"nets": [
{
"name": "DEADMAN_A_HELD",
"connections": [
"VALID.A",
"VALIDP0.P"
]
},
{
"name": "DEADMAN_B_RELEASED",
"connections": [
"VALID.B",
"VALIDP1.P"
]
},
{
"name": "DEADMAN_OK",
"connections": [
"VALID.Y",
"VALIDO.P",
"PERMIT.A",
"PERMITP0.P"
]
},
{
"name": "MCU_RUN_PERMIT",
"connections": [
"PERMIT.B",
"PERMITP1.P"
]
},
{
"name": "ENGINE_PERMIT",
"connections": [
"PERMIT.Y",
"PERMITO.P"
]
}
],
"no_connects": []
}
+35
View File
@@ -0,0 +1,35 @@
"""Export only .drawio inputs, verify SVG content, and build PNG previews.
Run with ~/.venvs/codex-schematics/bin/python. The desktop renderer may need
execution outside a restricted Electron sandbox. It never edits source XML.
"""
from pathlib import Path
import shutil
import subprocess
import tempfile
import xml.etree.ElementTree as ET
import cairosvg
OUT=Path(__file__).resolve().parent
sources=sorted(OUT.glob('*.drawio'))
assert sources, 'No draw.io sources found'
with tempfile.TemporaryDirectory(prefix='neoecu-drawio-') as tmp:
for source in sources: shutil.copy2(source,Path(tmp)/source.name)
subprocess.run(['/usr/bin/drawio','-x','-f','svg','-e','-b','20','--svg-theme','light','-o',str(OUT),tmp],check=True)
ET.register_namespace('', 'http://www.w3.org/2000/svg')
ET.register_namespace('xlink', 'http://www.w3.org/1999/xlink')
for source in sources:
svg=source.with_suffix('.svg')
tree=ET.parse(svg);root=tree.getroot()
assert any(e.tag.endswith('text') for e in root.iter()),f'Empty figure: {svg}'
# draw.io emits an irrelevant fallback warning even for native SVG text.
# Remove only that advisory, and only when there is no foreignObject text.
assert not any(e.tag.endswith('foreignObject') for e in root.iter()),f'Nonportable SVG text: {svg}'
for parent in root.iter():
for child in list(parent):
if child.tag.endswith('switch') and 'Text is not SVG - cannot display' in ''.join(child.itertext()):
parent.remove(child)
tree.write(svg,encoding='utf-8',xml_declaration=True)
cairosvg.svg2png(url=str(svg),write_to=str(svg.with_suffix('.png')),background_color='white')
print(f'Exported and checked {len(sources)} block figures.')
Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.2 KiB

@@ -0,0 +1,149 @@
{
"title": "Ignition timing and inhibit protection",
"source": "IO_MODULES/IGNITION.md: Command and inhibit path",
"reference_scope": "documentation only",
"components": [
{
"ref": "J0",
"kind": "port",
"pins": [
"P"
],
"value": "STM32 timing (3.3 V)"
},
{
"ref": "BUFFER",
"kind": "functional-block",
"pins": [
"IN",
"OUT"
],
"value": "Non-inverting\n3.3 V \u2192 5 V"
},
{
"ref": "RP0",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "1 k\u03a9"
},
{
"ref": "Z0",
"kind": "zener",
"pins": [
"K",
"A"
],
"value": "Low-C clamp\nVoltage TBD"
},
{
"ref": "G0",
"kind": "ground-port",
"pins": [
"P"
],
"value": "VBG_LOCAL_KELVIN"
},
{
"ref": "U0",
"kind": "port",
"pins": [
"P"
],
"value": "INP"
},
{
"ref": "J1",
"kind": "port",
"pins": [
"P"
],
"value": "SAFE_IGNITION_INHIBIT"
},
{
"ref": "RP1",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "1 k\u03a9"
},
{
"ref": "Z1",
"kind": "zener",
"pins": [
"K",
"A"
],
"value": "Low-C clamp\nVoltage TBD"
},
{
"ref": "G1",
"kind": "ground-port",
"pins": [
"P"
],
"value": "VBG_LOCAL_KELVIN"
},
{
"ref": "U1",
"kind": "port",
"pins": [
"P"
],
"value": "EN"
}
],
"nets": [
{
"name": "STM32 timing (3.3 V)",
"connections": [
"J0.P",
"BUFFER.IN"
]
},
{
"name": "TIMING_5V",
"connections": [
"BUFFER.OUT",
"RP0.1"
]
},
{
"name": "INP",
"connections": [
"RP0.2",
"Z0.K",
"U0.P"
]
},
{
"name": "VBG_LOCAL_KELVIN",
"connections": [
"Z0.A",
"G0.P",
"Z1.A",
"G1.P"
]
},
{
"name": "SAFE_IGNITION_INHIBIT",
"connections": [
"J1.P",
"RP1.1"
]
},
{
"name": "EN",
"connections": [
"RP1.2",
"Z1.K",
"U1.P"
]
}
],
"no_connects": []
}
@@ -0,0 +1,32 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Ignition current-flag diagnostic" id="ignition-flag">
<mxGraphModel page="1" pageWidth="1040" pageHeight="270" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Ignition current-flag diagnostic" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_0" value="VBG08H-E C.F.&#10;Open-drain output" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="40.0" y="95" width="293.3333333333333" height="85" as="geometry" />
</mxCell>
<mxCell id="node_1" value="Reference-style R/C filter&#10;+3V3_MAIN pull-up" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="373.3333333333333" y="95" width="293.3333333333333" height="85" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_0" target="node_1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_2" value="STM32 GPIO" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="706.6666666666666" y="95" width="293.3333333333333" height="85" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_1" target="node_2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note195" value="Diagnostic current-threshold observation; separate from the hardware inhibit path." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="195" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.8 KiB

@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Ignition ground and Kelvin reference" id="ignition-ground">
<mxGraphModel page="1" pageWidth="1040" pageHeight="480" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Ignition ground and Kelvin reference" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_p1" value="VBG08H-E PGND1" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="100" width="230" height="64" as="geometry" />
</mxCell>
<mxCell id="node_p2" value="VBG08H-E PGND2" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="215" width="230" height="64" as="geometry" />
</mxCell>
<mxCell id="node_g" value="VBG08H-E GND" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="330" width="230" height="64" as="geometry" />
</mxCell>
<mxCell id="node_join" value="IGN_PGND&#10;Local joining point" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="490" y="170" width="220" height="105" as="geometry" />
</mxCell>
<mxCell id="node_star" value="Power-entry&#10;ground star" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="800" y="170" width="210" height="105" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_p1" target="node_join" value="Matched heavy copper" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=none;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.2;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="400" y="132" />
<mxPoint x="400" y="190" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="e1" source="node_p2" target="node_join" value="Matched heavy copper" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=none;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.65;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_g" target="node_join" value="Separate Kelvin trace" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=none;endFill=1;exitX=1;exitY=0.5;entryX=0.5;entryY=1;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="600" y="362" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="e3" source="node_join" target="node_star" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=none;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note410" value="GND carries the local reference, not coil current. No separate remote-DGND connection." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="410" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

@@ -0,0 +1,44 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Ignition power path" id="ignition-power">
<mxGraphModel page="1" pageWidth="1040" pageHeight="460" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Ignition power path" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_rail" value="VBAT_PROT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="100" width="230" height="80" as="geometry" />
</mxCell>
<mxCell id="node_load" value="Coil primary" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="350" y="100" width="280" height="80" as="geometry" />
</mxCell>
<mxCell id="node_driver" value="VBG08H-E&#10;HVC" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="720" y="100" width="290" height="80" as="geometry" />
</mxCell>
<mxCell id="node_switch" value="Internal IGBT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="720" y="230" width="290" height="70" as="geometry" />
</mxCell>
<mxCell id="node_return" value="PGND1 + PGND2 → IGN_PGND" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="350" y="350" width="660" height="60" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_rail" target="node_load" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_load" target="node_driver" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_driver" target="node_switch" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e3" source="node_switch" target="node_return" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=0.5;exitY=1;entryX=0.8;entryY=0;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note410" value="Functional current path. IGN_PGND returns separately to the power-entry ground star." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="410" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns="http://www.w3.org/2000/svg" xml:lang="en" height="281.44pt" width="645.7840000000001pt" viewBox="-152.25199999999998 -114.2 645.7840000000001 281.44" style="background-color:white;"><polygon points="279,60.3 288,47.7 297,60.3 " style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 0.0,-0.0 L 54,-0 L 57,-9 L 63,9 L 69,-9 L 75,9 L 81,-9 L 87,9 L 90,-0 L 144,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 144.0,-0.0 L 144,36 L 153,39 L 135,45 L 153,51 L 135,57 L 153,63 L 135,69 L 144,72 L 144,108" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 144.0,108.0 L 144,122.4 L 135,122.4 L 153,122.4 M 137.7,126.72 L 150.3,126.72 M 142.2,131.04 L 145.8,131.04" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 144.0,-0.0 L 216,-0 L 288,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 288.0,-0.0 L 288,47.7 M 279,47.7 L 297,47.7 M 288,60.3 L 288,108" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 300.59999999999997,44.1 L 297,47.7" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 275.40000000000003,51.300000000000004 L 279,47.7" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 288.0,108.0 L 288,122.4 L 279,122.4 L 297,122.4 M 281.7,126.72 L 294.3,126.72 M 286.2,131.04 L 289.8,131.04" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 288.0,-0.0 L 360,-0 L 432,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><text x="72.0" y="-24.6" dominant-baseline="ideographic" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="72.0" dy="12">Rprot · 1 kΩ</tspan></text><text x="131.4" y="42.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="131.4" dy="12">10 kΩ</tspan></text><text x="144.0" y="122.64000000000001" dominant-baseline="hanging" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="144.0" dy="12">INJ_PGND</tspan></text><text x="271.8" y="36.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="271.8" dy="12">Low-C Zener</tspan><tspan x="271.8" dy="12">Voltage TBD</tspan></text><text x="288.0" y="122.64000000000001" dominant-baseline="hanging" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="288.0" dy="12">INJ_PGND</tspan></text><text x="219.6" y="-93.60000000000001" dominant-baseline="ideographic" fill="#20394e" font-size="18" font-family="DejaVu Sans" text-anchor="middle"><tspan x="219.6" dy="18">VNL5050S5-E · active-high command</tspan></text><circle cx="0" cy="-0" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="-6.3" y="-12.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="-6.3" dy="12">SAFE_INJECTOR_SIG</tspan></text><circle cx="144" cy="-0" r="2.7" style="stroke:#20394e;fill:#20394e;stroke-width:1.5;stroke-dasharray:-;" /><circle cx="288" cy="-0" r="2.7" style="stroke:#20394e;fill:#20394e;stroke-width:1.5;stroke-dasharray:-;" /><circle cx="432" cy="-0" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="438.3" y="-12.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="start"><tspan x="438.3" dy="12">INPUT</tspan></text></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

@@ -0,0 +1,94 @@
{
"title": "Injector command protection",
"source": "IO_MODULES/INJECTON.md: Command path",
"reference_scope": "documentation only",
"components": [
{
"ref": "J",
"kind": "port",
"pins": [
"P"
],
"value": "SAFE_INJECTOR_SIG"
},
{
"ref": "Rprot",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "Rprot \u00b7 1 k\u03a9"
},
{
"ref": "R_PD",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "10 k\u03a9"
},
{
"ref": "GR",
"kind": "ground-port",
"pins": [
"P"
],
"value": "INJ_PGND"
},
{
"ref": "Z",
"kind": "zener",
"pins": [
"K",
"A"
],
"value": "Low-C clamp\nVoltage TBD"
},
{
"ref": "GZ",
"kind": "ground-port",
"pins": [
"P"
],
"value": "INJ_PGND"
},
{
"ref": "U",
"kind": "port",
"pins": [
"P"
],
"value": "INPUT"
}
],
"nets": [
{
"name": "SAFE_INJECTOR_SIG",
"connections": [
"J.P",
"Rprot.1"
]
},
{
"name": "INPUT",
"connections": [
"Rprot.2",
"R_PD.1",
"Z.K",
"U.P"
]
},
{
"name": "INJ_PGND",
"connections": [
"R_PD.2",
"GR.P",
"Z.A",
"GZ.P"
]
}
],
"no_connects": []
}
@@ -0,0 +1,32 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Injector ground return" id="injector-ground">
<mxGraphModel page="1" pageWidth="1040" pageHeight="270" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Injector ground return" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_0" value="VNL5050S5-E SOURCE" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="40.0" y="95" width="293.3333333333333" height="85" as="geometry" />
</mxCell>
<mxCell id="node_1" value="INJ_PGND&#10;Short, low-impedance copper" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="373.3333333333333" y="95" width="293.3333333333333" height="85" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_0" target="node_1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_2" value="Power-entry ground star" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="706.6666666666666" y="95" width="293.3333333333333" height="85" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_1" target="node_2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note195" value="SOURCE is both power return and local logic reference. No separate Kelvin pin." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="195" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.7 KiB

@@ -0,0 +1,44 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Injector power path" id="injector-power">
<mxGraphModel page="1" pageWidth="1040" pageHeight="460" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Injector power path" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_rail" value="VBAT_PROT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="100" width="230" height="80" as="geometry" />
</mxCell>
<mxCell id="node_load" value="Injector coil" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="350" y="100" width="280" height="80" as="geometry" />
</mxCell>
<mxCell id="node_driver" value="VNL5050S5-E&#10;DRAIN" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="720" y="100" width="290" height="80" as="geometry" />
</mxCell>
<mxCell id="node_switch" value="Internal low-side MOSFET" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="720" y="230" width="290" height="70" as="geometry" />
</mxCell>
<mxCell id="node_return" value="SOURCE → INJ_PGND" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="350" y="350" width="660" height="60" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_rail" target="node_load" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_load" target="node_driver" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_driver" target="node_switch" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e3" source="node_switch" target="node_return" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=0.5;exitY=1;entryX=0.8;entryY=0;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note410" value="Functional current path. INJ_PGND returns separately to the power-entry ground star." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="410" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns="http://www.w3.org/2000/svg" xml:lang="en" height="287.8pt" width="538.72pt" viewBox="-72.836 -258.2 538.72 287.8" style="background-color:white;"><path d="M 0.0,-0.0 L 72,-0 L 75,-9 L 81,9 L 87,-9 L 93,9 L 99,-9 L 105,9 L 108,-0 L 180,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 180.0,-144.0 L 180,-90 L 189,-87 L 171,-81 L 189,-75 L 171,-69 L 189,-63 L 171,-57 L 180,-54 L 180,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 180.0,-0.0 L 270,-0 L 360,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><text x="90.0" y="-24.6" dominant-baseline="ideographic" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="90.0" dy="12">Rprot · 1 kΩ</tspan></text><text x="167.4" y="-90.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="167.4" dy="12">Pull-up</tspan><tspan x="167.4" dy="12">Value TBD</tspan></text><text x="183.6" y="-237.6" dominant-baseline="ideographic" fill="#20394e" font-size="18" font-family="DejaVu Sans" text-anchor="middle"><tspan x="183.6" dy="18">VNL5050S5-E · open-drain diagnostic</tspan></text><circle cx="0" cy="-0" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="-6.3" y="-12.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="-6.3" dy="12">STATUS</tspan></text><circle cx="180" cy="-0" r="2.7" style="stroke:#20394e;fill:#20394e;stroke-width:1.5;stroke-dasharray:-;" /><circle cx="180" cy="-144" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="180.0" y="-162.29999999999998" dominant-baseline="ideographic" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="180.0" dy="12">+3V3_MAIN</tspan></text><circle cx="360" cy="-0" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="366.3" y="-12.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="start"><tspan x="366.3" dy="12">MCU_STATUS</tspan></text></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,74 @@
{
"title": "Injector status acquisition",
"source": "IO_MODULES/INJECTON.md: Status diagnostic",
"reference_scope": "documentation only",
"components": [
{
"ref": "U",
"kind": "port",
"pins": [
"P"
],
"value": "STATUS"
},
{
"ref": "Rprot",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "Rprot \u00b7 1 k\u03a9"
},
{
"ref": "V",
"kind": "port",
"pins": [
"P"
],
"value": "+3V3_MAIN"
},
{
"ref": "R_PULLUP",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "Pull-up\nValue TBD"
},
{
"ref": "M",
"kind": "port",
"pins": [
"P"
],
"value": "MCU_STATUS"
}
],
"nets": [
{
"name": "STATUS",
"connections": [
"U.P",
"Rprot.1"
]
},
{
"name": "MCU_STATUS",
"connections": [
"Rprot.2",
"R_PULLUP.2",
"M.P"
]
},
{
"name": "+3V3_MAIN",
"connections": [
"V.P",
"R_PULLUP.1"
]
}
],
"no_connects": []
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

+2
View File
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns="http://www.w3.org/2000/svg" xml:lang="en" height="365.20000000000005pt" width="803.1039999999999pt" viewBox="-87.596 -150.2 803.1039999999999 365.20000000000005" style="background-color:white;"><path d="M 0.0,-0.0 L 54,-0 L 108,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 108.0,-0.0 L 108,36 L 117,39 L 99,45 L 117,51 L 99,57 L 117,63 L 99,69 L 108,72 L 108,108" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 108.0,108.0 L 108,122.4 L 99,122.4 L 117,122.4 M 101.7,126.72 L 114.3,126.72 M 106.2,131.04 L 109.8,131.04" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 216.0,36.0 L 360,36 L 360,-36 L 216,-36 L 216,36" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 216.0,-0.0 L 198,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 360.0,-0.0 L 378,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 108.0,-0.0 L 153,-0 L 198,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 378.0,-0.0 L 423,-0 L 468,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 468.0,-0.0 L 468,36 L 477,39 L 459,45 L 477,51 L 459,57 L 477,63 L 459,69 L 468,72 L 468,108" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 468.0,108.0 L 468,122.4 L 459,122.4 L 477,122.4 M 461.7,126.72 L 474.3,126.72 M 466.2,131.04 L 469.8,131.04" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 468.0,-0.0 L 540,-0 L 612,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><text x="95.4" y="42.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="95.4" dy="12">R_IN_PD</tspan></text><text x="108.0" y="122.64000000000001" dominant-baseline="hanging" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="108.0" dy="12">GND</tspan></text><text x="221.4" y="-14.0" dominant-baseline="central" fill="#20394e" font-size="14" font-family="DejaVu Sans" text-anchor="start"><tspan x="221.4" dy="14">INx</tspan></text><text x="354.59999999999997" y="-14.0" dominant-baseline="central" fill="#20394e" font-size="14" font-family="DejaVu Sans" text-anchor="end"><tspan x="354.59999999999997" dy="14">OUTx</tspan></text><text x="288.0" y="-63.6" dominant-baseline="ideographic" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="288.0" dy="12">TPS4H000-Q1</tspan><tspan x="288.0" dy="12">VBB = +5V_AUX</tspan></text><text x="455.40000000000003" y="42.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="455.40000000000003" dy="12">R_OUT_PD</tspan></text><text x="468.0" y="122.64000000000001" dominant-baseline="hanging" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="468.0" dy="12">GND</tspan></text><text x="291.59999999999997" y="-129.60000000000002" dominant-baseline="ideographic" fill="#20394e" font-size="18" font-family="DejaVu Sans" text-anchor="middle"><tspan x="291.59999999999997" dy="18">5 V high-side logic output</tspan></text><text x="291.59999999999997" y="183.4" dominant-baseline="ideographic" fill="#20394e" font-size="11" font-family="DejaVu Sans" text-anchor="middle"><tspan x="291.59999999999997" dy="11">+5V_MAIN → eFuse / load switch → +5V_AUX. Connector TVS selection is specified in the text.</tspan></text><circle cx="0" cy="-0" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="-6.3" y="-12.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="-6.3" dy="12">MCU GPIO</tspan></text><circle cx="108" cy="-0" r="2.7" style="stroke:#20394e;fill:#20394e;stroke-width:1.5;stroke-dasharray:-;" /><circle cx="468" cy="-0" r="2.7" style="stroke:#20394e;fill:#20394e;stroke-width:1.5;stroke-dasharray:-;" /><circle cx="612" cy="-0" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="618.3000000000001" y="-12.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="start"><tspan x="618.3000000000001" dy="12">LOGIC_OUTx</tspan></text></svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

@@ -0,0 +1,94 @@
{
"title": "Protected 5 V logic output",
"source": "IO_MODULES/DIGITAL_OUTPUTS.md: Protected 5 V logic outputs",
"reference_scope": "documentation only",
"components": [
{
"ref": "J",
"kind": "port",
"pins": [
"P"
],
"value": "MCU GPIO"
},
{
"ref": "R_IN_PD",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_IN_PD"
},
{
"ref": "GI",
"kind": "ground-port",
"pins": [
"P"
],
"value": "GND"
},
{
"ref": "U",
"kind": "functional-block",
"pins": [
"INx",
"OUTx"
],
"value": "TPS4H000-Q1\nVBB = +5V_AUX"
},
{
"ref": "R_OUT_PD",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_OUT_PD"
},
{
"ref": "GO",
"kind": "ground-port",
"pins": [
"P"
],
"value": "GND"
},
{
"ref": "O",
"kind": "port",
"pins": [
"P"
],
"value": "LOGIC_OUTx"
}
],
"nets": [
{
"name": "MCU GPIO",
"connections": [
"J.P",
"R_IN_PD.1",
"U.INx"
]
},
{
"name": "GND",
"connections": [
"R_IN_PD.2",
"GI.P",
"R_OUT_PD.2",
"GO.P"
]
},
{
"name": "LOGIC_OUTx",
"connections": [
"U.OUTx",
"R_OUT_PD.1",
"O.P"
]
}
],
"no_connects": []
}
@@ -0,0 +1,77 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Protected and filtered rail branches" id="power-branches">
<mxGraphModel page="1" pageWidth="1040" pageHeight="700" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Protected and filtered rail branches" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_a0" value="+5V_MAIN" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="95" width="240" height="90" as="geometry" />
</mxCell>
<mxCell id="node_b0" value="eFuse / protected load switch" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="340" y="95" width="320" height="90" as="geometry" />
</mxCell>
<mxCell id="node_c0" value="+5V_AUX&#10;External logic outputs" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="730" y="95" width="280" height="90" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_a0" target="node_b0" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_b0" target="node_c0" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_a1" value="+5V_MAIN" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="230" width="240" height="90" as="geometry" />
</mxCell>
<mxCell id="node_b1" value="eFuse / load switch&#10;Ferrite bead + local filter" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="340" y="230" width="320" height="90" as="geometry" />
</mxCell>
<mxCell id="node_c1" value="+5V_SENS&#10;5 V sensor excitation" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="730" y="230" width="280" height="90" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_a1" target="node_b1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e3" source="node_b1" target="node_c1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_a2" value="+3V3_MAIN" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="365" width="240" height="90" as="geometry" />
</mxCell>
<mxCell id="node_b2" value="Ferrite bead + local filter" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="340" y="365" width="320" height="90" as="geometry" />
</mxCell>
<mxCell id="node_c2" value="+3V3_ANA&#10;Analogue supplies /&#10;ADC reference" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="730" y="365" width="280" height="90" as="geometry" />
</mxCell>
<mxCell id="e4" source="node_a2" target="node_b2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5" source="node_b2" target="node_c2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_a3" value="12 V buck-boost output" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="500" width="240" height="90" as="geometry" />
</mxCell>
<mxCell id="node_b3" value="Current limit / protected switch&#10;Harness filter + decoupling" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="340" y="500" width="320" height="90" as="geometry" />
</mxCell>
<mxCell id="node_c3" value="+12V_SENS&#10;Crank / cam Hall sensors" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="730" y="500" width="280" height="90" as="geometry" />
</mxCell>
<mxCell id="e6" source="node_a3" target="node_b3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e7" source="node_b3" target="node_c3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note630" value="Optional analogue LDO and final current limits remain validation items; see the rail descriptions." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="630" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1,92 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Power sources and battery loads" id="power-sources">
<mxGraphModel page="1" pageWidth="1040" pageHeight="790" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Power sources and battery loads" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_battery" value="4S LiPo&#10;14.8 V nominal · 16.8 V full" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="90" width="290" height="80" as="geometry" />
</mxCell>
<mxCell id="node_protection" value="Input fuse · reverse protection&#10;TVS / transient protection" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="390" y="90" width="310" height="80" as="geometry" />
</mxCell>
<mxCell id="node_vbat" value="VBAT_PROT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="770" y="90" width="230" height="80" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_battery" target="node_protection" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_protection" target="node_vbat" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_loadsin" value="VBAT_PROT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="245" width="190" height="74" as="geometry" />
</mxCell>
<mxCell id="node_loads" value="Protected battery branches" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="300" y="245" width="310" height="74" as="geometry" />
</mxCell>
<mxCell id="node_loadsout" value="Ignition · injector&#10;Low-side outputs · VBAT sense" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="690" y="245" width="310" height="74" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_loadsin" target="node_loads" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e3" source="node_loads" target="node_loadsout" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_fivein" value="VBAT_PROT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="365" width="190" height="74" as="geometry" />
</mxCell>
<mxCell id="node_five" value="Synchronous buck · 5 V" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="300" y="365" width="310" height="74" as="geometry" />
</mxCell>
<mxCell id="node_fiveout" value="+5V_MAIN&#10;Internal 5 V circuitry" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="690" y="365" width="310" height="74" as="geometry" />
</mxCell>
<mxCell id="e4" source="node_fivein" target="node_five" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5" source="node_five" target="node_fiveout" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_threein" value="VBAT_PROT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="485" width="190" height="74" as="geometry" />
</mxCell>
<mxCell id="node_three" value="Synchronous buck · 3.3 V" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="300" y="485" width="310" height="74" as="geometry" />
</mxCell>
<mxCell id="node_threeout" value="+3V3_MAIN&#10;MCU / digital / communications" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="690" y="485" width="310" height="74" as="geometry" />
</mxCell>
<mxCell id="e6" source="node_threein" target="node_three" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e7" source="node_three" target="node_threeout" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_twelvein" value="VBAT_PROT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="605" width="190" height="74" as="geometry" />
</mxCell>
<mxCell id="node_twelve" value="Regulated buck-boost · 12 V" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="300" y="605" width="310" height="74" as="geometry" />
</mxCell>
<mxCell id="node_twelveout" value="+12V_SENS&#10;Protected Hall-sensor supply" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="690" y="605" width="310" height="74" as="geometry" />
</mxCell>
<mxCell id="e8" source="node_twelvein" target="node_twelve" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e9" source="node_twelve" target="node_twelveout" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note725" value="Repeated VBAT_PROT labels denote the same rail. Protected branch details are shown separately." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="725" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

+56
View File
@@ -0,0 +1,56 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Ratiometric sensor acquisition" id="ratiometric">
<mxGraphModel page="1" pageWidth="1040" pageHeight="540" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Ratiometric sensor acquisition" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_rail" value="+5V_SENS" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="90" width="220" height="74" as="geometry" />
</mxCell>
<mxCell id="node_sensor" value="5 V sensor&#10;Excitation input" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="340" y="90" width="280" height="74" as="geometry" />
</mxCell>
<mxCell id="node_sig" value="Sensor output" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="240" width="220" height="74" as="geometry" />
</mxCell>
<mxCell id="node_div" value="Matched divider / filter" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="340" y="240" width="280" height="74" as="geometry" />
</mxCell>
<mxCell id="node_adc" value="ADC sensor channel" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="730" y="240" width="280" height="74" as="geometry" />
</mxCell>
<mxCell id="node_rail2" value="+5V_SENS" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="380" width="220" height="74" as="geometry" />
</mxCell>
<mxCell id="node_sense" value="Matched divider / filter" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="340" y="380" width="280" height="74" as="geometry" />
</mxCell>
<mxCell id="node_adc2" value="ADC 5-V-sense channel" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="730" y="380" width="280" height="74" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_rail" target="node_sensor" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_sig" target="node_div" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_div" target="node_adc" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e3" source="node_rail2" target="node_sense" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e4" source="node_sense" target="node_adc2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note470" value="Sensor output is the sensors signal pin. Both ADC channels use +3V3_ANA as their reference." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="470" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

+2
View File
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns="http://www.w3.org/2000/svg" xml:lang="en" height="479.44000000000005pt" width="529.216pt" viewBox="-92.636 -114.2 529.216 479.44000000000005" style="background-color:white;"><path d="M 0.0,-0.0 L 72,-0 L 144,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 144.0,-0.0 L 144,27 L 153,30 L 135,36 L 153,42 L 135,48 L 153,54 L 135,60 L 144,63 L 144,90" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 144.0,90.0 L 144,104.4 L 135,104.4 L 153,104.4 M 137.7,108.72 L 150.3,108.72 M 142.2,113.04 L 145.8,113.04" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 144.0,-0.0 L 234,-0 L 324,-0" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 0.0,216.0 L 72,216 L 144,216" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 144.0,216.0 L 144,243 L 153,246 L 135,252 L 153,258 L 135,264 L 153,270 L 135,276 L 144,279 L 144,306" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 144.0,306.0 L 144,320.4 L 135,320.4 L 153,320.4 M 137.7,324.72 L 150.3,324.72 M 142.2,329.04 L 145.8,329.04" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><path d="M 144.0,216.0 L 234,216 L 324,216" style="stroke:#20394e;fill:none;stroke-width:1.5;stroke-dasharray:-;stroke-linecap:round;stroke-linejoin:round;" /><text x="131.4" y="33.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="131.4" dy="12">R_IN_PD</tspan></text><text x="144.0" y="104.64000000000001" dominant-baseline="hanging" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="144.0" dy="12">LOCAL_GND</tspan></text><text x="131.4" y="249.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="131.4" dy="12">R_EN_PD</tspan></text><text x="144.0" y="320.64" dominant-baseline="hanging" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="middle"><tspan x="144.0" dy="12">LOCAL_GND</tspan></text><text x="147.6" y="-93.60000000000001" dominant-baseline="ideographic" fill="#20394e" font-size="18" font-family="DejaVu Sans" text-anchor="middle"><tspan x="147.6" dy="18">TLE9104SH · default-low commands</tspan></text><circle cx="0" cy="-0" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="-6.3" y="-12.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="-6.3" dy="12">MCU GPIO</tspan></text><circle cx="144" cy="-0" r="2.7" style="stroke:#20394e;fill:#20394e;stroke-width:1.5;stroke-dasharray:-;" /><circle cx="324" cy="-0" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="330.3" y="-12.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="start"><tspan x="330.3" dy="12">TLE9104SH INx</tspan></text><circle cx="0" cy="216" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="-6.3" y="204.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="end"><tspan x="-6.3" dy="12">MCU enable</tspan></text><circle cx="144" cy="216" r="2.7" style="stroke:#20394e;fill:#20394e;stroke-width:1.5;stroke-dasharray:-;" /><circle cx="324" cy="216" r="2.7" style="stroke:#20394e;fill:white;stroke-width:1.5;stroke-dasharray:-;" /><text x="330.3" y="204.0" dominant-baseline="central" fill="#20394e" font-size="12" font-family="DejaVu Sans" text-anchor="start"><tspan x="330.3" dy="12">TLE9104SH EN</tspan></text></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

@@ -0,0 +1,101 @@
{
"title": "Low-side command default states",
"source": "IO_MODULES/DIGITAL_OUTPUTS.md: Protected low-side outputs",
"reference_scope": "documentation only",
"components": [
{
"ref": "J0",
"kind": "port",
"pins": [
"P"
],
"value": "MCU GPIO"
},
{
"ref": "R_IN_PD",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_IN_PD"
},
{
"ref": "G0",
"kind": "ground-port",
"pins": [
"P"
],
"value": "LOCAL_GND"
},
{
"ref": "U0",
"kind": "driver-pin",
"pins": [
"INx"
],
"value": "TLE9104SH INx"
},
{
"ref": "J1",
"kind": "port",
"pins": [
"P"
],
"value": "MCU enable"
},
{
"ref": "R_EN_PD",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_EN_PD"
},
{
"ref": "G1",
"kind": "ground-port",
"pins": [
"P"
],
"value": "LOCAL_GND"
},
{
"ref": "U1",
"kind": "driver-pin",
"pins": [
"EN"
],
"value": "TLE9104SH EN"
}
],
"nets": [
{
"name": "MCU GPIO",
"connections": [
"J0.P",
"R_IN_PD.1",
"U0.INx"
]
},
{
"name": "LOCAL_GND",
"connections": [
"R_IN_PD.2",
"G0.P",
"R_EN_PD.2",
"G1.P"
]
},
{
"name": "MCU enable",
"connections": [
"J1.P",
"R_EN_PD.1",
"U1.EN"
]
}
],
"no_connects": []
}
@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Low-side driver supplies and diagnostics" id="sink-interfaces">
<mxGraphModel page="1" pageWidth="1040" pageHeight="610" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Low-side driver supplies and diagnostics" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_s0" value="VBAT_PROT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="95" width="230" height="70" as="geometry" />
</mxCell>
<mxCell id="node_p0" value="TLE9104SH VS" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="380" y="95" width="280" height="70" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_s0" target="node_p0" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_s1" value="+5V_MAIN" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="205" width="230" height="70" as="geometry" />
</mxCell>
<mxCell id="node_p1" value="TLE9104SH VDD" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="380" y="205" width="280" height="70" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_s1" target="node_p1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_s2" value="+3V3_MAIN" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="315" width="230" height="70" as="geometry" />
</mxCell>
<mxCell id="node_p2" value="TLE9104SH VIO" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="380" y="315" width="280" height="70" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_s2" target="node_p2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_mcu" value="MCU SPI" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f0fc;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="440" width="230" height="80" as="geometry" />
</mxCell>
<mxCell id="node_spi" value="TLE9104SH SPI&#10;Commands + diagnostics" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="380" y="440" width="280" height="80" as="geometry" />
</mxCell>
<mxCell id="e3" source="node_mcu" target="node_spi" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#416680;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;startArrow=block;startFill=1;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note540" value="INx / EN default-low networks are shown in the companion circuit. Decouple supplies locally." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="540" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

+44
View File
@@ -0,0 +1,44 @@
<?xml version='1.0' encoding='utf-8'?>
<mxfile host="app.diagrams.net">
<diagram name="Generic low-side power path" id="sink-power">
<mxGraphModel page="1" pageWidth="1040" pageHeight="460" grid="1" gridSize="10">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node_title" value="Generic low-side power path" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=26;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="18" width="980" height="42" as="geometry" />
</mxCell>
<mxCell id="node_rail" value="VBAT_PROT" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#fff1d6;spacing=10;" vertex="1" parent="1">
<mxGeometry x="30" y="100" width="230" height="80" as="geometry" />
</mxCell>
<mxCell id="node_load" value="External load&#10;via SINK_OUTx" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="350" y="100" width="280" height="80" as="geometry" />
</mxCell>
<mxCell id="node_driver" value="TLE9104SH&#10;OUTx" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="720" y="100" width="290" height="80" as="geometry" />
</mxCell>
<mxCell id="node_switch" value="Internal low-side MOSFET" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#e8f4ed;spacing=10;" vertex="1" parent="1">
<mxGeometry x="720" y="230" width="290" height="70" as="geometry" />
</mxCell>
<mxCell id="node_return" value="Power return → OUT_PGND" style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=18;fontColor=#172b40;strokeColor=#577086;fillColor=#eef0f3;spacing=10;" vertex="1" parent="1">
<mxGeometry x="350" y="350" width="660" height="60" as="geometry" />
</mxCell>
<mxCell id="e0" source="node_rail" target="node_load" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e1" source="node_load" target="node_driver" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e2" source="node_driver" target="node_switch" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e3" source="node_switch" target="node_return" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=0;strokeWidth=2;strokeColor=#946221;fontSize=16;fontFamily=DejaVu Sans;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;exitX=0.5;exitY=1;entryX=0.8;entryY=0;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node_note410" value="Functional current path. OUT_PGND returns separately to the power-entry ground star." style="rounded=1;html=0;fontFamily=DejaVu Sans;fontSize=16;fontColor=#172b40;strokeColor=#577086;fillColor=#ffffff;spacing=10;strokeColor=none;fillColor=none;align=left;" vertex="1" parent="1">
<mxGeometry x="30" y="410" width="980" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.0 KiB

@@ -0,0 +1,124 @@
{
"title": "NTC excitation and acquisition",
"source": "IO_MODULES/ANALOG_INPUTS.md: NTC temperature channels",
"reference_scope": "documentation only",
"components": [
{
"ref": "V",
"kind": "port",
"pins": [
"P"
],
"value": "+5V_SENS"
},
{
"ref": "R_PULLUP",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_PULLUP\nSelected for sensor curve"
},
{
"ref": "NTC",
"kind": "thermistor",
"pins": [
"1",
"2"
],
"value": "NTC"
},
{
"ref": "GN",
"kind": "ground-port",
"pins": [
"P"
],
"value": "SENSOR_GND"
},
{
"ref": "AFE",
"kind": "functional-block",
"pins": [
"IN",
"OUT"
],
"value": "Attenuation / local filter"
},
{
"ref": "ADC",
"kind": "port",
"pins": [
"P"
],
"value": "ADC_NTC"
},
{
"ref": "VS",
"kind": "port",
"pins": [
"P"
],
"value": "+5V_SENS"
},
{
"ref": "SENSE",
"kind": "functional-block",
"pins": [
"IN",
"OUT"
],
"value": "Matched divider / filter"
},
{
"ref": "ADCS",
"kind": "port",
"pins": [
"P"
],
"value": "ADC_5V_SENSE"
}
],
"nets": [
{
"name": "+5V_SENS",
"connections": [
"V.P",
"R_PULLUP.1",
"VS.P",
"SENSE.IN"
]
},
{
"name": "NTC_NODE",
"connections": [
"R_PULLUP.2",
"NTC.1",
"AFE.IN"
]
},
{
"name": "SENSOR_GND",
"connections": [
"NTC.2",
"GN.P"
]
},
{
"name": "ADC_NTC",
"connections": [
"AFE.OUT",
"ADC.P"
]
},
{
"name": "ADC_5V_SENSE",
"connections": [
"SENSE.OUT",
"ADCS.P"
]
}
],
"no_connects": []
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.5 KiB

@@ -0,0 +1,155 @@
{
"title": "Crank / cam Hall input",
"source": "IO_MODULES/ENGINE_POSITION_INPUTS.md: Electrical interface",
"reference_scope": "documentation only",
"components": [
{
"ref": "J",
"kind": "port",
"pins": [
"P"
],
"value": "TRIG_x"
},
{
"ref": "V",
"kind": "port",
"pins": [
"P"
],
"value": "+12V_SENS"
},
{
"ref": "R_PULLUP",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_PULLUP\n4.7 k\u03a9 provision"
},
{
"ref": "CLAMP",
"kind": "transient-protection",
"pins": [
"SIG",
"RET"
],
"value": "Harness clamp / ratings TBD"
},
{
"ref": "GC",
"kind": "ground-port",
"pins": [
"P"
],
"value": "SENSOR_GND"
},
{
"ref": "R_DIV_TOP",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_DIV_TOP"
},
{
"ref": "R_DIV_BOTTOM",
"kind": "resistor",
"pins": [
"1",
"2"
],
"value": "R_DIV_BOTTOM"
},
{
"ref": "GB",
"kind": "ground-port",
"pins": [
"P"
],
"value": "SENSOR_GND"
},
{
"ref": "C_FILTER",
"kind": "capacitor",
"pins": [
"1",
"2"
],
"value": "C_FILTER\n1 nF initial"
},
{
"ref": "GF",
"kind": "ground-port",
"pins": [
"P"
],
"value": "SENSOR_GND"
},
{
"ref": "U",
"kind": "schmitt-buffer",
"pins": [
"IN",
"OUT"
],
"value": "SN74LVC2G17-Q1"
},
{
"ref": "MCU",
"kind": "port",
"pins": [
"P"
],
"value": "TIMER_3V3"
}
],
"nets": [
{
"name": "TRIG_x",
"connections": [
"J.P",
"R_PULLUP.2",
"CLAMP.SIG",
"R_DIV_TOP.1"
]
},
{
"name": "+12V_SENS",
"connections": [
"V.P",
"R_PULLUP.1"
]
},
{
"name": "SENSOR_GND",
"connections": [
"CLAMP.RET",
"GC.P",
"R_DIV_BOTTOM.2",
"GB.P",
"C_FILTER.2",
"GF.P"
]
},
{
"name": "DIVIDED",
"connections": [
"R_DIV_TOP.2",
"R_DIV_BOTTOM.1",
"C_FILTER.1",
"U.IN"
]
},
{
"name": "TIMER_3V3",
"connections": [
"U.OUT",
"MCU.P"
]
}
],
"no_connects": []
}