Skip to content
Platform-agnostic Rust driver for the AD9833/AD9837 programmable waveform generator / direct digital synthesizer (DDS)
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples
src
tests
.gitignore
.travis.yml
CHANGELOG.md
Cargo.toml
LICENSE-APACHE
LICENSE-MIT
README.md

README.md

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

crates.io Docs Build Status Coverage Status Maintenance Intention

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.

extern crate ad983x;
extern crate linux_embedded_hal;

use ad983x::{Ad983x, FrequencyRegister};
use linux_embedded_hal::{Pin, Spidev};

fn main() {
    let spi = Spidev::open("/dev/spidev0.0").unwrap();
    let chip_select = Pin::new(25);
    let mut dds = Ad983x::new_ad9833(spi, chip_select);
    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 SPI device and CS pin back
    let (_spi, _chip_select) = 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.

You can’t perform that action at this time.