Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
AD7190.h@2:dc4217ca1fff, 2014-01-28 (annotated)
- 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?
| User | Revision | Line number | New 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__ */ |