← AXS-037

Circuit review & bench-test guide

AXS-037 — Force sensitive resistor PMOD module

Design-stage — board not yet fabricated

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#

3. Power and signal path#

  1. 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.
  2. 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.
  3. Applied force lowers R_FSR; the divider output rises according to V_node = 3.3 V × 10 kΩ / (10 kΩ + R_FSR).
  4. 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).
  5. 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.
  6. 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 pin123456789101112
Net~CSNC (no MOSI)MISOSCKGND3V3NCNCNCNCGND3V3
ReferencePins/signalsIntended use
J1PMOD Type 2 (SPI), read-onlyHost power and SPI; ADS7042 has no data input, MOSI (pin 2) is NC
J21 = 3V3, 2 = FSR_NODEFSR attachment; FSR polarity does not matter

The bench plan covers two usage contexts; every powered test states which applies:

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 summaryFunction and why neededIf absent/openIf shorted, wrong, or misassembled
J2Generic 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 unpolarizedNo sensor: node sits at ~0 V through R1 foreverPin 1–2 short reads as maximum force (node ≈ 3.3 V); poor clip contact adds series resistance and reads low/erratic
U1TI 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 VDigitizes the divider voltage over ~CS-framed SPINo digital output at allWrong 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
R110 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 otherwiseShort reads permanently 0 V; wrong value silently reshapes the whole calibration curve
R21 kΩ (Yageo RC0603FR-071KL)Anti-alias series element and SAR input isolation from the dividerADC input floats; codes drift/undefinedShort removes filtering/isolation (still functional at DC but noisier); large wrong value adds settling error at high sample rates
C110 nF 50 V C0G (Murata GRM1885C1H103JA01D)Anti-alias pole (~15.9 kHz with R2) and charge reservoir for the SAR sampling capacitorSampling glitches and aliased noise appear in codesShort 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 / partPurposeWhat is lost if omittedImportant failure/review point
R3100 Ω (Yageo RC0603FR-07100RL)Series protection/damping on the ADC-driven SDO → MISO lineDirect pin-to-pin connection: more ringing, no current limit during host contentionOpen means MISO always reads idle; grossly wrong (kΩ-class) value plus bus capacitance slows edges at high SCLK
R410 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 contentionShort to 3V3 fights the host driver; pull-down instead of pull-up would select the ADC permanently
C2100 nF 16 V X7R (Murata GRM188R71C104KA01D)High-frequency AVDD/DVDD decoupling next to U1Conversion 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
C31 µF 10 V X7R (Murata GRM188R71A105KA61D)Bulk decoupling for the same railLarger droop during conversion current spikesShort kills the rail; polarity is not a concern (MLCC)
J112-pin PMOD plugPower and SPI to the hostNo module functionReversed insertion in a keyed socket is prevented mechanically; on jumper wires a 3V3/GND swap can destroy U1
#FLG01, #FLG02ERC power flags (3V3, GND)Schematic-only ERC directivesNot physical; nothing to assembleConfirm they did not accidentally enter the BOM

6. Datasheet summary and design interpretation#

DeviceKey manufacturer facts used hereBoard-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 guidanceV_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 VLarger 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 ADS704212-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 GND3.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.

ConditionR_FSR (typical, guide)V_node target12-bit code
Unloaded, unbent>10 MΩ (spec)<3.3 mV0–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:

QuantityDesign targetWhat to measure
Anti-alias cornerfc = 1/(2π·1 kΩ·10 nF) ≈ 15.9 kHzSmall-signal injection at FSR_NODE, scope at ADC_IN
Divider Thevenin impedance0–10 kΩ (R_FSR ∥ 10 kΩ) plus R2Settling of codes vs sample rate; slow the sample rate if codes smear
Module quiescent currentwell 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#

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#

  1. Complete the checklist in section 8 under magnification.
  2. Measure 3V3-to-GND resistance in both polarities; investigate any hard short before power.
  3. 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.
  4. Verify FSR_NODE-to-GND reads ≈10 kΩ (R1) with the FSR off the board.

B. First power-up, standalone (context B)#

  1. 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.
  2. Confirm supply current is in the sub-mA range and nothing warms.
  3. FSR_NODE and ADC_IN should read <10 mV (only leakage across R1).
  4. 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)#

  1. 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).
  2. 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.
  3. 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.
  4. 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#

  1. 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.
  2. Scope ~CS, SCK, MISO on the first frames; check R3 keeps edges clean and that SDO releases when ~CS is high.
  3. 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.
  4. 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#

  1. Collect a calibration table (mass vs mean code, N ≥ 5 presses per mass, consistent actuator) in the intended final mounting.
  2. Log a 30–60 minute static-load run for drift characterization.
  3. 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#

SymptomFirst measurementsLikely areas
Node always ~0 V even when pressedFSR standalone on DMM; J2 continuityFSR open/damaged tail, J2 pin 1 not on 3V3, R1 short
Node always ~3.3 VJ2 pins 1–2 resistanceJ2 short, pre-loaded/crushed FSR, R1 open
Codes stuck at 0 or 4095 while DMM node voltage is saneAINP/AINM at U1 pins, U1 orientationU1 rotated/mis-soldered, AINM not grounded, R2 open
DMM and ADC disagreeADC_IN vs FSR_NODE, actual 3V3 railR2/C1 fault, reference (rail) sag, host rail ≠ bench rail
No MISO activity~CS at U1 pin 4, SCK presence, R3R4/host contention, framing (not 16 clocks), R3 open
Noisy/jumpy codesC2/C3 presence, supply ripple, sample-rateMissing decoupling, C1 wrong/absent, cable pickup on the FSR tail
Reading creeps under steady masslog V vs timeNormal FSR drift/settling — characterize, don't debug
Non-repeatable force readingsactuator geometry and placementActuation mechanics, not electronics (Interlink §7.0)

11. Bench record template#

FieldRecord
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.