Circuit review & bench-test guide
AXS-037 — Force sensitive resistor PMOD module
Document purpose#
This document explains the axs-037-fsr force-sensitive-resistor PMOD module at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the generated schematic (generate_design.py, rev 0.1-schematic), the module README, and the manufacturer documents cited in section 6.
The board is a design-stage prototype: the schematic is generated and ERC is clean (0/0), but PCB layout has not started and no first article has been fabricated or assembled. Every voltage, resistance, and timing value below is a design target derived from calculation and typical manufacturer curves — a target to verify, not proof that a built board behaves this way. FSR curves in particular are typical data for one actuator setup; treat every numeric expectation in this guide as provisional until measured.
1. What the board does#
The board is a single-channel analog force-acquisition PMOD module. An Interlink FSR-402-class force sensing resistor (external, attached at J2) forms the upper leg of a resistive divider against a fixed 10 kΩ lower leg (R1). The divider node passes through a 1 kΩ / 10 nF anti-alias RC (R2/C1) into an ADS7042 12-bit 1 MSPS SAR ADC (U1), which is read over a chip-select framed, read-only SPI interface on a PMOD Type 2 connector (J1). AVDD = 3.3 V is also the ADC reference, so readings are ratiometric to the PMOD rail.
The output is deliberately nonlinear in force: the FSR resistance follows roughly an inverse power law with force, and the module's teaching goal is calibration (log-log fit or lookup table) in gateware/software, not a linear force scale.
Functional block diagram#
3V3 (PMOD pin 6/12)
│
├──────────────┐
│ │
FSR (external, ├── C2 100 nF + C3 1 µF (AVDD/DVDD decoupling)
via J2 pins 1/2) │
│ v
FSR_NODE ──> U1 ADS7042 (AVDD = reference = 3V3)
│ \ │ SDO ── R3 100 Ω ── MISO (J1 pin 3)
R1 10k R2 1k │ SCLK <───────────── SCK (J1 pin 4)
│ │ │ CS_N <── R4 10k pull-up to 3V3 ── ~CS (J1 pin 1)
GND ADC_IN │ AINM ── GND
│ GND
C1 10nF
│
GND
2. Safety and scope boundaries#
- This is a 3.3 V logic-level module. It has no protection against supplies above 3.6 V: the ADS7042 absolute maximum AVDD/DVDD is 3.9 V and the recommended maximum is 3.6 V. Never plug it into a 5 V PMOD host or a bench supply set above 3.6 V.
- Do not drive AINP-side nets (FSR_NODE, ADC_IN) from an external source above AVDD + 0.3 V or below −0.3 V (ADS7042 absolute maxima).
- Interlink limits FSR current to 1 mA per cm² of applied force and pressure to below ~10 N/mm²; do not probe the FSR with a low-range ohmmeter that forces high current, and do not crush the sensor.
- The FSR is not waterproof and must not be soldered directly on its silver traces; use a clamped pin header, ZIF, or Amphenol/AMP-style clip at J2.
- FSRs are force indicators, not calibrated load cells. Interlink states system force accuracy ranges from approximately ±6% to ±50% depending on actuation consistency. Nothing in this guide produces a traceable force measurement.
- Working acquisition on the bench is not EMC, safety, or environmental qualification, and the module is marked NOT RELEASED.
3. Power and signal path#
- The host (PMOD socket or bench supply) provides 3.3 V on J1 pins 6/12 and ground on pins 5/11. C3 (1 µF) and C2 (100 nF) decouple U1's shared AVDD/DVDD rail; AVDD is also the ADC reference.
- With no FSR attached or no force applied, the FSR is effectively open (Interlink stand-off resistance spec: >10 MΩ unloaded, unbent), so R1 holds FSR_NODE essentially at 0 V.
- Applied force lowers R_FSR; the divider output rises according to
V_node = 3.3 V × 10 kΩ / (10 kΩ + R_FSR). - R2 (1 kΩ) and C1 (10 nF) form a ~15.9 kHz low-pass anti-alias filter and give the SAR input a local charge reservoir; at DC the ADC input tracks FSR_NODE (input leakage only).
- R4 (10 kΩ) holds CS_N high so U1 stays deselected (SDO released) until the host drives ~CS low. Each ~CS-framed 16-SCLK burst returns one 12-bit sample (leading zeros then data); SDO reaches the host MISO through R3.
- Code ≈ 4095 × V_node / 3.3 V. Because AVDD is the reference, rail error cancels to first order for a ratiometric divider driven from the same rail — one reason the FSR is tied to 3V3 rather than a separate source.
4. Interfaces and usage contexts#
| PMOD pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | ~CS | NC (no MOSI) | MISO | SCK | GND | 3V3 | NC | NC | NC | NC | GND | 3V3 |
| Reference | Pins/signals | Intended use |
|---|---|---|
| J1 | PMOD Type 2 (SPI), read-only | Host power and SPI; ADS7042 has no data input, MOSI (pin 2) is NC |
| J2 | 1 = 3V3, 2 = FSR_NODE | FSR attachment; FSR polarity does not matter |
The bench plan covers two usage contexts; every powered test states which applies:
- Context A — PMOD host: plugged into a 3.3 V PMOD socket on an ECP5-class FPGA board (e.g., ULX3S). The FPGA drives ~CS/SCK and reads MISO; supply current limiting is whatever the host provides.
- Context B — standalone bench: powered from a current-limited bench supply (3.30 V, ≤50 mA limit) on pins 6/12 and 5/11, with the divider observed by DMM/scope and SPI driven by a lab MCU or USB SPI adapter (3.3 V logic only). Context B is the safer place for first power-up.
5. Component-by-component review#
Every reference designator in generate_design.py appears below. #FLG01 and #FLG02 are ERC power-flag directives on 3V3 and GND, not physical parts.
5.1 Sensing and acquisition path#
| Ref. | Part / datasheet summary | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| J2 | Generic 1×2 pin header, 2.54 mm (FSR MPN TBD: Interlink FSR-402 target) | Attaches the external FSR between 3V3 (pin 1) and FSR_NODE (pin 2); FSR is unpolarized | No sensor: node sits at ~0 V through R1 forever | Pin 1–2 short reads as maximum force (node ≈ 3.3 V); poor clip contact adds series resistance and reads low/erratic |
| U1 | TI ADS7042IDCUR, 12-bit 1 MSPS SAR ADC, VSSOP-8; AVDD 1.65–3.6 V is also the reference; unipolar 0 to AVDD; ±1 LSB max INL/DNL; 690 µW at 1 MSPS/3 V | Digitizes the divider voltage over ~CS-framed SPI | No digital output at all | Wrong orientation can destroy the part; AVDD/AINP over 3.9 V/AVDD+0.3 V is an absolute-maximum violation; swapped AINP/AINM reads ~0 |
| R1 | 10 kΩ 1% (Yageo RC0603FR-0710KL) | Divider lower leg; sets the force-to-voltage curve and its sensitive range (Interlink's "measuring resistor" R_M) | Node floats high through the FSR; readings pin near full scale when touched, undefined otherwise | Short reads permanently 0 V; wrong value silently reshapes the whole calibration curve |
| R2 | 1 kΩ (Yageo RC0603FR-071KL) | Anti-alias series element and SAR input isolation from the divider | ADC input floats; codes drift/undefined | Short removes filtering/isolation (still functional at DC but noisier); large wrong value adds settling error at high sample rates |
| C1 | 10 nF 50 V C0G (Murata GRM1885C1H103JA01D) | Anti-alias pole (~15.9 kHz with R2) and charge reservoir for the SAR sampling capacitor | Sampling glitches and aliased noise appear in codes | Short grounds ADC_IN (reads 0); X7R substitution adds voltage-coefficient distortion, which is why C0G is specified |
5.2 Digital interface and decoupling#
| Ref. | Value / part | Purpose | What is lost if omitted | Important failure/review point |
|---|---|---|---|---|
| R3 | 100 Ω (Yageo RC0603FR-07100RL) | Series protection/damping on the ADC-driven SDO → MISO line | Direct pin-to-pin connection: more ringing, no current limit during host contention | Open means MISO always reads idle; grossly wrong (kΩ-class) value plus bus capacitance slows edges at high SCLK |
| R4 | 10 kΩ (Yageo RC0603FR-0710KL) | ~CS idle pull-up so U1 stays deselected while the host is unconfigured/tri-stated | ~CS can float: spurious conversions and possible SDO bus contention | Short to 3V3 fights the host driver; pull-down instead of pull-up would select the ADC permanently |
| C2 | 100 nF 16 V X7R (Murata GRM188R71C104KA01D) | High-frequency AVDD/DVDD decoupling next to U1 | Conversion noise and reference bounce (AVDD is the reference, so this directly corrupts codes) | Short kills the rail; long layout distance from U1 defeats it — check at layout review |
| C3 | 1 µF 10 V X7R (Murata GRM188R71A105KA61D) | Bulk decoupling for the same rail | Larger droop during conversion current spikes | Short kills the rail; polarity is not a concern (MLCC) |
| J1 | 12-pin PMOD plug | Power and SPI to the host | No module function | Reversed insertion in a keyed socket is prevented mechanically; on jumper wires a 3V3/GND swap can destroy U1 |
| #FLG01, #FLG02 | ERC power flags (3V3, GND) | Schematic-only ERC directives | Not physical; nothing to assemble | Confirm they did not accidentally enter the BOM |
6. Datasheet summary and design interpretation#
| Device | Key manufacturer facts used here | Board-specific interpretation |
|---|---|---|
| Interlink FSR 400 series (402) | Stand-off resistance >10 MΩ unloaded/unbent; FAQ range ">1 MΩ at no load to approximately 1 kΩ at full load"; break force ~0.2 N min, defined as reaching below 100 kΩ; force range ~0.2–20 N; inverse power law then saturation; part-to-part force repeatability ±6% (single lot, repeatable actuator), single part ±2%, hysteresis +10%, long-term drift <5% per log10(time) (35 days, 1 kg); constant-load change −5% (2.5 kg, 24 h); max current 1 mA/cm²; system accuracy "±6% to ±50%" | The 10 kΩ R1 centers sensitivity on the ~10 kΩ FSR region (light-to-moderate press). Figure-3 curve points used in section 7 were measured on a model 402 with a 4 mm-tip silicone actuator and are explicitly "for reference only" — a finger is a different actuator, and worse than ±25% deviation from the table is entirely plausible |
| Interlink divider guidance | V_OUT = R_M · V+ / (R_M + R_FSR); "R_M is chosen to maximize the desired force sensitivity range and to limit current"; published example family uses R_M = 3 k–100 k at 5 V | Larger R_M shifts sensitivity toward light forces (earlier saturation); smaller R_M extends resolution toward firm presses. 10 kΩ is a mid-range choice; worst-case FSR current here is 3.3 V/11 kΩ ≈ 0.3 mA, inside the 1 mA/cm² limit for the 402's 1.27 cm² active area |
| TI ADS7042 | 12-bit, 1 MSPS, AVDD 1.65–3.6 V is the reference, DVDD 1.65–3.6 V, unipolar 0–AVDD input, ±1 LSB max INL/DNL, ~690 µW at 1 MSPS/3 V, SPI to 16 MHz, ~CS-framed 16-SCLK frame, abs max supplies 3.9 V; VSSOP-8 (DCU): 1 DVDD, 2 SCLK, 3 SDO, 4 ~CS, 5 AINM, 6 AINP, 7 AVDD, 8 GND | 3.3 V operation is comfortably in range and ratiometric with the divider. Verify the DCU pin mapping against the schematic symbol at layout review — AINM must be grounded and AINP must receive ADC_IN |
Official references actually consulted: Interlink FSR 400 Series Integration Guide (Rev. C, 94-00004), Pololu mirror (also hosted by Digi-Key); Interlink FSR 402 product page; TI ADS7042 datasheet (SBAS608C). Check the latest revision before procurement; the FSR MPN is still TBD (FSR-402 vs Ohmite FSR01CE per the README), and the two are not curve-identical.
7. Expected values before bench testing#
Divider formula for this board (FSR is the upper leg, R1 = 10 kΩ lower leg):
V_node = 3.3 V × 10 kΩ / (10 kΩ + R_FSR) code ≈ 4095 × V_node / 3.3 V
R_FSR = 10 kΩ × (3.3 V − V_node) / V_node (inverse, for calibration)
Resistance points below come from the integration guide's Figure 3 (model 402, 4 mm silicone actuator) and its FAQ/spec tables. They are typical values for one specific setup; expect large deviations with a finger.
| Condition | R_FSR (typical, guide) | V_node target | 12-bit code |
|---|---|---|---|
| Unloaded, unbent | >10 MΩ (spec) | <3.3 mV | 0–4 |
| Barely at break force (~0.2 N) | ~100 kΩ (turn-on definition) | 0.30 V | ~372 |
| Light touch (tens of grams) | ~30 kΩ | 0.83 V | ~1024 |
| Moderate press (~100 g) | ~10 kΩ | 1.65 V | ~2048 |
| Firm press (~300 g) | ~6 kΩ | 2.06 V | ~2560 |
| Hard press (~1 kg) | ~2.9 kΩ (guide example at 1 kg) | 2.56 V | ~3178 |
| Very hard (~2 kg, near saturation) | ~1.5 kΩ | 2.87 V | ~3562 |
| Full-load extreme (FAQ) | ~1 kΩ | 3.00 V | ~3723 |
Other measurable design targets:
| Quantity | Design target | What to measure |
|---|---|---|
| Anti-alias corner | fc = 1/(2π·1 kΩ·10 nF) ≈ 15.9 kHz | Small-signal injection at FSR_NODE, scope at ADC_IN |
| Divider Thevenin impedance | 0–10 kΩ (R_FSR ∥ 10 kΩ) plus R2 | Settling of codes vs sample rate; slow the sample rate if codes smear |
| Module quiescent current | well under 1 mA (U1 ≈ 230 µA at 1 MSPS/3 V; less when idle) | Bench supply readout, context B |
| Max FSR current | ≈0.3 mA at R_FSR = 1 kΩ | Calculated check only; stays under 1 mA/cm² |
| Static-load drift | <5% R change per log10(time); −5% after 24 h at 2.5 kg (guide) | Long-hold logging in phase E |
8. Manual schematic and assembly review checklist#
- Confirm U1 orientation and the DCU (VSSOP-8) pin map: AVDD pin 7, GND pin 8, AINP pin 6 to ADC_IN, AINM pin 5 to GND, ~CS pin 4, SCLK pin 2, SDO pin 3, DVDD pin 1. A one-pin rotation is fatal.
- Measure R1 (10 kΩ 1%), R2 (1 kΩ), R3 (100 Ω), R4 (10 kΩ) in place before first power (power off, FSR disconnected).
- Confirm C1 is C0G, not an X7R substitute, and C2/C3 are populated close to U1 (layout review item once layout exists).
- Confirm J2 pin 1 goes to 3V3 and pin 2 to FSR_NODE; label the header.
- Confirm PMOD pin 1 is ~CS and pin 3 is MISO at the connector, not mirrored; a mirrored plug maps power to signals on some hosts.
- Inspect the FSR tail: no kinks/creases (bend radius ≥2.5 mm), no solder directly on silver traces, vent not blocked, sensor flat on a smooth surface with no trapped bubbles under any adhesive (all Interlink "do's and don'ts").
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record board serial, FSR unit identity (they differ part-to-part), actuator used, equipment IDs, ambient, operator.
A. Unpowered inspection and resistance tests#
- Complete the checklist in section 8 under magnification.
- Measure 3V3-to-GND resistance in both polarities; investigate any hard short before power.
- With the FSR unattached, measure it standalone on a DMM high-ohms range: expect overrange/>10 MΩ unloaded and a smooth drop into the 100 kΩ-to-kΩ region with increasing finger pressure. A sensor that reads low unloaded is pre-loaded (mounting/bend) or damaged.
- Verify FSR_NODE-to-GND reads ≈10 kΩ (R1) with the FSR off the board.
B. First power-up, standalone (context B)#
- Bench supply 3.30 V, current limit 50 mA, to J1 pins 6/12 (3V3) and 5/11 (GND). No SPI master, no FSR yet.
- Confirm supply current is in the sub-mA range and nothing warms.
- FSR_NODE and ADC_IN should read <10 mV (only leakage across R1).
- Attach the FSR at J2. Unloaded readings should stay <10 mV; if the node sits noticeably above that, the sensor is pre-loaded or mis-mounted.
C. Static divider and force progression (context B)#
- DMM on ADC_IN. Apply a slow finger-press progression: no touch, light touch, moderate, firm, hard. Expect the section 7 monotonic staircase: ~0 V → ~0.3 V (threshold) → 1–2 V (moderate) → 2.5–3.0 V (hard).
- For semi-quantitative points, use known masses on a flat puck covering the active area (do not bridge the perimeter adhesive; do not exceed ~10 N/mm²). Log V_node at each mass, compute R_FSR with the inverse formula, and compare to the section 7 table — deviations of tens of percent are normal and are the calibration lesson, not a fault.
- Hold a constant mass for 60 s and log V_node vs time: expect upward resistance-settling/drift behavior on the order of seconds mechanically plus slow drift (guide: <5%/log10(time)). Note it; do not "fix" it.
- Release and repeat the same mass 5 times: single-part repeatability should be in the few-percent range only if the actuation is mechanically repeatable; finger presses will not be.
D. SPI acquisition#
- Context B first (lab MCU / USB SPI adapter, 3.3 V logic): idle ~CS high (verify R4 holds it high when the adapter tri-states). Run ~CS-framed 16-SCLK reads at ≤1 MHz SCLK initially; expect frames of leading zeros then a 12-bit code matching the DMM voltage within a few LSB-equivalent millivolts. Sweep SCLK upward (ADS7042 supports up to 16 MHz) and confirm codes do not shift.
- Scope ~CS, SCK, MISO on the first frames; check R3 keeps edges clean and that SDO releases when ~CS is high.
- Context A (ULX3S-class PMOD host): with the same FSR and actuator, run the FPGA sampler and compare codes against the context-B baseline at the same three force levels. Differences beyond noise implicate rail level (measure the host's actual 3V3), grounding, or gateware framing.
- In context A, verify the host pin constraints: pin 1 = ~CS, 3 = MISO, 4 = SCK, and that no host pull-down overrides R4 at configuration time.
E. Repeatability, drift, and calibration data set#
- Collect a calibration table (mass vs mean code, N ≥ 5 presses per mass, consistent actuator) in the intended final mounting.
- Log a 30–60 minute static-load run for drift characterization.
- Fit log(force) vs log(R_FSR) or build the LUT; record fit residuals as the honest accuracy statement for this specific sensor unit.
F. Release-only tests#
Layout-dependent verification (decoupling placement, trace routing near the divider), temperature/humidity behavior (Interlink: humidity is the largest environmental effect; −15% R at 85 °C hot operation), long-term actuation endurance, and the design-review checklist in the README all remain open until a fabricated first article exists.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| Node always ~0 V even when pressed | FSR standalone on DMM; J2 continuity | FSR open/damaged tail, J2 pin 1 not on 3V3, R1 short |
| Node always ~3.3 V | J2 pins 1–2 resistance | J2 short, pre-loaded/crushed FSR, R1 open |
| Codes stuck at 0 or 4095 while DMM node voltage is sane | AINP/AINM at U1 pins, U1 orientation | U1 rotated/mis-soldered, AINM not grounded, R2 open |
| DMM and ADC disagree | ADC_IN vs FSR_NODE, actual 3V3 rail | R2/C1 fault, reference (rail) sag, host rail ≠ bench rail |
| No MISO activity | ~CS at U1 pin 4, SCK presence, R3 | R4/host contention, framing (not 16 clocks), R3 open |
| Noisy/jumpy codes | C2/C3 presence, supply ripple, sample-rate | Missing decoupling, C1 wrong/absent, cable pickup on the FSR tail |
| Reading creeps under steady mass | log V vs time | Normal FSR drift/settling — characterize, don't debug |
| Non-repeatable force readings | actuator geometry and placement | Actuation mechanics, not electronics (Interlink §7.0) |
11. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
| FSR unit (model, MPN, serial/markings) | |
| Actuator description (finger/puck/mass set) | |
| DMM/scope/adapter/host and calibration | |
| Ambient temperature / humidity | |
| Unpowered resistance results | |
| First-power current and unloaded node voltage | |
| Force-progression table (mass, V_node, code, R_FSR) | |
| Repeatability (N presses per mass) | |
| Drift log reference (file path) | |
| Context A vs context B comparison | |
| Deviations, photos, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The architecture is minimal and coherent: a ratiometric FSR divider, properly isolated and filtered into a reference-shared SAR ADC, with the only digital risks being ~CS idling (covered by R4) and SDO integrity (covered by R3). The 10 kΩ R1 is a defensible mid-range measuring-resistor choice per Interlink's guidance, centering sensitivity on light-to-moderate presses; anyone wanting firm-press resolution should consider a smaller R1 and re-derive section 7. The principal open risks are that no board has been fabricated (layout, decoupling placement, and the sense-trace environment are all unverified), the FSR MPN is unpinned, and every expected value in section 7 rests on typical single-actuator curves that Interlink itself labels reference-only — part-to-part and actuation-dependent errors of ±25% or worse must be assumed until this specific sensor is calibrated in its final mounting.