Circuit review & bench-test guide
AXS-034 — INA219 current/power monitor PMOD module
Document purpose#
This document explains the axs-034-ina219 prototype at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the implemented schematic (generate_design.py, axs-034-ina219.kicad_sch), the module README, and the TI INA219 datasheet.
The board is schematic-only. ERC is clean (0/0) and the netlist has been reviewed, but no PCB layout exists, no board has been fabricated, and there is no recorded bench result of any kind. Every numeric value in this guide — register readbacks, calibration results, expected currents, resistances — is a verification target derived from the schematic and the datasheet, not a measured result. Treat nothing below as proof that an assembled board works.
1. What the board does#
The board is an I2C PMOD module around the TI INA219 high-side current, bus voltage, and power monitor. An external supply-and-load pair connects through J2; the load current flows through a 0.1 Ω 1 % 2 W shunt (R5) between J2 pin 1 (supply in) and J2 pin 2 (load out). The INA219 measures the shunt drop (±320 mV full scale at the default PGA = /8, i.e. 3.2 A with this shunt) and the bus voltage at IN− (0–26 V), and — once the calibration register is programmed — reports current and power directly over I2C.
The measured circuit must share ground with the PMOD host through J2 pin 3. The module teaches the INA219 calibration-register fixed-point exercise: choosing a Current_LSB, computing CAL, and interpreting the three data registers.
Functional block diagram#
PMOD host J1 measured circuit
3V3/GND ────────┬──────────────┐
SCL (3,9) ──┬───┼──> U1 SCL │ supply in load out
SDA (4,10) ─┼─┬─┼──> U1 SDA │ J2.1 ──> R5 0.1R ──> J2.2
│ │ │ │ │VIN_P VIN_M│
R2 4.7k ──┘ │ │ INA219 U1 <┼────────┴──── IN+ IN− ───┘
(via JP2) │ │ VS=3V3 │ (kelvin sense pair)
R1 4.7k ────┘ │ A0 <── JP3 (GND default / 3V3)
(via JP1) │ A1 <── JP4 (GND default / 3V3)
C1 100n ──────┘
GND ── J2.3 (common ground reference)
2. Safety and scope boundaries#
- The INA219 supply (VS) comes from the PMOD 3V3 rail; the measured bus on J2 may be up to 26 V. Never confuse the two. Do not exceed 26 V on J2 pin 1 or 2 under any condition, including inductive kickback when breaking a load.
- The shunt inputs tolerate 26 V differential, but a load-side short places the full bus voltage across R5: at 26 V that is 6.76 kW demanded from a 2 W part. The shunt is not a fuse. Current-limit the measured supply.
- The measured supply's return must be tied to J2 pin 3 (module GND). Floating or dual-referenced grounds invalidate the bus-voltage reading and can drive pins outside absolute maximums.
- Use a current-limited 3.3 V bench supply (set ≈100 mA limit) or a real PMOD host for the logic side. The INA219 draws ≈1 mA maximum; anything more flowing into the 3V3 pin indicates a fault.
- This is a prototype without layout, DRC, fabrication, or bench history. Do not connect it to hardware you care about until the bring-up plan below has passed on a first article.
- Kelvin routing of the IN+/IN− sense traces is a layout requirement noted in the schematic but not yet realized; measurement accuracy claims are void until the layout exists and is reviewed.
3. Power and control sequence#
- With no PMOD host attached, the board is unpowered. There is no local regulator; 3V3 and GND come straight from J1 (pins 6/12 and 5/11).
- On power-up the INA219 performs a power-on reset (POR threshold 2 V) and loads its default configuration: register 0x00 = 0x399F (32 V bus range, PGA = /8 ±320 mV, 12-bit ADCs, continuous shunt-and-bus mode).
- A0 and A1 are sampled on every bus transaction, not just at reset; JP3 (A0) and JP4 (A1) hold them at GND by default, giving 7-bit address 0x40.
- Without calibration, the shunt-voltage (0x01) and bus-voltage (0x02) registers read real data immediately; current (0x04) and power (0x03) stay at zero until calibration register 0x05 is written.
- The measured circuit on J2 is electrically independent of the logic supply sequence: the datasheet states the bus may be present with VS off and vice versa. No sequencing constraint exists between J1 and J2.
4. Interfaces#
PMOD pin map (Type 6 extended, J1)#
| Pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | NC | NC | SCL | SDA | GND | 3V3 | NC | NC | SCL | SDA | GND | 3V3 |
Pins 9/10 repeat the bus for module chaining; 11/12 repeat GND/3V3.
Load-path connector J2 (2.54 mm 1x03 header)#
| Pin | Net | Use |
|---|---|---|
| 1 | VIN_P | measured supply in (shunt high side, U1 IN+) |
| 2 | VIN_M | load out, through the shunt (U1 IN−, bus-voltage sense point) |
| 3 | GND | common ground reference for the measured circuit |
Jumpers#
| Ref. | Type | Default | Function |
|---|---|---|---|
| JP1 | 2-pad solder jumper, bridged | fitted | SDA pull-up R1 in circuit; cut when another chained module provides pull-ups |
| JP2 | 2-pad solder jumper, bridged | fitted | SCL pull-up R2 in circuit; cut when another chained module provides pull-ups |
| JP3 | 3-pad solder jumper, 1-2 bridged | A0 = GND | A0 select: 1-2 GND (default), 2-3 3V3 |
| JP4 | 3-pad solder jumper, 1-2 bridged | A1 = GND | A1 select: 1-2 GND (default), 2-3 3V3 |
Address map reachable with these jumpers (INA219 Table 1):
| JP4 (A1) | JP3 (A0) | 7-bit address |
|---|---|---|
| GND | GND | 0x40 (default) |
| GND | 3V3 | 0x41 |
| 3V3 | GND | 0x44 |
| 3V3 | 3V3 | 0x45 |
The README's "0x40–0x45" span is only partly reachable: 0x42/0x43 require strapping A0 to SDA/SCL, which these jumpers do not offer. Honest limitation, not a defect.
Test points#
None are defined in the schematic. Probe at J1/J2 pins and the jumper pads. Adding TPs for VIN_P, VIN_M, SDA, SCL, and 3V3 is a recommended layout task.
5. Component-by-component review#
Every reference designator in generate_design.py is covered. Designators R3/R4 do not exist on this module (no gap-fill parts); the shunt is deliberately numbered R5.
5.1 Active device and connectors#
| Ref. | Part / datasheet summary | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| U1 | TI INA219AIDR, SOIC-8, zero-drift current/power monitor, VS 3–5.5 V, bus 0–26 V, IQ 0.7 mA typ / 1 mA max | Measures shunt drop and bus voltage; computes current/power after calibration; the entire point of the board | No I2C ACK; module is inert | Rotated package swaps IN+/A1 corner pins — likely destroyed or nonsensical readings; wrong grade (A vs B) changes accuracy only |
| J1 | 12-pin PMOD plug | Host power and I2C; duplicates bus on 9/10 for chaining | No power/no bus | Reversed insertion swaps 3V3/GND onto signal pins; verify keying before power |
| J2 | 1x03 pin header, 2.54 mm | Measured supply/load path and ground reference | No measurement path; INA219 still ACKs and reads ~0 | Swapping pins 1/2 reverses shunt polarity (negative shunt register, two's complement); load on pin 3 shorts through board ground |
5.2 Shunt#
| Ref. | Value / part | Purpose | If omitted | Important failure/review point |
|---|---|---|---|---|
| R5 | 0.1 Ω 1 % 2 W, 2512 (Bourns CRA2512-FZ-R100ELF) | Converts load current to sense voltage: 10 mV per 100 mA; 3.2 A = 320 mV = PGA/8 full scale; I²R at 3.2 A ≈ 1.02 W (inside 2 W rating, hot) | Load path open — no load current flows at all (shunt is in series) | A wrong (larger) value overranges the PGA early and breaks all calibration math; a 0 Ω/solder-blob short reads zero current forever; non-kelvin routing adds trace resistance directly into the measurement |
Note the 3.2 A ceiling: ±320 mV maximum PGA input ÷ 0.1 Ω. Beyond that the shunt register clips (out-of-range values shown shaded in datasheet Table 7) and the math-overflow flag (bus-voltage register bit 0, OVF) may assert.
5.3 Pull-ups, decoupling, and jumpers#
| Refs. | Value | Function | If omitted or wrong |
|---|---|---|---|
| R1 | 4.7 kΩ (Yageo RC0603FR-074K7L) | SDA pull-up to 3V3 through JP1 | Bus floats if no other module provides pull-ups: no ACKs, garbage transfers |
| R2 | 4.7 kΩ (Yageo RC0603FR-074K7L) | SCL pull-up to 3V3 through JP2 | Same as R1, on the clock |
| C1 | 100 nF 16 V X7R (Murata GRM188R71C104KA01D) | U1 VS decoupling (datasheet-recommended 0.1 µF at the supply pin) | Supply bounce; possible conversion noise/resets; works on a quiet bench but is not optional |
| JP1 / JP2 | solder jumpers, bridged by default | Disconnect R1/R2 when chaining modules that already have pull-ups | Both cut with no external pull-ups = dead bus; both fitted on a long chain = pull-up parallel stack too strong (e.g. 3 modules ≈ 1.57 kΩ, still legal at 3.3 V but check sink current, 3 mA spec point) |
| JP3 / JP4 | 3-pad solder jumpers, 1-2 (GND) default | A0/A1 address straps | Cut-but-unbridged jumper leaves the address pin floating: A0/A1 are sampled every transaction, so the address becomes unstable — always bridge exactly one side |
5.4 ERC-only artifacts#
| Refs. | What they are | Review note |
|---|---|---|
| #FLG01 (3V3), #FLG02 (GND), #FLG03 (VIN_P) | KiCad PWR_FLAG symbols | Schematic-only ERC markers declaring these nets externally powered. They place no component on the PCB and need no assembly or test action. |
6. Datasheet summary and design interpretation#
| Device | Key manufacturer facts used here | Board-specific interpretation |
|---|---|---|
| INA219 (TI SBOS448G) | VS 3–5.5 V, IQ 0.7 mA typ/1 mA max; bus input 0–26 V independent of VS; abs max VS 6 V, analog inputs −0.3–26 V common-mode, ±26 V differential; shunt LSB 10 µV; bus LSB 4 mV (register left-shifted 3 bits); PGA /1../8 = ±40/±80/±160/±320 mV; 12-bit conversion 532 µs typ / 586 µs max; default config 0x399F; CAL = trunc(0.04096 / (Current_LSB × RSHUNT)); Power_LSB = 20 × Current_LSB; Current reg = Shunt reg × CAL / 4096; Power reg = Current reg × Bus reg / 5000; I2C fast mode to 400 kHz, HS mode to 2.56 MHz; SMBus timeout resets the interface if SCL or SDA is low > 28 ms; 16 addresses via A0/A1 | 3.3 V PMOD rail is inside the 3–5.5 V VS range. Default PGA/8 + 0.1 Ω shunt gives 3.2 A full scale. The 4-µs post-write register-settling note only matters above 1 MHz SCL — irrelevant at 100/400 kHz bring-up. The 28 ms SMBus timeout is a free bus-unstick mechanism worth remembering during FPGA I2C-master debug |
| Shunt / passives | Bourns CRA2512 0.1 Ω 1 % 2 W; Yageo RC series pull-ups; Murata GRM X7R/X5R ceramics | 1 % shunt tolerance enters every current/power number directly; calibrate it out with Equation 6 (Corrected_Full_Scale_Cal) once a trusted ammeter is available |
Official references: INA219 datasheet (SBOS448G), INA219 product page, Yageo RC thick-film resistors, Murata capacitor search. Check the latest datasheet revision before procurement.
Calibration-register math for this board (0.1 Ω shunt)#
Worked example — the values the HDL/driver should use and the bench should verify:
- Maximum expected current: limited by the PGA to 320 mV / 0.1 Ω = 3.2 A.
- Minimum Current_LSB = 3.2 A / 2^15 = 97.66 µA/bit. Round up to a friendly value: Current_LSB = 100 µA/bit.
- CAL = trunc(0.04096 / (100 µA × 0.1 Ω)) = trunc(4096.0) = 4096 = 0x1000. Write 0x1000 to register 0x05.
- Power_LSB = 20 × Current_LSB = 2 mW/bit.
- Register interpretation:
- Shunt-voltage register 0x01: LSB = 10 µV, two's complement, sign-extended per PGA (at PGA/8, ±320 mV = ±32000 decimal).
- Bus-voltage register 0x02: shift right 3 bits, then LSB = 4 mV (13-bit value BD12..BD0); bit 1 = CNVR (conversion ready), bit 0 = OVF (math overflow).
- Current register 0x04 = Shunt reg × 4096 / 4096 = numerically equal to the shunt register with this CAL; multiply by 100 µA for amperes.
- Power register 0x03 = Current reg × Bus reg / 5000; multiply by 2 mW.
7. Expected values before bench testing#
All values are calculated targets, not measurements.
| Quantity | Design target / calculated value | What to measure |
|---|---|---|
| 3V3 rail current, idle | ≈0.7 mA typ, ≤1 mA (INA219 IQ; pull-ups add ≈1.4 mA only while a line is held low) | Bench supply readout |
| SDA/SCL idle level | 3.3 V (high through R1/R2) | DMM at J1 pins 3/4 |
| SDA/SCL to 3V3 resistance, unpowered | ≈4.7 kΩ each (JP1/JP2 fitted) | Ohmmeter |
| I2C address ACK | 0x40 only (default straps); 0x41/0x44/0x45 per JP3/JP4 | Address scan |
| Config register 0x00 after POR | 0x399F | First read transaction |
| Registers 0x03/0x04/0x05 after POR | 0x0000 each | Reads before calibration |
| CAL for Current_LSB = 100 µA | 0x1000 (4096) readback (bit 0 always 0) | Write/readback 0x05 |
| Shunt register with 3.3 V / 33 Ω load (≈100 mA) | ≈1000 decimal (0x03E8) = 10.00 mV; band 950–1050 (±5 %: supply, 33 Ω 1 %, shunt 1 %, gain 0.5 %) | Read 0x01 |
| Current register, same load | ≈1000 → 100.0 mA (equal to shunt register at CAL = 4096) | Read 0x04 |
| Bus-voltage register, same load | (3.3 V − 10 mV)/4 mV ≈ 822 after >>3; raw ≈ 0x19B0; band 3.20–3.36 V | Read 0x02, shift, scale |
| Power register, same load | ≈ 1000 × 822 / 5000 ≈ 164 → 328 mW (I×V ≈ 100 mA × 3.29 V) | Read 0x03 |
| Full-scale ceiling | 3.2 A / 320 mV; OVF beyond | Do not test at 3.2 A until layout thermal review exists |
| 12-bit conversion time | 532 µs typ / 586 µs max per channel | CNVR-bit polling or scope |
8. Manual schematic and assembly review checklist#
- Confirm U1 pin-1 orientation against the SOIC-8 pinout (A1 on pin 1; IN+ on pin 8 — the D-package pinout differs from SOT-23, check the right column).
- Verify R5 is the 0.1 Ω 2512 part, not a 0.1 kΩ or 0603 substitute; measure it in-circuit with a 4-wire milliohm setup if available (expect ≈0.10 Ω).
- Confirm JP1 and JP2 are bridged (default) or deliberately cut, matching the intended chain position. Exactly one side of JP3 and JP4 must be bridged.
- Verify C1 is placed at U1 VS (layout task: as close as possible).
- Buzz J1 pin 3 → U1 SCL, pin 4 → U1 SDA, and the 9/10 duplicates.
- Buzz J2 pin 1 → R5 → J2 pin 2, and J2 pin 1 → U1 IN+, J2 pin 2 → U1 IN− (kelvin pairs at layout).
- Confirm no solder short between VIN_P/VIN_M and 3V3 or GND: J2.1-to-GND and J2.2-to-GND should read open (megohms) on an unpowered board.
- Layout review (future): kelvin sense connections per datasheet section 11.1, shunt copper sized for 3.2 A, C1 adjacent to VS.
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record board serial, equipment, and raw data for every step. Assumed bench: PMOD host (3.3 V) or current-limited 3.3 V supply on J1, plus a second current-limited supply and a 33 Ω ≥1 W resistor for the load test.
A. Unpowered inspection and resistance tests#
- Complete the checklist in section 8 under magnification.
- Ohmmeter, unpowered: 3V3-to-GND at J1 — expect no hard short (>10 kΩ, settling as C1 charges from the meter).
- SDA-to-3V3 and SCL-to-3V3: expect ≈4.7 kΩ each (R1/R2 through JP1/JP2). This is the standing JP1/JP2 verification: fitted = ≈4.7 kΩ, cut = open. Re-check after any jumper rework.
- A0-to-GND and A1-to-GND at the JP3/JP4 center pads: expect ≈0 Ω (default 1-2 bridges).
- J2.1-to-J2.2: expect ≈0.1 Ω (R5). J2.1-to-GND: open.
B. First power-up, logic side only#
- Nothing on J2. Apply 3.3 V (current limit ≈100 mA) to J1 pins 6/12, GND to 5/11.
- Supply current: expect ≈0.7–1 mA. Investigate >2 mA before proceeding.
- DMM: SDA and SCL both read ≈3.3 V (bus idle high). A line stuck low means a solder short or damaged U1.
C. Address-ACK scan and first transaction#
- Run an I2C scan at 100 kHz. Expected: ACK at 0x40 only (default straps). Any other ACK means a strap or address decode problem.
- If JP3 is rebridged 2-3: expect 0x41. JP4 2-3: 0x44. Both: 0x45. Note 0x42/0x43 are unreachable on this board.
- First transaction — config register readback: write pointer 0x00, then read 2 bytes:
- Bus bytes:
S 0x40+W ACK 0x00 ACK Sr 0x40+R ACK 0x39 ACK 0x9F NACK P - Expected data: 0x39 0x9F (POR default 0x399F).
- Read 0x03, 0x04, 0x05: expect 0x0000 each (uncalibrated).
- Optional: write 0x8000 to 0x00 (RST self-clearing bit), re-read 0x399F.
D. Calibration and zero-load sanity#
- Write CAL:
S 0x40+W 0x05 0x10 0x00 P. Read back 0x05: expect 0x1000. - With J2 still open, read 0x01 and 0x04: expect ≈0 (within a few LSB of offset; datasheet VOS at PGA/8 is ±200 µV max for the A grade, i.e. up to ±20 counts — record the actual zero offset for this serial).
- Read 0x02: with nothing on J2, IN− floats; the bus reading is meaningless here. Do not fail the board on it.
E. Known-load current check#
- Second supply: 3.3 V, current limit 150 mA, positive to J2.1, return to J2.3 (and commoned with J1 GND). Load: 33 Ω ≥1 W from J2.2 to J2.3.
- Expected load current ≈ 3.3 / 33.1 ≈ 99.7 mA. Confirm on the supply readout or a series DMM.
- Read the registers and compare:
- Shunt 0x01: ≈0x03E8 (1000 dec, 10.00 mV), accept 950–1050.
- Current 0x04: same count as 0x01 (CAL = 4096) → ≈100.0 mA.
- Bus 0x02: after >>3, ≈822 counts ≈ 3.29 V, accept 3.20–3.36 V.
- Power 0x03: ≈164 counts ≈ 328 mW, consistent with I×V within ±7 %.
- Cross-check: DMM across R5 should read ≈10 mV and match the shunt register within tolerance. A ×2 or ×0.5 disagreement means the wrong shunt value or a broken kelvin connection.
- Reverse test: swap supply and load (current flows J2.2 → J2.1). Shunt and current registers must go negative (two's complement, e.g. ≈0xFC18).
F. Range, overflow, and chaining tests (deferred/careful)#
- Step the load toward higher currents only after the fabricated board's copper and shunt thermals are reviewed; verify OVF (0x02 bit 0) asserts past 3.2 A equivalent rather than silently wrapping. Do not soak at 3.2 A on a first article.
- Chain test: two modules on one bus, one with JP1/JP2 cut; verify both addresses ACK and idle levels remain ≈3.3 V with the combined pull-up.
- Bus-voltage range test with an elevated (e.g. 12 V) measured rail only after step E passes; confirm the 4 mV × count reading tracks a DMM.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| No ACK at any address | SDA/SCL idle levels, 3V3 at U1 pin 5 | JP1/JP2 cut with no external pull-ups, U1 orientation/solder, J1 wiring |
| ACK at unexpected address | Voltage at A0/A1 pads during a transaction | JP3/JP4 bridged wrong side, floating strap (both sides open) |
| Config reads garbage, not 0x399F | Repeat at 100 kHz, check waveforms | Bus integrity, missing STOP, byte order (MSB first), analyzer decode |
| Current/power always 0 | Read 0x05 | CAL never written or write failed (0x05 bit 0 always reads 0 — that is normal) |
| Shunt register 0 with real load | DMM across R5 | Shunt shorted by solder, load actually wired J2.1→J2.3 bypassing R5 |
| Current reading ×10 off | R5 marking/measurement | Wrong shunt value or wrong Current_LSB in software |
| Negative readings with normal load | J2 pin order | Supply and load swapped (IN+ / IN− reversed) |
| Bus voltage nonsense | Ground bond J2.3 to host GND | Missing common ground; IN− not at load node |
| OVF bit set at modest current | PGA bits in 0x00 | Config rewritten to a smaller PGA range than ±320 mV |
| Readings unstable/noisy | C1 presence, supply ripple, lead dress | Decoupling, long unshielded sense leads, no averaging (raise SADC/BADC) |
11. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
| JP1/JP2 state (fitted/cut) and measured pull-up resistance | |
| JP3/JP4 strap positions and resulting address | |
| Host/supply, current limits, equipment and calibration IDs | |
| Idle 3V3 current | |
| Address-scan result | |
| Config 0x00 readback | |
| CAL written / readback | |
| Zero-offset counts (0x01, 0x04) | |
| 33 Ω load: 0x01 / 0x04 / 0x02 / 0x03 raw values and converted units | |
| DMM cross-check across R5 | |
| Reverse-current test result | |
| Deviations, scope captures, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The schematic is a minimal, faithful implementation of the INA219 datasheet application circuit: shunt with kelvin intent, single 100 nF decoupler, strap-selectable address, and cuttable bus pull-ups for chaining. The calibration math closes cleanly for the 0.1 Ω shunt (Current_LSB = 100 µA, CAL = 0x1000, 3.2 A PGA-limited full scale). The principal open risks are exactly the unbuilt parts: no PCB layout (kelvin routing and shunt copper are still promises), no fabricated first article, and no bench evidence. The address-range claim in the README (0x40–0x45) should be trimmed to the four reachable codes, and the shunt-power ceiling (≈1 W dissipated at full scale) must be revisited during layout thermal review before any high-current use.