#adc #embedded-hal-driver #isolated #spi-driver #offset #calibration #sigma-delta

no-std ade791x

Driver for the ADE7912/ADE7913 3-Channel, Isolated, Sigma-Delta ADC with SPI

4 releases

0.3.4 Jan 17, 2023
0.3.3 Dec 16, 2022
0.3.2 Dec 8, 2022
0.3.1 Dec 7, 2022

#1594 in Embedded development

MIT/Apache

48KB
693 lines

Rust ADE791x 3-Channel, Isolated, Sigma-Delta ADC with SPI Driver

crates.io docs.rs github

This is a platform-agnostic Rust driver for the ADE7912/ADE7913 3-Channel, Isolated, Sigma-Delta ADC with SPI, using the embedded-hal traits.

This driver allows you to:

  • Initialize and configure the device.
  • Perform a hardware/software reset.
  • Powerdown/wakeup the device.
  • Get raw and converted measurements from the ADC.
  • Manage multiple ADCs configured in a polyphase metering system (see the poly module).

Documentation

The devices

The ADE7912/ADE7913 are isolated, 3-channel Σ-Δ ADCs for polyphase energy metering applications using shunt current sensors. Data and power isolation are based on the Analog Devices, Inc., iCoupler® Technology. The ADE7912 features two ADCs, and the ADE7913 features three ADCs. The current ADC provides a 67 dB Signal-to-Noise Ratio (SNR) over a 3 kHz signal bandwidth, whereas the voltage ADCs provide an SNR of 72 dB over the same bandwidth. One channel is dedicated to measuring the voltage across a shunt when the shunt is used for current sensing. Up to two additional channels are dedicated to measuring voltages, which are usually sensed using resistor dividers. One voltage channel can measure the temperature of the die via an internal sensor. The ADE7913 includes three channels: one current and two voltage channels. The ADE7912 has one voltage channel but is otherwise identical to the ADE7913.

Datasheets:

Usage

First of all, in order to get correct readings, the ADC needs to be calibrated according to the following procedure:

  1. Set the calibration offsets and multipliers to their default values.
  2. Remove any load from the ADC.
  3. Calculate the offsets as the average of the ADC readings with no load applied.
  4. Set the calculated calibration offsets, leaving the multipliers to their default value.
  5. Apply a known load to the ADC.
  6. Calculate the multipliers by dividing the known load by the average of the ADC readings with the known load applied.

The followings are two minimal examples to get readings from the ADC, both in a single-phase ADC configuration and a poly-phase multi ADCs configuration.

Single

use ade791x::*;

// Initialization
let config = Config::default();
let calibration = Calibration::default();
let mut adc = Ade791x::new_ade7912(spi, cs);
adc.init(delay, config, calibration).unwrap();

// Measurement
// Run the following in the DREADY ISR to get measurements as soon as they are ready
let measurement = adc.get_measurement().unwrap();

Poly

use ade791x::*;

// Initialization
let config = [
    Config { clkout_en: true, ..Default::default() },
    Config { clkout_en: true, ..Default::default() },
    Config::default()
];
let calibration = [Calibration::default(); 3];
let emi_ctrl = [
    ade791x::EmiCtrl::from(0x55),
    ade791x::EmiCtrl::from(0xAA),
    ade791x::EmiCtrl::from(0x55)
];
let mut adc = poly::Ade791x::new(spi, [
    (cs0, Chip::ADE7912), (cs1, Chip::ADE7913), (cs2, Chip::ADE7912)
]);
adc.init(delay, config, calibration, emi_ctrl).unwrap();

// Synchronization
// Execute the following every couple of seconds to ensure that the ADCs are always in sync
adc.ajust_sync().unwrap();

// Measurement
// Run the following in the DREADY ISR to get measurements as soon as they are ready
let measurement = adc.get_measurement().unwrap();

Status

  • Initialization/configuration
  • Hardware/software reset
  • Powerdown/wakeup
  • Measurement reading
  • Polyphase management
  • Measurement conversion
  • Temperature readings
  • Configuration checks
  • Unit tests
  • Measurement CRC checks

License

Licensed under either of

at your option.

Contributing

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~71KB