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
Revision:
1:ac3b7f978aa3
Parent:
0:95be7403a10c
Child:
2:a547c48d2152
--- a/AD7490.h	Wed Aug 29 11:01:51 2012 +0000
+++ b/AD7490.h	Wed Aug 29 14:10:30 2012 +0000
@@ -6,22 +6,23 @@
 
 class AD7490 {
   protected:
-    #define CREG_WRITE    0x800
-    #define CREG_SEQ      0x400
-    #define CREG_ADD3     0x200
-    #define CREG_ADD2     0x100
-    #define CREG_ADD1     0x080
-    #define CREG_ADD0     0x040
-    #define CREG_PM1      0x020
-    #define CREG_PM0      0x010
-    #define CREG_SHADOW   0x008
-    #define CREG_WEAK     0x004
-    #define CREG_RANGE    0x002
-    #define CREG_CODING   0x001
-
+    enum CREG {
+        CREG_WRITE  = 0x800,
+        CREG_SEQ    = 0x400,
+        CREG_ADD3   = 0x200,
+        CREG_ADD2   = 0x100,
+        CREG_ADD1   = 0x080,
+        CREG_ADD0   = 0x040,
+        CREG_PM1    = 0x020,
+        CREG_PM0    = 0x010,
+        CREG_SHADOW = 0x008,
+        CREG_WEAK   = 0x004,
+        CREG_RANGE  = 0x002,
+        CREG_CODING = 0x001
+    };
+    
     SPI spi;
     DigitalOut cs;
-    short ret;
     
   public:
     AD7490(SPI _spi, PinName _cs);
@@ -34,40 +35,4 @@
     void read(short data[]);
 };
 
-
-#if 0
-int main() {
-
-    wait(1);
-
-    // set up SPI interface
-    SPI spi(p11,p12,p13);
-    spi.format(16,0);
-    spi.frequency(1000000);
-
-    AD7490 ad1(spi, p9);
-    AD7490 ad2(spi, p10);
-
-    while(1) {
-
-        int ret=0;
-        for(int ch=0; ch<16; ch++){
-            ret = ad1.convert(ch);
-            printf("ch=%2d, ret= %d, %f\n", (ret>>12)&0xF, ret&0xFFF, 3.3*(float)(ret&0xFFF)/0xFFF);
-        }
-        printf("\n");
-        for(int ch=0; ch<16; ch++){
-            ret = ad2.convert(ch);
-            printf("ch=%2d, ret= %d, %f\n", (ret>>12)&0xF, ret&0xFFF, 3.3*(float)(ret&0xFFF)/0xFFF);
-        }
-        printf("\n");
-
-        myled = 1;
-        wait(0.1);
-        myled = 0;
-        wait(0.9);
-    }
-}
-#endif  // test main
-
-#endif  // _AD7490_H
+#endif  // _AD7490_H
\ No newline at end of file