Analog Devices 16 channels, 1MSPS, 12bit ADC with SPI interface

Analog Devices' AD7490 A/D converter chip is a great choice to increase ADC channels to mbed. I wrote a C++ class library, which allows multiple chips on the same SPI serial bus line.

main.cpp - usage of sequential mode (use 2 ADCs)

#include "mbed.h"
#include "AD7490.h"

DigitalOut myled(LED1);
SPI spi(p11,p12,p13);

int main() {

    // set up SPI interface. 
    // should be set before call AD7490 constructer
    spi.format(16,0);
    spi.frequency(1000000);

    // construct AD7490 instances
    AD7490 ad1(spi, p9);
    AD7490 ad2(spi, p10);

    // start ad conversion with sequential mode
    ad1.sequential();
    ad2.sequential();

    while(1) {
        short ad_data[32];      // user buffer area

        myled = 1;
        ad1.read(&ad_data[ 0]);  // save the first ADC data to buffer
        ad2.read(&ad_data[16]);  // save the second ADC data to buffer
        myled = 0;

        for(int i=0; i<32; i++)
            printf("ch[%2d]: %d\n", i, ad_data[i]);
        puts("");
        
        wait(1);
    }
}

API

AD7490
AD7490(SPI _spi, PinName _cs)Constructor. needs SPI instance and the Chip select pin
unsigned short convert(int ch=0)Single channel (one shot) conversion.
void convert(short data[]);All channels conversion with multiple 'one shot conversion'
unsigned short sequential(int ch=15);Start sequential mode, from channel 0 to 'ch'. ch=15 is default
void read(short buffer[]);Read data channel [0] to [ch], and copy them to user buffer area
Committer:
ykuroda
Date:
Mon Sep 24 21:33:14 2012 +0000
Revision:
3:b7e72acaade2
Parent:
2:a547c48d2152
Child:
4:f059fdd25051
move read() to protected area.  comments add to AD7490.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuroda 0:95be7403a10c 1 //
ykuroda 2:a547c48d2152 2 // AD7490 ... Analog Devices 16 channels, 1MSPS, 12bit ADC
ykuroda 2:a547c48d2152 3 //
ykuroda 2:a547c48d2152 4 // 2012.08.29 ... Originaly written by Yoji KURODA
ykuroda 0:95be7403a10c 5 //
ykuroda 0:95be7403a10c 6 #ifndef _AD7490_H
ykuroda 0:95be7403a10c 7 #define _AD7490_H
ykuroda 0:95be7403a10c 8
ykuroda 0:95be7403a10c 9 class AD7490 {
ykuroda 0:95be7403a10c 10 protected:
ykuroda 1:ac3b7f978aa3 11 enum CREG {
ykuroda 1:ac3b7f978aa3 12 CREG_WRITE = 0x800,
ykuroda 1:ac3b7f978aa3 13 CREG_SEQ = 0x400,
ykuroda 1:ac3b7f978aa3 14 CREG_ADD3 = 0x200,
ykuroda 1:ac3b7f978aa3 15 CREG_ADD2 = 0x100,
ykuroda 1:ac3b7f978aa3 16 CREG_ADD1 = 0x080,
ykuroda 1:ac3b7f978aa3 17 CREG_ADD0 = 0x040,
ykuroda 1:ac3b7f978aa3 18 CREG_PM1 = 0x020,
ykuroda 1:ac3b7f978aa3 19 CREG_PM0 = 0x010,
ykuroda 1:ac3b7f978aa3 20 CREG_SHADOW = 0x008,
ykuroda 1:ac3b7f978aa3 21 CREG_WEAK = 0x004,
ykuroda 1:ac3b7f978aa3 22 CREG_RANGE = 0x002,
ykuroda 1:ac3b7f978aa3 23 CREG_CODING = 0x001
ykuroda 1:ac3b7f978aa3 24 };
ykuroda 1:ac3b7f978aa3 25
ykuroda 0:95be7403a10c 26 SPI spi;
ykuroda 0:95be7403a10c 27 DigitalOut cs;
ykuroda 3:b7e72acaade2 28
ykuroda 3:b7e72acaade2 29 unsigned short read(void); // dummy read for triggering at sequential mode
ykuroda 0:95be7403a10c 30
ykuroda 0:95be7403a10c 31 public:
ykuroda 0:95be7403a10c 32 AD7490(SPI _spi, PinName _cs);
ykuroda 0:95be7403a10c 33 ~AD7490();
ykuroda 3:b7e72acaade2 34 unsigned short convert(int ch=0); // one shot conversion at channel [ch]
ykuroda 3:b7e72acaade2 35 void convert(short data[]); // convert all (16) channels with one short conv.
ykuroda 0:95be7403a10c 36
ykuroda 3:b7e72acaade2 37 unsigned short sequential(int ch=15); // start sequential mode from channel [0] to [ch]
ykuroda 3:b7e72acaade2 38 void read(short data[]); // read [0] to [ch], and copy to user area
ykuroda 0:95be7403a10c 39 };
ykuroda 0:95be7403a10c 40
ykuroda 1:ac3b7f978aa3 41 #endif // _AD7490_H