AD7190 Driver for Rust Embedded
This is a driver for the Analog Devices AD7190 4-channel, 24-bit sigma-delta ADC,
written in Rust for embedded systems. It supports asynchronous operations using the
embedded-hal-async traits.
Example Usage
I primarily built this to work with the AD7190 strain bridge module available on AliExpress.
use ad7190::{
Ad7190, Channels, Config as AdcConfig, ConfigFlags, ContinuousCfg, FilterSel, Gain, GpioPin,
Mode, Reg,
};
const ADC_VREF_V: f32 = 5.0;
const ADC_GAIN: Gain = Gain::G128;
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default());
let mut spi_config = Config::default();
spi_config.mode = embassy_stm32::spi::MODE_3;
spi_config.frequency = Hertz(1_000_000);
let spi = Spi::new(
p.SPI1,
p.PA5, p.PA7, p.PA6, p.DMA2_CH3, p.DMA2_CH2, spi_config,
);
let spi_bus = Mutex::<CriticalSectionRawMutex, _>::new(spi);
let cs = Output::new(p.PA4, Level::High, Speed::VeryHigh);
let spi_dev = SpiDevice::new(&spi_bus, cs);
let mut adc: Adc = Ad7190::new(spi_dev, None);
let mut delay = Delay;
adc.reset(&mut delay).await.unwrap();
adc.gpio_set_high(GpioPin::P3).await.unwrap();
let mut cfg = AdcConfig {
flags: ConfigFlags::BUF,
channels: Channels::CH1,
gain: ADC_GAIN,
};
cfg = cfg.with_unipolar(false);
adc.set_config(cfg).await.unwrap();
let mode = Mode::default()
.with_dat_sta(true)
.with_filter(FilterSel::Sinc4)
.with_sample_rate_hz(50.0);
let cont_cfg = ContinuousCfg {
dat_sta: true,
use_pin_if_available: false,
use_cread: false,
poll_max_tries: 50_000,
poll_delay_us: 10,
};
let cont = adc.start_continuous(mode, cont_cfg).await.unwrap();
loop {
let sample = adc.next_sample(&mut delay, &cont).await.unwrap();
let v = Adc::code_to_volts_bipolar(sample.code, ADC_VREF_V, ADC_GAIN);
info!("Sample: code={} voltage={:.6} V", sample.code, v);
}
}
``