Crates.io | ade791x |
lib.rs | ade791x |
version | 0.3.4 |
source | src |
created_at | 2022-12-07 16:18:55.285556 |
updated_at | 2023-01-17 08:15:46.392116 |
description | Driver for the ADE7912/ADE7913 3-Channel, Isolated, Sigma-Delta ADC with SPI |
homepage | |
repository | https://github.com/GrepitAB/ade791x-rs |
max_upload_size | |
id | 731953 |
size | 89,967 |
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:
poly
module).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.
First of all, in order to get correct readings, the ADC needs to be calibrated according to the following procedure:
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.
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();
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();
Licensed under either of
at your option.
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.