Skip to content

ADS1015

TI ADS1015 4-channel 12-bit I²C ADC with PGA and input multiplexer — the 12-bit sibling of the ADS1115.

Live catalog

Prefer labwired_describe with the catalog id over guessing pins or addresses.

Status at a glance

Aspect Status
Catalog id ads1015
Bus I²C
Address 0x48 (ADDR→GND); 0x49 VDD, 0x4A SDA, 0x4B SCL
Source configs/devices/ads1015.yaml (declarative, no Rust model)
Datasheet TI ADS1013/ADS1014/ADS1015 SBAS473F, §7.3.3 Table 7-1, §7.5.4, §8 Register Map (Figures 8-2..8-6, Table 8-4)
Tier smoke-proven (register-level tests: crates/core/tests/everyday_sensor_set.rs)

Pins / attachment

Pin / net Role
SDA / SCL I²C
AIN0..AIN3 Analog inputs (stimulus a0..a3)
ALERT/RDY Not modelled
VDD/GND Power (digital twin)

Support matrix

Behavior Status Notes
CONFIG POR 0x8583, Lo_thresh 0x8000, Hi_thresh 0x7FFF ✅ Threshold reserved nibbles stay 0h / Fh through writes
CONVERSION: 12-bit two's complement in bits 15:4 ✅ Low nibble always 0; clips at 0x7FF0 / 0x8000
MUX: 4 single-ended + 4 differential inputs ✅ POR is AIN0 − AIN1
PGA ±6.144 … ±0.256 V (counts = V × 2048 / FSR) ✅
OS bit / conversion time / DR ⚠️ OS always reads 1 (result always ready); DR and MODE stored only
Comparator, ALERT/RDY, general-call reset ❌

Stimulus

Host inputs: a0, a1, a2, a3 (V).

How to run

  1. Place the part and an MCU in Playground, or add it to a system YAML:
    external_devices:
      - id: "adc"
        type: "ads1015"
        connection: "i2c0"   # the bus id your chip system uses
    
  2. Agent: labwired_list → labwired_describe id=ads1015 → wire → labwired_validate → labwired_run / labwired_verify.
  3. Register-level smoke: cargo test -p labwired-core --test everyday_sensor_set — CONFIG / threshold power-on words and reserved-bit behaviour. The same file's negative control proves the check fails against a part that answers only 0x00 or only 0xFF; ads1015_tracks_stimulus checks the MUX, every PGA range, 12-bit quantisation and clipping.

Limitations

  • A result is always available: the twin has no conversion time, so CONVERSION is never the 0000h the datasheet gives before the first conversion.

See the YAML header for the full datasheet trace and every named approximation.