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:
Wed Aug 29 11:01:51 2012 +0000
Revision:
0:95be7403a10c
Child:
1:ac3b7f978aa3
Analog Devices AD7490 16 channels, 1MSPS, 12Bit ADC with SPI interface

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuroda 0:95be7403a10c 1 //
ykuroda 0:95be7403a10c 2 // AD7490
ykuroda 0:95be7403a10c 3 //
ykuroda 0:95be7403a10c 4 #ifndef _AD7490_H
ykuroda 0:95be7403a10c 5 #define _AD7490_H
ykuroda 0:95be7403a10c 6
ykuroda 0:95be7403a10c 7 class AD7490 {
ykuroda 0:95be7403a10c 8 protected:
ykuroda 0:95be7403a10c 9 #define CREG_WRITE 0x800
ykuroda 0:95be7403a10c 10 #define CREG_SEQ 0x400
ykuroda 0:95be7403a10c 11 #define CREG_ADD3 0x200
ykuroda 0:95be7403a10c 12 #define CREG_ADD2 0x100
ykuroda 0:95be7403a10c 13 #define CREG_ADD1 0x080
ykuroda 0:95be7403a10c 14 #define CREG_ADD0 0x040
ykuroda 0:95be7403a10c 15 #define CREG_PM1 0x020
ykuroda 0:95be7403a10c 16 #define CREG_PM0 0x010
ykuroda 0:95be7403a10c 17 #define CREG_SHADOW 0x008
ykuroda 0:95be7403a10c 18 #define CREG_WEAK 0x004
ykuroda 0:95be7403a10c 19 #define CREG_RANGE 0x002
ykuroda 0:95be7403a10c 20 #define CREG_CODING 0x001
ykuroda 0:95be7403a10c 21
ykuroda 0:95be7403a10c 22 SPI spi;
ykuroda 0:95be7403a10c 23 DigitalOut cs;
ykuroda 0:95be7403a10c 24 short ret;
ykuroda 0:95be7403a10c 25
ykuroda 0:95be7403a10c 26 public:
ykuroda 0:95be7403a10c 27 AD7490(SPI _spi, PinName _cs);
ykuroda 0:95be7403a10c 28 ~AD7490();
ykuroda 0:95be7403a10c 29 unsigned short convert(int ch=0);
ykuroda 0:95be7403a10c 30 void convert(short data[]);
ykuroda 0:95be7403a10c 31
ykuroda 0:95be7403a10c 32 unsigned short sequential(int ch=15);
ykuroda 0:95be7403a10c 33 unsigned short read(void);
ykuroda 0:95be7403a10c 34 void read(short data[]);
ykuroda 0:95be7403a10c 35 };
ykuroda 0:95be7403a10c 36
ykuroda 0:95be7403a10c 37
ykuroda 0:95be7403a10c 38 #if 0
ykuroda 0:95be7403a10c 39 int main() {
ykuroda 0:95be7403a10c 40
ykuroda 0:95be7403a10c 41 wait(1);
ykuroda 0:95be7403a10c 42
ykuroda 0:95be7403a10c 43 // set up SPI interface
ykuroda 0:95be7403a10c 44 SPI spi(p11,p12,p13);
ykuroda 0:95be7403a10c 45 spi.format(16,0);
ykuroda 0:95be7403a10c 46 spi.frequency(1000000);
ykuroda 0:95be7403a10c 47
ykuroda 0:95be7403a10c 48 AD7490 ad1(spi, p9);
ykuroda 0:95be7403a10c 49 AD7490 ad2(spi, p10);
ykuroda 0:95be7403a10c 50
ykuroda 0:95be7403a10c 51 while(1) {
ykuroda 0:95be7403a10c 52
ykuroda 0:95be7403a10c 53 int ret=0;
ykuroda 0:95be7403a10c 54 for(int ch=0; ch<16; ch++){
ykuroda 0:95be7403a10c 55 ret = ad1.convert(ch);
ykuroda 0:95be7403a10c 56 printf("ch=%2d, ret= %d, %f\n", (ret>>12)&0xF, ret&0xFFF, 3.3*(float)(ret&0xFFF)/0xFFF);
ykuroda 0:95be7403a10c 57 }
ykuroda 0:95be7403a10c 58 printf("\n");
ykuroda 0:95be7403a10c 59 for(int ch=0; ch<16; ch++){
ykuroda 0:95be7403a10c 60 ret = ad2.convert(ch);
ykuroda 0:95be7403a10c 61 printf("ch=%2d, ret= %d, %f\n", (ret>>12)&0xF, ret&0xFFF, 3.3*(float)(ret&0xFFF)/0xFFF);
ykuroda 0:95be7403a10c 62 }
ykuroda 0:95be7403a10c 63 printf("\n");
ykuroda 0:95be7403a10c 64
ykuroda 0:95be7403a10c 65 myled = 1;
ykuroda 0:95be7403a10c 66 wait(0.1);
ykuroda 0:95be7403a10c 67 myled = 0;
ykuroda 0:95be7403a10c 68 wait(0.9);
ykuroda 0:95be7403a10c 69 }
ykuroda 0:95be7403a10c 70 }
ykuroda 0:95be7403a10c 71 #endif // test main
ykuroda 0:95be7403a10c 72
ykuroda 0:95be7403a10c 73 #endif // _AD7490_H