Crate mcp3425

source ·
Expand description

A platform agnostic Rust driver for the MCP3425 (and newer variants MCP3426/MCP3427/MCP3428 as well), based on the embedded-hal traits.

The Device

The Microchip MCP3425 is a low-current 16-bit analog-to-digital converter. The device has an I²C interface and an on-board ±2048mV reference. For more information, see the datasheet.

Variants MCP3426/7/8 are very similar, but support multiple input channels. They are supported as well, but require to enable one of the following Cargo features:

  • dual_channel for MCP3426/7
  • quad_channel for MCP3428

Cargo Features

The following feature flags exists:

  • dual_channel for dual-channel support (MCP3426/7/8)
  • quad_channel for dual-channel support (MCP3428)
  • measurements: Use the measurements crate to represent voltages instead of the custom Voltage wrapper

Usage

Instantiating

Import this crate and an embedded_hal implementation (e.g. linux-embedded-hal). Then instantiate the device in either ContinuousMode or OneShotMode:

use linux_embedded_hal::{Delay, I2cdev};
use mcp3425::{MCP3425, Config, Resolution, Gain, Error, OneShotMode};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let address = 0x68;
let mut adc = MCP3425::new(dev, address, Delay, OneShotMode);

(You can also use the shortcut functions oneshot or continuous to create instances of the MCP3425 type without having to specify the type as parameter.)

Configuration

You can choose the conversion resolution / sample rate and the PGA gain with a Config object.

Use the methods starting with with_ to create a (side-effect free) new instance of the configuration where the specified setting has been replaced.

use mcp3425::Channel;
let config = Config::default()
    .with_resolution(Resolution::Bits12Sps240)
    .with_gain(Gain::Gain1);
let high_res = config.with_resolution(Resolution::Bits16Sps15);
let high_gain = high_res.with_gain(Gain::Gain8);

Note: If you enable the dual_channel or quad_channel Cargo features, you can also use the method .with_channel(...) on the Config struct (if your model supports multiple input channels).

Measurements

One-Shot

You can trigger a one-shot measurement:

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut adc = MCP3425::oneshot(dev, address, Delay);
let config = Config::default();
match adc.measure(&config) {
    Ok(voltage) => println!("ADC measured {} mV", voltage.as_millivolts()),
    Err(Error::I2c(e)) => println!("An I2C error happened: {}", e),
    Err(Error::VoltageTooHigh) => println!("Voltage is too high to measure"),
    Err(Error::VoltageTooLow) => println!("Voltage is too low to measure"),
    Err(Error::NotReady) => println!("Measurement not yet ready. This is a driver bug."),
    Err(Error::NotInitialized) => unreachable!(),
}

As you can see, the saturation values are automatically converted to proper errors.

Continuous

You can also configure the ADC in continuous mode:

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut adc = MCP3425::continuous(dev, address, Delay);
let config = Config::default();
adc.set_config(&config).unwrap();
match adc.read_measurement() {
    Ok(voltage) => println!("ADC measured {} mV", voltage.as_millivolts()),
    Err(Error::I2c(e)) => println!("An I2C error happened: {}", e),
    Err(Error::VoltageTooHigh) => println!("Voltage is too high to measure"),
    Err(Error::VoltageTooLow) => println!("Voltage is too low to measure"),
    Err(Error::NotReady) => println!("Measurement not yet ready. Polling too fast?"),
    Err(Error::NotInitialized) => println!("You forgot to call .set_config"),
}

Structs

  • Device configuration: Resolution, gain and input channel.
  • Use the MCP3425 in Continuous Conversion mode.
  • Driver for the MCP3425 ADC
  • Use the MCP3425 in One-Shot mode.
  • A voltage measurement.

Enums

  • Selected ADC channel
  • All possible errors in this crate
  • Programmable gain amplifier (PGA)
  • Conversion bit resolution and sample rate

Traits