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 |
Diff: AD7490.h
- 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