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 #include "mbed.h"
ykuroda 0:95be7403a10c 2 #include "AD7490.h"
ykuroda 0:95be7403a10c 3
ykuroda 0:95be7403a10c 4 AD7490::AD7490(SPI _spi, PinName _cs)
ykuroda 0:95be7403a10c 5 : spi(_spi),
ykuroda 0:95be7403a10c 6 cs(_cs)
ykuroda 0:95be7403a10c 7 {
ykuroda 0:95be7403a10c 8 short x = 0;
ykuroda 0:95be7403a10c 9
ykuroda 0:95be7403a10c 10 for(int i=0; i<3; i++){
ykuroda 0:95be7403a10c 11
ykuroda 0:95be7403a10c 12 x = 0;
ykuroda 0:95be7403a10c 13 x |= CREG_WRITE;
ykuroda 0:95be7403a10c 14 // x |= CREG_SEQ;
ykuroda 0:95be7403a10c 15 // x |= CREG_SHADOW;
ykuroda 0:95be7403a10c 16 x |= CREG_ADD3;
ykuroda 0:95be7403a10c 17 x |= CREG_ADD2;
ykuroda 0:95be7403a10c 18 x |= CREG_ADD1;
ykuroda 0:95be7403a10c 19 x |= CREG_ADD0;
ykuroda 0:95be7403a10c 20 x |= CREG_PM1;
ykuroda 0:95be7403a10c 21 x |= CREG_PM0;
ykuroda 0:95be7403a10c 22 x |= CREG_RANGE;
ykuroda 0:95be7403a10c 23 x |= CREG_CODING;
ykuroda 0:95be7403a10c 24
ykuroda 0:95be7403a10c 25 cs = 0;
ykuroda 0:95be7403a10c 26 ret = spi.write(x<<4);
ykuroda 0:95be7403a10c 27 cs = 1;
ykuroda 0:95be7403a10c 28
ykuroda 0:95be7403a10c 29 // printf("INIT: send = 0x%X, ret = 0x%X\n", x, ret);
ykuroda 0:95be7403a10c 30 }
ykuroda 0:95be7403a10c 31 }
ykuroda 0:95be7403a10c 32
ykuroda 0:95be7403a10c 33 AD7490::~AD7490()
ykuroda 0:95be7403a10c 34 {
ykuroda 0:95be7403a10c 35 }
ykuroda 0:95be7403a10c 36
ykuroda 0:95be7403a10c 37 unsigned short
ykuroda 0:95be7403a10c 38 AD7490::convert(int ch)
ykuroda 0:95be7403a10c 39 {
ykuroda 0:95be7403a10c 40 unsigned short x = 0;
ykuroda 0:95be7403a10c 41
ykuroda 0:95be7403a10c 42 x |= CREG_WRITE;
ykuroda 0:95be7403a10c 43 // x |= CREG_SEQ;
ykuroda 0:95be7403a10c 44 // x |= CREG_SHADOW;
ykuroda 0:95be7403a10c 45 // x |= CREG_ADD3;
ykuroda 0:95be7403a10c 46 // x |= CREG_ADD2;
ykuroda 0:95be7403a10c 47 // x |= CREG_ADD1;
ykuroda 0:95be7403a10c 48 x |= (CREG_ADD0|CREG_ADD1|CREG_ADD2|CREG_ADD3) & (ch<<6);
ykuroda 0:95be7403a10c 49
ykuroda 0:95be7403a10c 50 x |= CREG_PM1;
ykuroda 0:95be7403a10c 51 x |= CREG_PM0;
ykuroda 0:95be7403a10c 52 x |= CREG_RANGE;
ykuroda 0:95be7403a10c 53 x |= CREG_CODING;
ykuroda 0:95be7403a10c 54
ykuroda 0:95be7403a10c 55 cs = 0;
ykuroda 0:95be7403a10c 56 ret = spi.write(x<<4);
ykuroda 0:95be7403a10c 57 cs = 1;
ykuroda 0:95be7403a10c 58
ykuroda 0:95be7403a10c 59 // printf("send = 0x%X, ch = %2d, ret = %d\n", x, (ret>>12)&0xF, ret&0xFFF);
ykuroda 0:95be7403a10c 60
ykuroda 0:95be7403a10c 61 return ret;
ykuroda 0:95be7403a10c 62 }
ykuroda 0:95be7403a10c 63
ykuroda 0:95be7403a10c 64 void
ykuroda 0:95be7403a10c 65 AD7490::convert(short data[])
ykuroda 0:95be7403a10c 66 {
ykuroda 0:95be7403a10c 67 for(int ch=0; ch<16; ch++) data[ch]=0;
ykuroda 0:95be7403a10c 68 for(int ch=0; ch<16; ch++){
ykuroda 0:95be7403a10c 69 unsigned short ret = convert(ch);
ykuroda 0:95be7403a10c 70
ykuroda 0:95be7403a10c 71 data[ ret>>12&0xF ] = ret&0xFFF;
ykuroda 0:95be7403a10c 72 }
ykuroda 0:95be7403a10c 73 }
ykuroda 0:95be7403a10c 74
ykuroda 0:95be7403a10c 75
ykuroda 0:95be7403a10c 76 unsigned short
ykuroda 0:95be7403a10c 77 AD7490::sequential(int ch)
ykuroda 0:95be7403a10c 78 {
ykuroda 0:95be7403a10c 79 unsigned short x = 0;
ykuroda 0:95be7403a10c 80
ykuroda 0:95be7403a10c 81 x |= CREG_WRITE;
ykuroda 0:95be7403a10c 82 x |= CREG_SEQ;
ykuroda 0:95be7403a10c 83 x |= CREG_SHADOW;
ykuroda 0:95be7403a10c 84 // x |= CREG_ADD3;
ykuroda 0:95be7403a10c 85 // x |= CREG_ADD2;
ykuroda 0:95be7403a10c 86 // x |= CREG_ADD1;
ykuroda 0:95be7403a10c 87 x |= (CREG_ADD0|CREG_ADD1|CREG_ADD2|CREG_ADD3) & (ch<<6);
ykuroda 0:95be7403a10c 88
ykuroda 0:95be7403a10c 89 x |= CREG_PM1;
ykuroda 0:95be7403a10c 90 x |= CREG_PM0;
ykuroda 0:95be7403a10c 91 x |= CREG_RANGE;
ykuroda 0:95be7403a10c 92 x |= CREG_CODING;
ykuroda 0:95be7403a10c 93
ykuroda 0:95be7403a10c 94 cs = 0;
ykuroda 0:95be7403a10c 95 ret = spi.write(x<<4);
ykuroda 0:95be7403a10c 96 cs = 1;
ykuroda 0:95be7403a10c 97
ykuroda 0:95be7403a10c 98 return ret;
ykuroda 0:95be7403a10c 99 }
ykuroda 0:95be7403a10c 100
ykuroda 0:95be7403a10c 101
ykuroda 0:95be7403a10c 102
ykuroda 0:95be7403a10c 103 unsigned short
ykuroda 0:95be7403a10c 104 AD7490::read(void)
ykuroda 0:95be7403a10c 105 {
ykuroda 0:95be7403a10c 106 unsigned short x = 0;
ykuroda 0:95be7403a10c 107
ykuroda 0:95be7403a10c 108 // x |= CREG_WRITE;
ykuroda 0:95be7403a10c 109 // x |= CREG_SEQ;
ykuroda 0:95be7403a10c 110 // x |= CREG_SHADOW;
ykuroda 0:95be7403a10c 111 // x |= CREG_ADD3;
ykuroda 0:95be7403a10c 112 // x |= CREG_ADD2;
ykuroda 0:95be7403a10c 113 // x |= CREG_ADD1;
ykuroda 0:95be7403a10c 114 // x |= (CREG_ADD0|CREG_ADD1|CREG_ADD2|CREG_ADD3) & (ch<<6);
ykuroda 0:95be7403a10c 115
ykuroda 0:95be7403a10c 116 // x |= CREG_PM1;
ykuroda 0:95be7403a10c 117 // x |= CREG_PM0;
ykuroda 0:95be7403a10c 118 // x |= CREG_RANGE;
ykuroda 0:95be7403a10c 119 // x |= CREG_CODING;
ykuroda 0:95be7403a10c 120
ykuroda 0:95be7403a10c 121 cs = 0;
ykuroda 0:95be7403a10c 122 ret = spi.write(x<<4);
ykuroda 0:95be7403a10c 123 cs = 1;
ykuroda 0:95be7403a10c 124
ykuroda 0:95be7403a10c 125 // printf("send = 0x%X, ch = %2d, ret = %d\n", x, (ret>>12)&0xF, ret&0xFFF);
ykuroda 0:95be7403a10c 126
ykuroda 0:95be7403a10c 127 return ret;
ykuroda 0:95be7403a10c 128 }
ykuroda 0:95be7403a10c 129
ykuroda 0:95be7403a10c 130 void
ykuroda 0:95be7403a10c 131 AD7490::read(short data[])
ykuroda 0:95be7403a10c 132 {
ykuroda 0:95be7403a10c 133 for(int ch=0; ch<16; ch++) data[ch]=0;
ykuroda 0:95be7403a10c 134 for(int ch=0; ch<16; ch++){
ykuroda 0:95be7403a10c 135 unsigned short ret = read();
ykuroda 0:95be7403a10c 136
ykuroda 0:95be7403a10c 137 data[ ret>>12&0xF ] = ret&0xFFF;
ykuroda 0:95be7403a10c 138 }
ykuroda 0:95be7403a10c 139 }
ykuroda 0:95be7403a10c 140
ykuroda 0:95be7403a10c 141
ykuroda 0:95be7403a10c 142
ykuroda 0:95be7403a10c 143
ykuroda 0:95be7403a10c 144
ykuroda 0:95be7403a10c 145
ykuroda 0:95be7403a10c 146 #if 0
ykuroda 0:95be7403a10c 147 int main() {
ykuroda 0:95be7403a10c 148
ykuroda 0:95be7403a10c 149 wait(1);
ykuroda 0:95be7403a10c 150
ykuroda 0:95be7403a10c 151 // set up SPI interface
ykuroda 0:95be7403a10c 152 SPI spi(p11,p12,p13);
ykuroda 0:95be7403a10c 153 spi.format(16,0);
ykuroda 0:95be7403a10c 154 spi.frequency(1000000);
ykuroda 0:95be7403a10c 155
ykuroda 0:95be7403a10c 156 AD7490 ad1(spi, p9);
ykuroda 0:95be7403a10c 157 AD7490 ad2(spi, p10);
ykuroda 0:95be7403a10c 158
ykuroda 0:95be7403a10c 159 while(1) {
ykuroda 0:95be7403a10c 160
ykuroda 0:95be7403a10c 161 int ret=0;
ykuroda 0:95be7403a10c 162 for(int ch=0; ch<16; ch++){
ykuroda 0:95be7403a10c 163 ret = ad1.convert(ch);
ykuroda 0:95be7403a10c 164 printf("ch=%2d, ret= %d, %f\n", (ret>>12)&0xF, ret&0xFFF, 3.3*(float)(ret&0xFFF)/0xFFF);
ykuroda 0:95be7403a10c 165 }
ykuroda 0:95be7403a10c 166 printf("\n");
ykuroda 0:95be7403a10c 167 for(int ch=0; ch<16; ch++){
ykuroda 0:95be7403a10c 168 ret = ad2.convert(ch);
ykuroda 0:95be7403a10c 169 printf("ch=%2d, ret= %d, %f\n", (ret>>12)&0xF, ret&0xFFF, 3.3*(float)(ret&0xFFF)/0xFFF);
ykuroda 0:95be7403a10c 170 }
ykuroda 0:95be7403a10c 171 printf("\n");
ykuroda 0:95be7403a10c 172
ykuroda 0:95be7403a10c 173 myled = 1;
ykuroda 0:95be7403a10c 174 wait(0.1);
ykuroda 0:95be7403a10c 175 myled = 0;
ykuroda 0:95be7403a10c 176 wait(0.9);
ykuroda 0:95be7403a10c 177 }
ykuroda 0:95be7403a10c 178 }
ykuroda 0:95be7403a10c 179 #endif