AD7606 Library for mbed

Dependents:   AD7606_demo

This is my first attempt to develop a library to control an Analog Devices' AD7606BSTZ (8-channels, 16-bits, 200 kHz simultaneous sampling ADC) connected to an mbed enabled processor via an SPI port; I need to use this ADC in an applications requiring many simultaneous sampling analog input channels.

Until now the library has been tested with a FRDM-KL25Z and FRDM-K64F using this breakout board from ARMFLY, a Shenzhen-based Chinese Company, that I found on Aliexpress:

/media/uploads/frada/ad7606_breakout.jpg

It works well, at least for my needs.

Some important notes:

1) The AD7606 on the breakout board comes enabled to work in parallel mode, that is to tranfer the conversion results on a 8- or 16-bits wide data bus; to enable the SPI mode, it is mandatory to remove resistor R2 (10 kohm) and to solder it in place of R1.

2) as per the suggestions on the AD7606 data-sheet, when using the SPI connection, DB7 assumes the role of DOUTA and DB8 assumes the role of DOUTB; all remaining lines of parallel data bus should be connected to ground;

3) my library uses only DOUTA (DB7) to shift-out the conversion results of all channels; this is documented in the AD7606 data sheet:

SERIAL INTERFACE (PAR/SER/BYTE SEL = 1)

... Data can also be clocked out using just one DOUT line, in which case it is recommended that DOUTA be used to access all conversion data because the channel data is output in ascending order. For the AD7606 to access all eight conversion results on one DOUT line, a total of 128 SCLK cycles is required. ...

4) the 8 T/H (track and hold) devices in the AD7606BSTZ are divided in 2 groups of 4; each group being controlled by a CONVST line. I connected the two lines together to trigger the hold phase at the same time for all 8 T/H.

5) Until now I'm unable to find the cause of a problem with reading the correct status of the BUSY pin of the AD7606 (the while(_busy) loop in readAnalog and readRaw methods seems to hang, nonetheless the BUSY pin goes low after the conversion completion), so I am forced to wait for a fixed time (5 us) after the CONVST pulse to read the conversion result. However the conversion time is a function of the oversampling factor programmed using pins OS0, OS1, OS2 of the AD7606.

Committer:
frada
Date:
Tue Jan 20 16:19:17 2015 +0000
Revision:
4:9341319c0d8e
Parent:
3:ca87f4989281
-

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frada 0:e50a779f4f59 1 /***************************************************************************
frada 0:e50a779f4f59 2 * @author Francesco Adamo
frada 0:e50a779f4f59 3 *
frada 0:e50a779f4f59 4 * @section LICENSE
frada 0:e50a779f4f59 5 *
frada 0:e50a779f4f59 6 * Copyright (c) 2015 Francesco Adamo
frada 0:e50a779f4f59 7 *
frada 0:e50a779f4f59 8 * @section DESCRIPTION
frada 0:e50a779f4f59 9 *
frada 0:e50a779f4f59 10 * AD7606.H
frada 1:d6f1d3498d75 11 * Header file for AD7606 class library
frada 3:ca87f4989281 12 * The AD7606BSTZ is a 16-bits, 8-channels, SPI/Parallel-interfaced ADC from Analog Devices
frada 0:e50a779f4f59 13 *
frada 0:e50a779f4f59 14 *****************************************************************************/
frada 0:e50a779f4f59 15 #ifndef AD7606_H
frada 0:e50a779f4f59 16 #define AD7606_H
frada 0:e50a779f4f59 17
frada 0:e50a779f4f59 18 #include "mbed.h"
frada 0:e50a779f4f59 19
frada 0:e50a779f4f59 20 class AD7606 {
frada 0:e50a779f4f59 21 private:
frada 0:e50a779f4f59 22 SPI _spi;
frada 0:e50a779f4f59 23 DigitalOut _cs;
frada 0:e50a779f4f59 24 DigitalOut _convst;
frada 0:e50a779f4f59 25 DigitalIn _busy;
frada 1:d6f1d3498d75 26 DigitalOut _reset;
frada 2:1e367d82baff 27 double _q;
frada 0:e50a779f4f59 28
frada 0:e50a779f4f59 29 public:
frada 1:d6f1d3498d75 30 AD7606(PinName MISO, PinName SCLK, PinName CS, PinName CONVST, PinName BUSY, PinName RESET, int frequency); // Constructor
frada 1:d6f1d3498d75 31 void reset();
frada 2:1e367d82baff 32 void setDR(double); // Set dynamic range (10 V or 20 V), as a function of RANGE pin (0 => DR = +/- 5 V, 1 => DR = +/- 10 V)
frada 2:1e367d82baff 33 void readRAW(int16_t *); // Read raw values from ADC
frada 2:1e367d82baff 34 void readAnalog(double *); // Read analog values
frada 0:e50a779f4f59 35 };
frada 0:e50a779f4f59 36
frada 0:e50a779f4f59 37
frada 0:e50a779f4f59 38 #endif