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 |
AD7490.cpp@0:95be7403a10c, 2012-08-29 (annotated)
- 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?
User | Revision | Line number | New 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 |