#embedded-hal-driver #waveform #dds #generator #spi-driver

no-std ad983x

Platform-agnostic Rust driver for the AD9833, AD9834, AD9837 and AD9838 low-power programmable waveform generators / direct digital synthesizers

5 releases (1 stable)

1.0.0 May 4, 2024
0.3.0 Sep 24, 2021
0.2.0 Nov 10, 2019
0.1.1 May 30, 2019
0.1.0 May 29, 2019

#778 in Embedded development

MIT/Apache

32KB
339 lines

Rust AD983x Low-Power Programmable Waveform Generator / Direct Digital Synthesizer (DDS) Driver

crates.io Docs Minimum Supported Rust Version Build Status Coverage Status

This is a platform agnostic Rust driver for the AD9833, AD9834, AD9837 and AD9838 low-power programmable waveform generators / direct digital synthesizers (DDS) using the embedded-hal traits.

This driver allows you to:

  • Enable/disable/reset the device. See enable().
  • Set the frequency registers. See: set_frequency().
  • Select the output frequency register. See: select_frequency().
  • Set the phase registers. See: set_phase().
  • Select the output phase register. See: select_phase().
  • Set the frequency registers MSBs/LSBs separately. See: set_frequency_msb().
  • Set the output waveform. See: set_output_waveform().
  • Power down/up device parts. See: set_powered_down().
  • Select control source on AD9834/AD9838. See: set_control_source().

Introductory blog post

The devices

The AD9833, AD9834, AD9837 and AD9838 are low power, programmable waveform generators capable of producing sine, triangular, and square wave outputs. Waveform generation is required in various types of sensing, actuation, and time domain reflectometry (TDR) applications. The output frequency and phase are software programmable, allowing easy tuning. No external components are needed. The frequency registers are 28 bits wide: with a 25 MHz clock rate, resolution of 0.1 Hz can be achieved; with a 1 MHz clock rate, the AD9833 can be tuned to 0.004 Hz resolution.

The devices are written to via a 3-wire serial interface (SPI). This serial interface operates at clock rates up to 40 MHz and is compatible with DSP and microcontroller standards. The devices operate with a power supply from 2.3 V to 5.5 V.

Datasheets:

Application Note:

Article explaining DDS using an AD9833:

Usage

To use this driver, import this crate and an embedded_hal implementation, then instantiate the appropriate device.

I wrote an example MIDI player that plays Beethoven's ninth symphony in hardware :). See: driver-examples.

use ad983x::{Ad983x, FrequencyRegister};
use embedded_hal_bus::spi::ExclusiveDevice;
use linux_embedded_hal::{Delay, SpidevBus, SysfsPin};

fn main() {
    let spi = SpidevBus::open("/dev/spidev0.0").unwrap();
    let chip_select = SysfsPin::new(25);
    let dev = ExclusiveDevice::new(spi, chip_select, Delay);
    let mut dds = Ad983x::new_ad9833(dev);
    dds.reset().unwrap(); // reset is necessary before operation
    dds.set_frequency(FrequencyRegister::F0, 4724).unwrap();
    dds.enable().unwrap();
    // Given a 25 MHz clock, this now outputs a sine wave
    // with a frequency of 440 Hz, which is a standard
    // A4 tone.

    // Get device back
    let _dev = dds.destroy();
}

Status

  • Compatible with AD9833/AD9837
  • Compatible with AD9834/AD9838
  • Compatible with AD9832/AD9835

Support

For questions, issues, feature requests like compatibility with similar devices and other changes, please file an issue in the github project.

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

~56KB