Mario Poneder / ADC_AD7190
Committer:
MarioPoneder
Date:
Tue Jan 28 13:18:17 2014 +0000
Revision:
2:dc4217ca1fff
Parent:
1:00d6e45e037a
doc done

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MarioPoneder 0:49fe1d7a6628 1 #ifndef __AD7190_H__
MarioPoneder 0:49fe1d7a6628 2 #define __AD7190_H__
MarioPoneder 0:49fe1d7a6628 3
MarioPoneder 0:49fe1d7a6628 4 #include "mbed.h"
MarioPoneder 0:49fe1d7a6628 5
MarioPoneder 0:49fe1d7a6628 6 /******************************************************************************/
MarioPoneder 0:49fe1d7a6628 7 /******************************** AD7190 **************************************/
MarioPoneder 0:49fe1d7a6628 8 /******************************************************************************/
MarioPoneder 0:49fe1d7a6628 9
MarioPoneder 0:49fe1d7a6628 10 /* AD7190 Register Map */
MarioPoneder 0:49fe1d7a6628 11 #define REG_COMM 0 // Communications Register (WO, 8-bit)
MarioPoneder 0:49fe1d7a6628 12 #define REG_STAT 0 // Status Register (RO, 8-bit)
MarioPoneder 0:49fe1d7a6628 13 #define REG_MODE 1 // Mode Register (RW, 24-bit
MarioPoneder 0:49fe1d7a6628 14 #define REG_CONF 2 // Configuration Register (RW, 24-bit)
MarioPoneder 0:49fe1d7a6628 15 #define REG_DATA 3 // Data Register (RO, 24/32-bit)
MarioPoneder 0:49fe1d7a6628 16 #define REG_ID 4 // ID Register (RO, 8-bit)
MarioPoneder 0:49fe1d7a6628 17 #define REG_GPOCON 5 // GPOCON Register (RW, 8-bit)
MarioPoneder 0:49fe1d7a6628 18 #define REG_OFFSET 6 // Offset Register (RW, 24-bit
MarioPoneder 0:49fe1d7a6628 19 #define REG_FULLSCALE 7 // Full-Scale Register (RW, 24-bit)
MarioPoneder 0:49fe1d7a6628 20
MarioPoneder 0:49fe1d7a6628 21 /* Communications Register Bit Designations (REG_COMM) */
MarioPoneder 0:49fe1d7a6628 22 #define COMM_WEN (1 << 7) // Write Enable.
MarioPoneder 0:49fe1d7a6628 23 #define COMM_WRITE (0 << 6) // Write Operation.
MarioPoneder 0:49fe1d7a6628 24 #define COMM_READ (1 << 6) // Read Operation.
MarioPoneder 0:49fe1d7a6628 25 #define COMM_ADDR(x) (((x) & 0x7) << 3) // Register Address.
MarioPoneder 0:49fe1d7a6628 26 #define COMM_CREAD (1 << 2) // Continuous Read of Data Register.
MarioPoneder 0:49fe1d7a6628 27
MarioPoneder 0:49fe1d7a6628 28 /* Status Register Bit Designations (REG_STAT) */
MarioPoneder 0:49fe1d7a6628 29 #define STAT_RDY (1 << 7) // Ready.
MarioPoneder 0:49fe1d7a6628 30 #define STAT_ERR (1 << 6) // ADC error bit.
MarioPoneder 0:49fe1d7a6628 31 #define STAT_NOREF (1 << 5) // Error no external reference.
MarioPoneder 0:49fe1d7a6628 32 #define STAT_PARITY (1 << 4) // Parity check of the data register.
MarioPoneder 0:49fe1d7a6628 33 #define STAT_CH2 (1 << 2) // Channel 2.
MarioPoneder 0:49fe1d7a6628 34 #define STAT_CH1 (1 << 1) // Channel 1.
MarioPoneder 0:49fe1d7a6628 35 #define STAT_CH0 (1 << 0) // Channel 0.
MarioPoneder 0:49fe1d7a6628 36
MarioPoneder 0:49fe1d7a6628 37 /* Mode Register Bit Designations (REG_MODE) */
MarioPoneder 0:49fe1d7a6628 38 #define MODE_SEL(x) (((x) & 0x7) << 21) // Operation Mode Select.
MarioPoneder 0:49fe1d7a6628 39 #define MODE_DAT_STA (1 << 20) // Status Register transmission.
MarioPoneder 0:49fe1d7a6628 40 #define MODE_CLKSRC(x) (((x) & 0x3) << 18) // Clock Source Select.
MarioPoneder 0:49fe1d7a6628 41 #define MODE_SINC3 (1 << 15) // SINC3 Filter Select.
MarioPoneder 0:49fe1d7a6628 42 #define MODE_ENPAR (1 << 13) // Parity Enable.
MarioPoneder 0:49fe1d7a6628 43 #define MODE_SCYCLE (1 << 11) // Single cycle conversion.
MarioPoneder 0:49fe1d7a6628 44 #define MODE_REJ60 (1 << 10) // 50/60Hz notch filter.
MarioPoneder 0:49fe1d7a6628 45 #define MODE_RATE(x) ((x) & 0x3FF) // Filter Update Rate Select.
MarioPoneder 0:49fe1d7a6628 46
MarioPoneder 0:49fe1d7a6628 47 /* Mode Register: MODE_SEL(x) options */
MarioPoneder 0:49fe1d7a6628 48 #define MODE_CONT 0 // Continuous Conversion Mode.
MarioPoneder 0:49fe1d7a6628 49 #define MODE_SINGLE 1 // Single Conversion Mode.
MarioPoneder 0:49fe1d7a6628 50 #define MODE_IDLE 2 // Idle Mode.
MarioPoneder 0:49fe1d7a6628 51 #define MODE_PWRDN 3 // Power-Down Mode.
MarioPoneder 0:49fe1d7a6628 52 #define MODE_CAL_INT_ZERO 4 // Internal Zero-Scale Calibration.
MarioPoneder 0:49fe1d7a6628 53 #define MODE_CAL_INT_FULL 5 // Internal Full-Scale Calibration.
MarioPoneder 0:49fe1d7a6628 54 #define MODE_CAL_SYS_ZERO 6 // System Zero-Scale Calibration.
MarioPoneder 0:49fe1d7a6628 55 #define MODE_CAL_SYS_FULL 7 // System Full-Scale Calibration.
MarioPoneder 0:49fe1d7a6628 56
MarioPoneder 0:49fe1d7a6628 57 /* Mode Register: MODE_CLKSRC(x) options */
MarioPoneder 0:49fe1d7a6628 58 #define CLK_EXT_MCLK1_2 0 // External crystal. The external crystal
MarioPoneder 0:49fe1d7a6628 59 // is connected from MCLK1 to MCLK2.
MarioPoneder 0:49fe1d7a6628 60 #define CLK_EXT_MCLK2 1 // External Clock applied to MCLK2
MarioPoneder 0:49fe1d7a6628 61 #define CLK_INT 2 // Internal 4.92 MHz clock.
MarioPoneder 0:49fe1d7a6628 62 // Pin MCLK2 is tristated.
MarioPoneder 0:49fe1d7a6628 63 #define CLK_INT_CO 3 // Internal 4.92 MHz clock. The internal
MarioPoneder 0:49fe1d7a6628 64 // clock is available on MCLK2.
MarioPoneder 0:49fe1d7a6628 65
MarioPoneder 0:49fe1d7a6628 66 /* Configuration Register Bit Designations (REG_CONF) */
MarioPoneder 0:49fe1d7a6628 67 #define CONF_CHOP (1 << 23) // CHOP enable.
MarioPoneder 0:49fe1d7a6628 68 #define CONF_REFSEL (1 << 20) // REFIN1/REFIN2 Reference Select.
MarioPoneder 0:49fe1d7a6628 69 #define CONF_CHAN(x) (((x) & 0xFF) << 8) // Channel select.
MarioPoneder 0:49fe1d7a6628 70 #define CONF_BURN (1 << 7) // Burnout current enable.
MarioPoneder 0:49fe1d7a6628 71 #define CONF_REFDET (1 << 6) // Reference detect enable.
MarioPoneder 0:49fe1d7a6628 72 #define CONF_BUF (1 << 4) // Buffered Mode Enable.
MarioPoneder 0:49fe1d7a6628 73 #define CONF_UNIPOLAR (1 << 3) // Unipolar/Bipolar Enable.
MarioPoneder 0:49fe1d7a6628 74 #define CONF_GAIN(x) ((x) & 0x7) // Gain Select.
MarioPoneder 0:49fe1d7a6628 75
MarioPoneder 0:49fe1d7a6628 76 /* Configuration Register: CONF_CHAN(x) options */
MarioPoneder 0:49fe1d7a6628 77 #define CH_AIN1P_AIN2M 0 // AIN1(+) - AIN2(-)
MarioPoneder 0:49fe1d7a6628 78 #define CH_AIN3P_AIN4M 1 // AIN3(+) - AIN4(-)
MarioPoneder 0:49fe1d7a6628 79 #define CH_TEMP_SENSOR 2 // Temperature sensor
MarioPoneder 0:49fe1d7a6628 80 #define CH_AIN2P_AIN2M 3 // AIN2(+) - AIN2(-)
MarioPoneder 0:49fe1d7a6628 81 #define CH_AIN1P_AINCOM 4 // AIN1(+) - AINCOM
MarioPoneder 0:49fe1d7a6628 82 #define CH_AIN2P_AINCOM 5 // AIN2(+) - AINCOM
MarioPoneder 0:49fe1d7a6628 83 #define CH_AIN3P_AINCOM 6 // AIN3(+) - AINCOM
MarioPoneder 0:49fe1d7a6628 84 #define CH_AIN4P_AINCOM 7 // AIN4(+) - AINCOM
MarioPoneder 0:49fe1d7a6628 85
MarioPoneder 0:49fe1d7a6628 86 /* Configuration Register: CONF_GAIN(x) options */
MarioPoneder 0:49fe1d7a6628 87 // ADC Input Range (5 V Reference)
MarioPoneder 0:49fe1d7a6628 88 #define CONF_GAIN_1 0 // Gain 1 +-5 V
MarioPoneder 0:49fe1d7a6628 89 #define CONF_GAIN_8 3 // Gain 8 +-625 mV
MarioPoneder 0:49fe1d7a6628 90 #define CONF_GAIN_16 4 // Gain 16 +-312.5 mV
MarioPoneder 0:49fe1d7a6628 91 #define CONF_GAIN_32 5 // Gain 32 +-156.2 mV
MarioPoneder 0:49fe1d7a6628 92 #define CONF_GAIN_64 6 // Gain 64 +-78.125 mV
MarioPoneder 0:49fe1d7a6628 93 #define CONF_GAIN_128 7 // Gain 128 +-39.06 mV
MarioPoneder 0:49fe1d7a6628 94
MarioPoneder 0:49fe1d7a6628 95 /* ID Register Bit Designations (REG_ID) */
MarioPoneder 0:49fe1d7a6628 96 #define ID_AD7190 0x4
MarioPoneder 0:49fe1d7a6628 97 #define ID_MASK 0x0F
MarioPoneder 0:49fe1d7a6628 98
MarioPoneder 0:49fe1d7a6628 99 /* GPOCON Register Bit Designations (REG_GPOCON) */
MarioPoneder 0:49fe1d7a6628 100 #define GPOCON_BPDSW (1 << 6) // Bridge power-down switch enable
MarioPoneder 0:49fe1d7a6628 101 #define GPOCON_GP32EN (1 << 5) // Digital Output P3 and P2 enable
MarioPoneder 0:49fe1d7a6628 102 #define GPOCON_GP10EN (1 << 4) // Digital Output P1 and P0 enable
MarioPoneder 0:49fe1d7a6628 103 #define GPOCON_P3DAT (1 << 3) // P3 state
MarioPoneder 0:49fe1d7a6628 104 #define GPOCON_P2DAT (1 << 2) // P2 state
MarioPoneder 0:49fe1d7a6628 105 #define GPOCON_P1DAT (1 << 1) // P1 state
MarioPoneder 0:49fe1d7a6628 106 #define GPOCON_P0DAT (1 << 0) // P0 state
MarioPoneder 0:49fe1d7a6628 107
MarioPoneder 0:49fe1d7a6628 108 /***************************************************************************//**
MarioPoneder 2:dc4217ca1fff 109 * @brief Driver for the AD7190 (Ultralow Noise 24-Bit Sigma-Delta ADC).
MarioPoneder 2:dc4217ca1fff 110 * @author Mario Poneder
MarioPoneder 2:dc4217ca1fff 111 * @date 28/01/2014
MarioPoneder 2:dc4217ca1fff 112 *
MarioPoneder 2:dc4217ca1fff 113 * This class is based on the implementation from Dan Nechita (Analog Devices).
MarioPoneder 0:49fe1d7a6628 114 *******************************************************************************/
MarioPoneder 0:49fe1d7a6628 115 class AD7190
MarioPoneder 0:49fe1d7a6628 116 {
MarioPoneder 2:dc4217ca1fff 117 typedef void (*pSampleCallback_t)(unsigned long, unsigned char);
MarioPoneder 2:dc4217ca1fff 118
MarioPoneder 0:49fe1d7a6628 119 private:
MarioPoneder 0:49fe1d7a6628 120
MarioPoneder 0:49fe1d7a6628 121 DigitalIn _rdy; // Ready input pin (DOUT/RDY)
MarioPoneder 0:49fe1d7a6628 122 InterruptIn _rdyInt; // Ready interrupt input pin (DOUT/RDY)
MarioPoneder 0:49fe1d7a6628 123 SPI _spi; // MOSI -> DIN, MISO <- DOUT/RDY , SCLK -> SCLK
MarioPoneder 0:49fe1d7a6628 124
MarioPoneder 0:49fe1d7a6628 125 pSampleCallback_t sampleCallbackFunction;
MarioPoneder 0:49fe1d7a6628 126
MarioPoneder 0:49fe1d7a6628 127 void SampleInterrupt(void);
MarioPoneder 0:49fe1d7a6628 128
MarioPoneder 0:49fe1d7a6628 129 public:
MarioPoneder 0:49fe1d7a6628 130
MarioPoneder 0:49fe1d7a6628 131 AD7190(PinName rdy, PinName mosi, PinName miso, PinName sclk);
MarioPoneder 0:49fe1d7a6628 132
MarioPoneder 0:49fe1d7a6628 133 void StartContinuousRead(pSampleCallback_t sampleCallbackFunction);
MarioPoneder 0:49fe1d7a6628 134 void StopContinuousRead(void);
MarioPoneder 0:49fe1d7a6628 135 void SetRegisterValue(unsigned char registerAddress, unsigned long registerValue);
MarioPoneder 0:49fe1d7a6628 136 unsigned long GetRegisterValue(unsigned char registerAddress);
MarioPoneder 0:49fe1d7a6628 137 bool Init(void);
MarioPoneder 0:49fe1d7a6628 138 void Reset(void);
MarioPoneder 0:49fe1d7a6628 139 void WaitRdyGoLow(void);
MarioPoneder 0:49fe1d7a6628 140 };
MarioPoneder 0:49fe1d7a6628 141
MarioPoneder 0:49fe1d7a6628 142 #endif /* __AD7190_H__ */