Ultra-Small, Low-Power, I2C-Compatible, 860-SPS, 16-Bit ADCs With Internal Reference, Oscillator, and Programmable Comparator
ADS111X.h@3:4a9619b441f0, 2020-06-19 (annotated)
- Committer:
- mcm
- Date:
- Fri Jun 19 10:16:03 2020 +0000
- Revision:
- 3:4a9619b441f0
- Parent:
- 1:8593e6fcf0c3
- Child:
- 4:7853bced749c
The driver was completed and tested ( NUCLEO-L476RG ), it works as expected.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcm | 1:8593e6fcf0c3 | 1 | /** |
mcm | 1:8593e6fcf0c3 | 2 | * @brief ADS111X.h |
mcm | 1:8593e6fcf0c3 | 3 | * @details Ultra-Small, Low-Power, I2C-Compatible, 860-SPS, 16-Bit ADCs With Internal Reference, Oscillator, and Programmable Comparator. |
mcm | 1:8593e6fcf0c3 | 4 | * Header file. |
mcm | 1:8593e6fcf0c3 | 5 | * |
mcm | 1:8593e6fcf0c3 | 6 | * |
mcm | 1:8593e6fcf0c3 | 7 | * @return N/A |
mcm | 1:8593e6fcf0c3 | 8 | * |
mcm | 1:8593e6fcf0c3 | 9 | * @author Manuel Caballero |
mcm | 1:8593e6fcf0c3 | 10 | * @date 18/June/2020 |
mcm | 1:8593e6fcf0c3 | 11 | * @version 18/June/2020 The ORIGIN |
mcm | 1:8593e6fcf0c3 | 12 | * @pre N/A. |
mcm | 1:8593e6fcf0c3 | 13 | * @warning N/A |
mcm | 1:8593e6fcf0c3 | 14 | * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). |
mcm | 1:8593e6fcf0c3 | 15 | */ |
mcm | 1:8593e6fcf0c3 | 16 | #ifndef ADS111X_H |
mcm | 1:8593e6fcf0c3 | 17 | #define ADS111X_H |
mcm | 1:8593e6fcf0c3 | 18 | |
mcm | 1:8593e6fcf0c3 | 19 | #include "mbed.h" |
mcm | 1:8593e6fcf0c3 | 20 | |
mcm | 1:8593e6fcf0c3 | 21 | |
mcm | 1:8593e6fcf0c3 | 22 | /** |
mcm | 1:8593e6fcf0c3 | 23 | Example: |
mcm | 1:8593e6fcf0c3 | 24 | @code |
mcm | 3:4a9619b441f0 | 25 | #include "mbed.h" |
mcm | 3:4a9619b441f0 | 26 | #include "ADS111X.h" |
mcm | 1:8593e6fcf0c3 | 27 | |
mcm | 3:4a9619b441f0 | 28 | ADS111X myADS111X ( I2C_SDA, I2C_SCL, ADS111X::ADS111X_ADDRESS_GND, 100000, ADS111X::DEVICE_ADS1115 ); // I2C_SDA | I2C_SCL | DEVICE_ADS1115 |
mcm | 3:4a9619b441f0 | 29 | Serial pc ( USBTX, USBRX ); // tx, rx |
mcm | 3:4a9619b441f0 | 30 | |
mcm | 3:4a9619b441f0 | 31 | DigitalOut myled ( LED1 ); |
mcm | 3:4a9619b441f0 | 32 | Ticker newAction; |
mcm | 3:4a9619b441f0 | 33 | |
mcm | 3:4a9619b441f0 | 34 | |
mcm | 3:4a9619b441f0 | 35 | //@brief Constants. |
mcm | 3:4a9619b441f0 | 36 | |
mcm | 3:4a9619b441f0 | 37 | |
mcm | 3:4a9619b441f0 | 38 | //@brief Variables. |
mcm | 3:4a9619b441f0 | 39 | volatile uint32_t myState; // State that indicates when to perform a new sample |
mcm | 3:4a9619b441f0 | 40 | |
mcm | 3:4a9619b441f0 | 41 | |
mcm | 3:4a9619b441f0 | 42 | //@brief FUNCTION PROTOTYPES |
mcm | 3:4a9619b441f0 | 43 | void changeDATA ( void ); |
mcm | 3:4a9619b441f0 | 44 | |
mcm | 3:4a9619b441f0 | 45 | |
mcm | 3:4a9619b441f0 | 46 | //@brief FUNCTION FOR APPLICATION MAIN ENTRY. |
mcm | 3:4a9619b441f0 | 47 | int main() |
mcm | 3:4a9619b441f0 | 48 | { |
mcm | 3:4a9619b441f0 | 49 | ADS111X::ADS111X_status_t aux; |
mcm | 3:4a9619b441f0 | 50 | ADS111X::ADS111X_data_t myADS111X_Data; |
mcm | 3:4a9619b441f0 | 51 | |
mcm | 3:4a9619b441f0 | 52 | pc.baud ( 115200 ); |
mcm | 3:4a9619b441f0 | 53 | |
mcm | 3:4a9619b441f0 | 54 | myled = 1; |
mcm | 3:4a9619b441f0 | 55 | wait(3); |
mcm | 3:4a9619b441f0 | 56 | myled = 0; |
mcm | 3:4a9619b441f0 | 57 | |
mcm | 3:4a9619b441f0 | 58 | // Perform a softreset |
mcm | 3:4a9619b441f0 | 59 | aux = myADS111X.ADS111X_SoftReset (); |
mcm | 3:4a9619b441f0 | 60 | wait_ms ( 500U ); |
mcm | 3:4a9619b441f0 | 61 | |
mcm | 3:4a9619b441f0 | 62 | // Input multiplexor configuration ( channels ): AINp = AIN0 | AINn = GND |
mcm | 3:4a9619b441f0 | 63 | myADS111X_Data.config.mux = ADS111X::CONFIG_MUX_AINP_AIN0_AND_AINN_GND; |
mcm | 3:4a9619b441f0 | 64 | aux = myADS111X.ADS111X_SetMux ( myADS111X_Data ); |
mcm | 3:4a9619b441f0 | 65 | |
mcm | 3:4a9619b441f0 | 66 | // Gain: ±4.096V |
mcm | 3:4a9619b441f0 | 67 | myADS111X_Data.config.pga = ADS111X::CONFIG_PGA_FSR_4_096_V; |
mcm | 3:4a9619b441f0 | 68 | aux = myADS111X.ADS111X_SetGain ( myADS111X_Data ); |
mcm | 3:4a9619b441f0 | 69 | |
mcm | 3:4a9619b441f0 | 70 | // Mode: Single-shot |
mcm | 3:4a9619b441f0 | 71 | myADS111X_Data.config.mode = ADS111X::CONFIG_MODE_SINGLE_SHOT; |
mcm | 3:4a9619b441f0 | 72 | aux = myADS111X.ADS111X_SetMode ( myADS111X_Data.config ); |
mcm | 3:4a9619b441f0 | 73 | |
mcm | 3:4a9619b441f0 | 74 | // Data rate: 1600 SPS |
mcm | 3:4a9619b441f0 | 75 | myADS111X_Data.config.dr = ADS111X::CONFIG_DR_128_SPS; |
mcm | 3:4a9619b441f0 | 76 | aux = myADS111X.ADS111X_SetDataRate ( myADS111X_Data.config ); |
mcm | 3:4a9619b441f0 | 77 | |
mcm | 3:4a9619b441f0 | 78 | // Comparator: Disabled |
mcm | 3:4a9619b441f0 | 79 | myADS111X_Data.config.comp_que = ADS111X::CONFIG_COMP_QUE_DISABLED; |
mcm | 3:4a9619b441f0 | 80 | aux = myADS111X.ADS111X_SetComparator ( myADS111X_Data ); |
mcm | 3:4a9619b441f0 | 81 | |
mcm | 3:4a9619b441f0 | 82 | myState = 0UL; // Reset the variable |
mcm | 3:4a9619b441f0 | 83 | newAction.attach( &changeDATA, 1U ); // the address of the function to be attached ( changeDATA ) and the interval ( 1s ) |
mcm | 3:4a9619b441f0 | 84 | |
mcm | 3:4a9619b441f0 | 85 | // Let the callbacks take care of everything |
mcm | 3:4a9619b441f0 | 86 | while(1) { |
mcm | 3:4a9619b441f0 | 87 | sleep(); |
mcm | 3:4a9619b441f0 | 88 | |
mcm | 3:4a9619b441f0 | 89 | if ( myState == 1UL ) { |
mcm | 3:4a9619b441f0 | 90 | myled = 1U; |
mcm | 3:4a9619b441f0 | 91 | |
mcm | 3:4a9619b441f0 | 92 | // Trigger a new conversion |
mcm | 3:4a9619b441f0 | 93 | aux = myADS111X.ADS111X_StartSingleConversion (); |
mcm | 3:4a9619b441f0 | 94 | |
mcm | 3:4a9619b441f0 | 95 | // Wait until the conversion is completed |
mcm | 3:4a9619b441f0 | 96 | do { |
mcm | 3:4a9619b441f0 | 97 | aux = myADS111X.ADS111X_GetOS ( &myADS111X_Data.config ); |
mcm | 3:4a9619b441f0 | 98 | } while( ( myADS111X_Data.config.os & ADS111X::CONFIG_OS_MASK ) == ADS111X::CONFIG_OS_BUSY ); // [TODO] Too dangerous! the uC may get stuck here |
mcm | 3:4a9619b441f0 | 99 | // [WORKAROUND] Insert a counter. |
mcm | 3:4a9619b441f0 | 100 | // Get the result |
mcm | 3:4a9619b441f0 | 101 | aux = myADS111X.ADS111X_GetConversion ( &myADS111X_Data ); |
mcm | 3:4a9619b441f0 | 102 | |
mcm | 3:4a9619b441f0 | 103 | // Send data through the UART |
mcm | 3:4a9619b441f0 | 104 | pc.printf ( "V: %d mV\r\n", (int32_t)( 1000 * myADS111X_Data.conversion.conversion ) ); |
mcm | 3:4a9619b441f0 | 105 | |
mcm | 3:4a9619b441f0 | 106 | |
mcm | 3:4a9619b441f0 | 107 | // Reset the variables |
mcm | 3:4a9619b441f0 | 108 | myState = 0UL; |
mcm | 3:4a9619b441f0 | 109 | myled = 0U; |
mcm | 3:4a9619b441f0 | 110 | } |
mcm | 3:4a9619b441f0 | 111 | } |
mcm | 3:4a9619b441f0 | 112 | } |
mcm | 3:4a9619b441f0 | 113 | |
mcm | 3:4a9619b441f0 | 114 | |
mcm | 3:4a9619b441f0 | 115 | // @brief changeDATA ( void ) |
mcm | 3:4a9619b441f0 | 116 | // |
mcm | 3:4a9619b441f0 | 117 | // @details It changes myState variable |
mcm | 3:4a9619b441f0 | 118 | // |
mcm | 3:4a9619b441f0 | 119 | // @param[in] N/A |
mcm | 3:4a9619b441f0 | 120 | // |
mcm | 3:4a9619b441f0 | 121 | // @param[out] N/A. |
mcm | 3:4a9619b441f0 | 122 | // |
mcm | 3:4a9619b441f0 | 123 | // @return N/A. |
mcm | 3:4a9619b441f0 | 124 | // |
mcm | 3:4a9619b441f0 | 125 | // @author Manuel Caballero |
mcm | 3:4a9619b441f0 | 126 | // @date 18/June/2020 |
mcm | 3:4a9619b441f0 | 127 | // @version 18/June/2020 The ORIGIN |
mcm | 3:4a9619b441f0 | 128 | // @pre N/A |
mcm | 3:4a9619b441f0 | 129 | // @warning N/A. |
mcm | 3:4a9619b441f0 | 130 | void changeDATA ( void ) |
mcm | 3:4a9619b441f0 | 131 | { |
mcm | 3:4a9619b441f0 | 132 | myState = 1UL; |
mcm | 3:4a9619b441f0 | 133 | } |
mcm | 1:8593e6fcf0c3 | 134 | @endcode |
mcm | 1:8593e6fcf0c3 | 135 | */ |
mcm | 1:8593e6fcf0c3 | 136 | |
mcm | 1:8593e6fcf0c3 | 137 | |
mcm | 1:8593e6fcf0c3 | 138 | /*! |
mcm | 1:8593e6fcf0c3 | 139 | Library for the ADS111X Ultra-Small, Low-Power, I2C-Compatible, 860-SPS, 16-Bit ADCs With Internal Reference, Oscillator, and Programmable Comparator. |
mcm | 1:8593e6fcf0c3 | 140 | */ |
mcm | 1:8593e6fcf0c3 | 141 | class ADS111X |
mcm | 1:8593e6fcf0c3 | 142 | { |
mcm | 1:8593e6fcf0c3 | 143 | public: |
mcm | 1:8593e6fcf0c3 | 144 | /** |
mcm | 1:8593e6fcf0c3 | 145 | * @brief DEFAULT ADDRESSES |
mcm | 1:8593e6fcf0c3 | 146 | */ |
mcm | 1:8593e6fcf0c3 | 147 | typedef enum { |
mcm | 3:4a9619b441f0 | 148 | ADS111X_ADDRESS_GND = ( 0b1001000 << 1U ), /*!< I2C slave address byte, ADDR = GND */ |
mcm | 3:4a9619b441f0 | 149 | ADS111X_ADDRESS_VDD = ( 0b1001001 << 1U ), /*!< I2C slave address byte, ADDR = VDD */ |
mcm | 3:4a9619b441f0 | 150 | ADS111X_ADDRESS_SDA = ( 0b1001010 << 1U ), /*!< I2C slave address byte, ADDR = SDA */ |
mcm | 3:4a9619b441f0 | 151 | ADS111X_ADDRESS_SCL = ( 0b1001011 << 1U ) /*!< I2C slave address byte, ADDR = SCL */ |
mcm | 1:8593e6fcf0c3 | 152 | } ADS111X_addresses_t; |
mcm | 1:8593e6fcf0c3 | 153 | |
mcm | 1:8593e6fcf0c3 | 154 | |
mcm | 1:8593e6fcf0c3 | 155 | |
mcm | 1:8593e6fcf0c3 | 156 | /** |
mcm | 1:8593e6fcf0c3 | 157 | * @brief REGISTER MAP |
mcm | 1:8593e6fcf0c3 | 158 | */ |
mcm | 1:8593e6fcf0c3 | 159 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 160 | ADS111X_CONVERSION = 0x00, /*!< Conversion register */ |
mcm | 1:8593e6fcf0c3 | 161 | ADS111X_CONFIG = 0x01, /*!< Config register */ |
mcm | 1:8593e6fcf0c3 | 162 | ADS111X_LO_THRESH = 0x02, /*!< Lo threshold register */ |
mcm | 1:8593e6fcf0c3 | 163 | ADS111X_HI_THRESH = 0x03, /*!< Hi threshold register */ |
mcm | 1:8593e6fcf0c3 | 164 | ADS111X_RESET_COMMAND = 0x06 /*!< Reset command ( with a general call ) */ |
mcm | 1:8593e6fcf0c3 | 165 | } ADS111X_register_map_t; |
mcm | 1:8593e6fcf0c3 | 166 | |
mcm | 1:8593e6fcf0c3 | 167 | |
mcm | 1:8593e6fcf0c3 | 168 | |
mcm | 1:8593e6fcf0c3 | 169 | /** |
mcm | 1:8593e6fcf0c3 | 170 | * @brief DEVICE. |
mcm | 1:8593e6fcf0c3 | 171 | * NOTE: The user MUST define which device to use: ADS1013, ADS1014 or ADS1015. |
mcm | 1:8593e6fcf0c3 | 172 | */ |
mcm | 1:8593e6fcf0c3 | 173 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 174 | DEVICE_ADS1113 = 0x00, /*!< Device: ADS1113 */ |
mcm | 1:8593e6fcf0c3 | 175 | DEVICE_ADS1114 = 0x01, /*!< Device: ADS1114 */ |
mcm | 1:8593e6fcf0c3 | 176 | DEVICE_ADS1115 = 0x02 /*!< Device: ADS1115 */ |
mcm | 1:8593e6fcf0c3 | 177 | } ADS111X_device_t; |
mcm | 1:8593e6fcf0c3 | 178 | |
mcm | 1:8593e6fcf0c3 | 179 | |
mcm | 1:8593e6fcf0c3 | 180 | |
mcm | 1:8593e6fcf0c3 | 181 | /** |
mcm | 1:8593e6fcf0c3 | 182 | * @brief CONFIG REGISTER. ( Default: 0x8583 ) |
mcm | 1:8593e6fcf0c3 | 183 | * NOTE: The 16-bit Config register is used to control the operating mode, input selection, data rate, full-scale range, and |
mcm | 1:8593e6fcf0c3 | 184 | * comparator modes. |
mcm | 1:8593e6fcf0c3 | 185 | */ |
mcm | 1:8593e6fcf0c3 | 186 | /* OS <15> |
mcm | 1:8593e6fcf0c3 | 187 | * NOTE: Operational status or single-shot conversion start. |
mcm | 1:8593e6fcf0c3 | 188 | */ |
mcm | 1:8593e6fcf0c3 | 189 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 190 | CONFIG_OS_MASK = ( 1U << 15U ), /*!< OS mask */ |
mcm | 1:8593e6fcf0c3 | 191 | CONFIG_OS_BUSY = ( 1U << 15U ), /*!< Device is not currently performing a conversion/Start a single conversion (when in power-down state) [Default] */ |
mcm | 1:8593e6fcf0c3 | 192 | CONFIG_OS_NOT_BUSY = ( 0U << 15U ) /*!< Device is currently performing a conversion */ |
mcm | 1:8593e6fcf0c3 | 193 | } ADS111X_config_os_t; |
mcm | 1:8593e6fcf0c3 | 194 | |
mcm | 1:8593e6fcf0c3 | 195 | |
mcm | 1:8593e6fcf0c3 | 196 | /* MUX <14:12> |
mcm | 1:8593e6fcf0c3 | 197 | * NOTE: Input multiplexer configuration ( ADS1115 only ). |
mcm | 1:8593e6fcf0c3 | 198 | */ |
mcm | 1:8593e6fcf0c3 | 199 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 200 | CONFIG_MUX_MASK = ( 0b111 << 12U ), /*!< MUX mask */ |
mcm | 1:8593e6fcf0c3 | 201 | CONFIG_MUX_AINP_AIN0_AND_AINN_AIN1 = ( 0b000 << 12U ), /*!< AINP = AIN0 and AINN = AIN1 [ Default ] */ |
mcm | 1:8593e6fcf0c3 | 202 | CONFIG_MUX_AINP_AIN0_AND_AINN_AIN3 = ( 0b001 << 12U ), /*!< AINP = AIN0 and AINN = AIN3 */ |
mcm | 1:8593e6fcf0c3 | 203 | CONFIG_MUX_AINP_AIN1_AND_AINN_AIN3 = ( 0b010 << 12U ), /*!< AINP = AIN1 and AINN = AIN3 */ |
mcm | 1:8593e6fcf0c3 | 204 | CONFIG_MUX_AINP_AIN2_AND_AINN_AIN3 = ( 0b011 << 12U ), /*!< AINP = AIN2 and AINN = AIN3 */ |
mcm | 1:8593e6fcf0c3 | 205 | CONFIG_MUX_AINP_AIN0_AND_AINN_GND = ( 0b100 << 12U ), /*!< AINP = AIN0 and AINN = GND */ |
mcm | 1:8593e6fcf0c3 | 206 | CONFIG_MUX_AINP_AIN1_AND_AINN_GND = ( 0b101 << 12U ), /*!< AINP = AIN1 and AINN = GND */ |
mcm | 1:8593e6fcf0c3 | 207 | CONFIG_MUX_AINP_AIN2_AND_AINN_GND = ( 0b110 << 12U ), /*!< AINP = AIN2 and AINN = GND */ |
mcm | 1:8593e6fcf0c3 | 208 | CONFIG_MUX_AINP_AIN3_AND_AINN_GND = ( 0b111 << 12U ) /*!< AINP = AIN3 and AINN = GND */ |
mcm | 1:8593e6fcf0c3 | 209 | } ADS111X_config_mux_t; |
mcm | 1:8593e6fcf0c3 | 210 | |
mcm | 1:8593e6fcf0c3 | 211 | |
mcm | 1:8593e6fcf0c3 | 212 | /* PGA <11:9> |
mcm | 1:8593e6fcf0c3 | 213 | * NOTE: Programmable gain amplifier configuration ( These bits serve NO function on the ADS1113 ). |
mcm | 1:8593e6fcf0c3 | 214 | */ |
mcm | 1:8593e6fcf0c3 | 215 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 216 | CONFIG_PGA_MASK = ( 0b111 << 9U ), /*!< PGA mask */ |
mcm | 3:4a9619b441f0 | 217 | CONFIG_PGA_FSR_6_144_V = ( 0b000 << 9U ), /*!< FSR = ±6.144 V */ |
mcm | 3:4a9619b441f0 | 218 | CONFIG_PGA_FSR_4_096_V = ( 0b001 << 9U ), /*!< FSR = ±4.096 V */ |
mcm | 3:4a9619b441f0 | 219 | CONFIG_PGA_FSR_2_048_V = ( 0b010 << 9U ), /*!< FSR = ±2.048 V [ Default ] */ |
mcm | 3:4a9619b441f0 | 220 | CONFIG_PGA_FSR_1_024_V = ( 0b011 << 9U ), /*!< FSR = ±1.024 V */ |
mcm | 3:4a9619b441f0 | 221 | CONFIG_PGA_FSR_0_512_V = ( 0b100 << 9U ), /*!< FSR = ±0.512 V */ |
mcm | 3:4a9619b441f0 | 222 | CONFIG_PGA_FSR_0_256_V = ( 0b101 << 9U ) /*!< FSR = ±0.256 V */ |
mcm | 1:8593e6fcf0c3 | 223 | } ADS111X_config_pga_t; |
mcm | 1:8593e6fcf0c3 | 224 | |
mcm | 1:8593e6fcf0c3 | 225 | |
mcm | 1:8593e6fcf0c3 | 226 | /* MODE <8> |
mcm | 1:8593e6fcf0c3 | 227 | * NOTE: Device operating mode. |
mcm | 1:8593e6fcf0c3 | 228 | */ |
mcm | 1:8593e6fcf0c3 | 229 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 230 | CONFIG_MODE_MASK = ( 1U << 8U ), /*!< MODE mask */ |
mcm | 1:8593e6fcf0c3 | 231 | CONFIG_MODE_CONTINUOUS_CONVERSION = ( 0U << 8U ), /*!< Continuous-conversion mode */ |
mcm | 1:8593e6fcf0c3 | 232 | CONFIG_MODE_SINGLE_SHOT = ( 1U << 8U ) /*!< Single-shot mode or power-down state [ Default ] */ |
mcm | 1:8593e6fcf0c3 | 233 | } ADS111X_config_mode_t; |
mcm | 1:8593e6fcf0c3 | 234 | |
mcm | 1:8593e6fcf0c3 | 235 | |
mcm | 1:8593e6fcf0c3 | 236 | /* DR <7:5> |
mcm | 1:8593e6fcf0c3 | 237 | * NOTE: Data rate. |
mcm | 1:8593e6fcf0c3 | 238 | */ |
mcm | 1:8593e6fcf0c3 | 239 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 240 | CONFIG_DR_MASK = ( 0b111 << 5U ), /*!< DR mask */ |
mcm | 1:8593e6fcf0c3 | 241 | CONFIG_DR_8_SPS = ( 0b000 << 5U ), /*!< 8 SPS */ |
mcm | 1:8593e6fcf0c3 | 242 | CONFIG_DR_16_SPS = ( 0b001 << 5U ), /*!< 16 SPS */ |
mcm | 1:8593e6fcf0c3 | 243 | CONFIG_DR_32_SPS = ( 0b010 << 5U ), /*!< 32 SPS */ |
mcm | 1:8593e6fcf0c3 | 244 | CONFIG_DR_64_SPS = ( 0b011 << 5U ), /*!< 64 SPS */ |
mcm | 1:8593e6fcf0c3 | 245 | CONFIG_DR_128_SPS = ( 0b100 << 5U ), /*!< 128 SPS [ Default ] */ |
mcm | 1:8593e6fcf0c3 | 246 | CONFIG_DR_250_SPS = ( 0b101 << 5U ), /*!< 250 SPS */ |
mcm | 1:8593e6fcf0c3 | 247 | CONFIG_DR_475_SPS = ( 0b110 << 5U ), /*!< 475 SPS */ |
mcm | 1:8593e6fcf0c3 | 248 | CONFIG_DR_860_SPS = ( 0b111 << 5U ) /*!< 860 SPS */ |
mcm | 1:8593e6fcf0c3 | 249 | } ADS111X_config_dr_t; |
mcm | 1:8593e6fcf0c3 | 250 | |
mcm | 1:8593e6fcf0c3 | 251 | |
mcm | 1:8593e6fcf0c3 | 252 | /* COMP_MODE <4> |
mcm | 1:8593e6fcf0c3 | 253 | * NOTE: Comparator mode ( ADS1114 and ADS1115 only ) |
mcm | 1:8593e6fcf0c3 | 254 | */ |
mcm | 1:8593e6fcf0c3 | 255 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 256 | CONFIG_COMP_MODE_MASK = ( 1U << 4U ), /*!< COMP_MODE mask */ |
mcm | 1:8593e6fcf0c3 | 257 | CONFIG_COMP_MODE_TRADITIONAL_COMPARATOR = ( 0U << 4U ), /*!< Traditional comparator [ Default ] */ |
mcm | 1:8593e6fcf0c3 | 258 | CONFIG_COMP_MODE_WINDOW_COMPARATOR = ( 1U << 4U ) /*!< Window comparator */ |
mcm | 1:8593e6fcf0c3 | 259 | } ADS111X_config_comp_mode_t; |
mcm | 1:8593e6fcf0c3 | 260 | |
mcm | 1:8593e6fcf0c3 | 261 | |
mcm | 1:8593e6fcf0c3 | 262 | /* COMP_POL <3> |
mcm | 1:8593e6fcf0c3 | 263 | * NOTE: Comparator polarity ( ADS1114 and ADS1115 only ) |
mcm | 1:8593e6fcf0c3 | 264 | */ |
mcm | 1:8593e6fcf0c3 | 265 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 266 | CONFIG_COMP_POL_MASK = ( 1U << 3U ), /*!< COMP_POL mask */ |
mcm | 1:8593e6fcf0c3 | 267 | CONFIG_COMP_POL_ACTIVE_LOW = ( 0U << 3U ), /*!< Active low [ Default ] */ |
mcm | 1:8593e6fcf0c3 | 268 | CONFIG_COMP_POL_ACTIVE_HIGH = ( 1U << 3U ) /*!< Active high */ |
mcm | 1:8593e6fcf0c3 | 269 | } ADS111X_config_comp_pol_t; |
mcm | 1:8593e6fcf0c3 | 270 | |
mcm | 1:8593e6fcf0c3 | 271 | |
mcm | 1:8593e6fcf0c3 | 272 | /* COMP_LAT <2> |
mcm | 1:8593e6fcf0c3 | 273 | * NOTE: Latching comparator ( ADS1114 and ADS1115 only ) |
mcm | 1:8593e6fcf0c3 | 274 | */ |
mcm | 1:8593e6fcf0c3 | 275 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 276 | CONFIG_COMP_LAT_MASK = ( 1U << 2U ), /*!< COMP_LAT mask */ |
mcm | 1:8593e6fcf0c3 | 277 | CONFIG_COMP_LAT_NONLATCHING_COMPARATOR = ( 0U << 2U ), /*!< Nonlatching comparator [ Default ] */ |
mcm | 1:8593e6fcf0c3 | 278 | CONFIG_COMP_LAT_LATCHING_COMPARATOR = ( 1U << 2U ) /*!< Latching comparator */ |
mcm | 1:8593e6fcf0c3 | 279 | } ADS111X_config_comp_lat_t; |
mcm | 1:8593e6fcf0c3 | 280 | |
mcm | 1:8593e6fcf0c3 | 281 | |
mcm | 1:8593e6fcf0c3 | 282 | /* COMP_QUE <1:0> |
mcm | 1:8593e6fcf0c3 | 283 | * NOTE: Comparator queue and disable ( ADS1114 and ADS1115 only ) |
mcm | 1:8593e6fcf0c3 | 284 | */ |
mcm | 1:8593e6fcf0c3 | 285 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 286 | CONFIG_COMP_QUE_MASK = ( 0b11 << 0U ), /*!< COMP_QUE mask */ |
mcm | 1:8593e6fcf0c3 | 287 | CONFIG_COMP_QUE_ASSERT_AFTER_ONE_CONVERSION = ( 0b00 << 0U ), /*!< Assert after one conversion */ |
mcm | 1:8593e6fcf0c3 | 288 | CONFIG_COMP_QUE_ASSERT_AFTER_TWO_CONVERSION = ( 0b01 << 0U ), /*!< Assert after two conversions */ |
mcm | 1:8593e6fcf0c3 | 289 | CONFIG_COMP_QUE_ASSERT_AFTER_FOUR_CONVERSION = ( 0b10 << 0U ), /*!< Assert after four conversions */ |
mcm | 1:8593e6fcf0c3 | 290 | CONFIG_COMP_QUE_DISABLED = ( 0b11 << 0U ) /*!< Disable comparator and set ALERT/RDY pin to high-impedance [ Default ] */ |
mcm | 1:8593e6fcf0c3 | 291 | } ADS111X_config_comp_que_t; |
mcm | 1:8593e6fcf0c3 | 292 | |
mcm | 1:8593e6fcf0c3 | 293 | |
mcm | 1:8593e6fcf0c3 | 294 | |
mcm | 1:8593e6fcf0c3 | 295 | /** |
mcm | 1:8593e6fcf0c3 | 296 | * @brief LO_THRESH REGISTER. ( Default: 0x8000 ) |
mcm | 1:8593e6fcf0c3 | 297 | */ |
mcm | 1:8593e6fcf0c3 | 298 | /* LO_THRESH <15:0> |
mcm | 1:8593e6fcf0c3 | 299 | * NOTE: N/A. |
mcm | 1:8593e6fcf0c3 | 300 | */ |
mcm | 1:8593e6fcf0c3 | 301 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 302 | LO_THRESH_MASK = 0xFFFF /*!< LO_THRESH mask */ |
mcm | 1:8593e6fcf0c3 | 303 | } ADS111X_lo_thresh_t; |
mcm | 1:8593e6fcf0c3 | 304 | |
mcm | 1:8593e6fcf0c3 | 305 | |
mcm | 1:8593e6fcf0c3 | 306 | |
mcm | 1:8593e6fcf0c3 | 307 | /** |
mcm | 1:8593e6fcf0c3 | 308 | * @brief HI_THRESH REGISTER. ( Default: 0x7FFF ) |
mcm | 1:8593e6fcf0c3 | 309 | */ |
mcm | 1:8593e6fcf0c3 | 310 | /* HI_THRESH <15:0> |
mcm | 1:8593e6fcf0c3 | 311 | * NOTE: N/A. |
mcm | 1:8593e6fcf0c3 | 312 | */ |
mcm | 1:8593e6fcf0c3 | 313 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 314 | HI_THRESH_MASK = 0xFFFF /*!< HI_THRESH mask */ |
mcm | 1:8593e6fcf0c3 | 315 | } ADS111X_hi_thresh_t; |
mcm | 1:8593e6fcf0c3 | 316 | |
mcm | 1:8593e6fcf0c3 | 317 | |
mcm | 1:8593e6fcf0c3 | 318 | |
mcm | 1:8593e6fcf0c3 | 319 | |
mcm | 1:8593e6fcf0c3 | 320 | |
mcm | 1:8593e6fcf0c3 | 321 | #ifndef ADS111X_VECTOR_STRUCT_H |
mcm | 1:8593e6fcf0c3 | 322 | #define ADS111X_VECTOR_STRUCT_H |
mcm | 1:8593e6fcf0c3 | 323 | /* Configuration parameters */ |
mcm | 1:8593e6fcf0c3 | 324 | typedef struct { |
mcm | 1:8593e6fcf0c3 | 325 | ADS111X_config_os_t os; /*!< Operational status */ |
mcm | 1:8593e6fcf0c3 | 326 | ADS111X_config_mux_t mux; /*!< Input multiplexer configuration (ADS1015 only) */ |
mcm | 1:8593e6fcf0c3 | 327 | ADS111X_config_pga_t pga; /*!< Programmable gain amplifier configuration (not ADS1013) */ |
mcm | 1:8593e6fcf0c3 | 328 | ADS111X_config_mode_t mode; /*!< Device operating mode */ |
mcm | 1:8593e6fcf0c3 | 329 | ADS111X_config_dr_t dr; /*!< Data rate */ |
mcm | 1:8593e6fcf0c3 | 330 | ADS111X_config_comp_mode_t comp_mode; /*!< Comparator mode (ADS1014 and ADS1015 only) */ |
mcm | 1:8593e6fcf0c3 | 331 | ADS111X_config_comp_pol_t comp_pol; /*!< Comparator polarity (ADS1014 and ADS1015 only) */ |
mcm | 1:8593e6fcf0c3 | 332 | ADS111X_config_comp_lat_t comp_lat; /*!< Latching comparator (ADS1014 and ADS1015 only) */ |
mcm | 1:8593e6fcf0c3 | 333 | ADS111X_config_comp_que_t comp_que; /*!< Comparator queue and disable (ADS1014 and ADS1015 only) */ |
mcm | 1:8593e6fcf0c3 | 334 | } ADS111X_config_t; |
mcm | 1:8593e6fcf0c3 | 335 | |
mcm | 1:8593e6fcf0c3 | 336 | |
mcm | 1:8593e6fcf0c3 | 337 | /* Thresholds: High and low thresholds */ |
mcm | 1:8593e6fcf0c3 | 338 | typedef struct { |
mcm | 1:8593e6fcf0c3 | 339 | int16_t lo_thresh; /*!< Low threshold value */ |
mcm | 1:8593e6fcf0c3 | 340 | int16_t hi_thresh; /*!< High threshold value */ |
mcm | 1:8593e6fcf0c3 | 341 | } ADS111X_thresh_t; |
mcm | 1:8593e6fcf0c3 | 342 | |
mcm | 1:8593e6fcf0c3 | 343 | |
mcm | 1:8593e6fcf0c3 | 344 | /* Result Conversion: Raw value and conversion value */ |
mcm | 1:8593e6fcf0c3 | 345 | typedef struct { |
mcm | 1:8593e6fcf0c3 | 346 | float conversion; /*!< Conversion value */ |
mcm | 1:8593e6fcf0c3 | 347 | int16_t raw_conversion; /*!< Raw conversion value */ |
mcm | 1:8593e6fcf0c3 | 348 | } ADS111X_conversion_t; |
mcm | 1:8593e6fcf0c3 | 349 | |
mcm | 1:8593e6fcf0c3 | 350 | |
mcm | 1:8593e6fcf0c3 | 351 | |
mcm | 1:8593e6fcf0c3 | 352 | /* USER: User's global variables */ |
mcm | 1:8593e6fcf0c3 | 353 | typedef struct { |
mcm | 1:8593e6fcf0c3 | 354 | /* Output */ |
mcm | 1:8593e6fcf0c3 | 355 | ADS111X_conversion_t conversion; /*!< Conversion values */ |
mcm | 1:8593e6fcf0c3 | 356 | |
mcm | 1:8593e6fcf0c3 | 357 | /* Configuration */ |
mcm | 1:8593e6fcf0c3 | 358 | ADS111X_config_t config; /*!< Configuration register */ |
mcm | 1:8593e6fcf0c3 | 359 | |
mcm | 1:8593e6fcf0c3 | 360 | /* Thresholds */ |
mcm | 1:8593e6fcf0c3 | 361 | ADS111X_thresh_t thresh; /*!< High/Low threshold values */ |
mcm | 1:8593e6fcf0c3 | 362 | |
mcm | 1:8593e6fcf0c3 | 363 | /* Device identification */ |
mcm | 1:8593e6fcf0c3 | 364 | ADS111X_device_t device; /*!< Device. The user MUST identify the device */ |
mcm | 1:8593e6fcf0c3 | 365 | } ADS111X_data_t; |
mcm | 1:8593e6fcf0c3 | 366 | #endif |
mcm | 1:8593e6fcf0c3 | 367 | |
mcm | 1:8593e6fcf0c3 | 368 | |
mcm | 1:8593e6fcf0c3 | 369 | /** |
mcm | 1:8593e6fcf0c3 | 370 | * @brief INTERNAL CONSTANTS |
mcm | 1:8593e6fcf0c3 | 371 | */ |
mcm | 1:8593e6fcf0c3 | 372 | typedef enum { |
mcm | 1:8593e6fcf0c3 | 373 | ADS111X_SUCCESS = 0U, /*!< I2C communication success */ |
mcm | 1:8593e6fcf0c3 | 374 | ADS111X_FAILURE = 1U, /*!< I2C communication failure */ |
mcm | 1:8593e6fcf0c3 | 375 | ADS111X_DEVICE_NOT_SUPPORTED = 2U, /*!< Device not supported */ |
mcm | 1:8593e6fcf0c3 | 376 | ADS111X_VALUE_OUT_OF_RANGE = 3U, /*!< Value aout of range */ |
mcm | 1:8593e6fcf0c3 | 377 | ADS111X_DATA_CORRUPTED = 4U, /*!< D and lo/hi threshold data */ |
mcm | 1:8593e6fcf0c3 | 378 | I2C_SUCCESS = 0U /*!< I2C communication was fine */ |
mcm | 1:8593e6fcf0c3 | 379 | } ADS111X_status_t; |
mcm | 1:8593e6fcf0c3 | 380 | |
mcm | 1:8593e6fcf0c3 | 381 | |
mcm | 1:8593e6fcf0c3 | 382 | |
mcm | 1:8593e6fcf0c3 | 383 | |
mcm | 1:8593e6fcf0c3 | 384 | /** Create an ADS111X object connected to the specified I2C pins. |
mcm | 1:8593e6fcf0c3 | 385 | * |
mcm | 1:8593e6fcf0c3 | 386 | * @param sda I2C data pin |
mcm | 1:8593e6fcf0c3 | 387 | * @param scl I2C clock pin |
mcm | 1:8593e6fcf0c3 | 388 | * @param addr I2C slave address |
mcm | 1:8593e6fcf0c3 | 389 | * @param freq I2C frequency |
mcm | 1:8593e6fcf0c3 | 390 | * @param device Device to use: ADS1113, ADS1114 or ADS1115 |
mcm | 1:8593e6fcf0c3 | 391 | */ |
mcm | 1:8593e6fcf0c3 | 392 | ADS111X ( PinName sda, PinName scl, uint32_t addr, uint32_t freq, ADS111X_device_t device ); |
mcm | 1:8593e6fcf0c3 | 393 | |
mcm | 1:8593e6fcf0c3 | 394 | /** Delete ADS111X object. |
mcm | 1:8593e6fcf0c3 | 395 | */ |
mcm | 1:8593e6fcf0c3 | 396 | ~ADS111X(); |
mcm | 1:8593e6fcf0c3 | 397 | |
mcm | 1:8593e6fcf0c3 | 398 | /** It triggers a softreset. |
mcm | 1:8593e6fcf0c3 | 399 | */ |
mcm | 1:8593e6fcf0c3 | 400 | ADS111X_status_t ADS111X_SoftReset ( void ); |
mcm | 1:8593e6fcf0c3 | 401 | |
mcm | 1:8593e6fcf0c3 | 402 | /** It gets the raw conversion value. |
mcm | 1:8593e6fcf0c3 | 403 | */ |
mcm | 1:8593e6fcf0c3 | 404 | ADS111X_status_t ADS111X_GetRawConversion ( ADS111X_conversion_t* myRawD ); |
mcm | 1:8593e6fcf0c3 | 405 | |
mcm | 1:8593e6fcf0c3 | 406 | /** It gets the conversion value. |
mcm | 1:8593e6fcf0c3 | 407 | */ |
mcm | 1:8593e6fcf0c3 | 408 | ADS111X_status_t ADS111X_GetConversion ( ADS111X_data_t* myD ); |
mcm | 1:8593e6fcf0c3 | 409 | |
mcm | 1:8593e6fcf0c3 | 410 | /** It starts a new single conversion. |
mcm | 1:8593e6fcf0c3 | 411 | */ |
mcm | 1:8593e6fcf0c3 | 412 | ADS111X_status_t ADS111X_StartSingleConversion ( void ); |
mcm | 1:8593e6fcf0c3 | 413 | |
mcm | 1:8593e6fcf0c3 | 414 | /** It checks if the device is not currently performing a conversion. |
mcm | 1:8593e6fcf0c3 | 415 | */ |
mcm | 1:8593e6fcf0c3 | 416 | ADS111X_status_t ADS111X_GetOS ( ADS111X_config_t* myADS111X ); |
mcm | 1:8593e6fcf0c3 | 417 | |
mcm | 1:8593e6fcf0c3 | 418 | /** It sets input multiplexer configuration ( ADS1015 only ). |
mcm | 1:8593e6fcf0c3 | 419 | */ |
mcm | 1:8593e6fcf0c3 | 420 | ADS111X_status_t ADS111X_SetMux ( ADS111X_data_t myADS111X ); |
mcm | 1:8593e6fcf0c3 | 421 | |
mcm | 1:8593e6fcf0c3 | 422 | /** It gets input multiplexer configuration ( ADS1015 only ). |
mcm | 1:8593e6fcf0c3 | 423 | */ |
mcm | 1:8593e6fcf0c3 | 424 | ADS111X_status_t ADS111X_GetMux ( ADS111X_data_t* myADS111X ); |
mcm | 1:8593e6fcf0c3 | 425 | |
mcm | 1:8593e6fcf0c3 | 426 | /** It sets programmable gain amplifier ( not ADS1013 ). |
mcm | 1:8593e6fcf0c3 | 427 | */ |
mcm | 1:8593e6fcf0c3 | 428 | ADS111X_status_t ADS111X_SetGain ( ADS111X_data_t myPGA ); |
mcm | 1:8593e6fcf0c3 | 429 | |
mcm | 1:8593e6fcf0c3 | 430 | /** It gets programmable gain amplifier ( not ADS1013 ). |
mcm | 1:8593e6fcf0c3 | 431 | */ |
mcm | 1:8593e6fcf0c3 | 432 | ADS111X_status_t ADS111X_GetGain ( ADS111X_data_t* myPGA ); |
mcm | 1:8593e6fcf0c3 | 433 | |
mcm | 1:8593e6fcf0c3 | 434 | /** It sets the device operating mode. |
mcm | 1:8593e6fcf0c3 | 435 | */ |
mcm | 1:8593e6fcf0c3 | 436 | ADS111X_status_t ADS111X_SetMode ( ADS111X_config_t myMode ); |
mcm | 1:8593e6fcf0c3 | 437 | |
mcm | 1:8593e6fcf0c3 | 438 | /** It gets the device operating mode. |
mcm | 1:8593e6fcf0c3 | 439 | */ |
mcm | 1:8593e6fcf0c3 | 440 | ADS111X_status_t ADS111X_GetMode ( ADS111X_config_t* myMode ); |
mcm | 1:8593e6fcf0c3 | 441 | |
mcm | 1:8593e6fcf0c3 | 442 | /** It sets the data rate. |
mcm | 1:8593e6fcf0c3 | 443 | */ |
mcm | 1:8593e6fcf0c3 | 444 | ADS111X_status_t ADS111X_SetDataRate ( ADS111X_config_t myDR ); |
mcm | 1:8593e6fcf0c3 | 445 | |
mcm | 1:8593e6fcf0c3 | 446 | /** It gets the data rate. |
mcm | 1:8593e6fcf0c3 | 447 | */ |
mcm | 1:8593e6fcf0c3 | 448 | ADS111X_status_t ADS111X_GetDataRate ( ADS111X_config_t* myDR ); |
mcm | 1:8593e6fcf0c3 | 449 | |
mcm | 1:8593e6fcf0c3 | 450 | /** It sets the comparator configuration. |
mcm | 1:8593e6fcf0c3 | 451 | */ |
mcm | 1:8593e6fcf0c3 | 452 | ADS111X_status_t ADS111X_SetComparator ( ADS111X_data_t myCOMP ); |
mcm | 1:8593e6fcf0c3 | 453 | |
mcm | 1:8593e6fcf0c3 | 454 | /** It gets the comparator configuration. |
mcm | 1:8593e6fcf0c3 | 455 | */ |
mcm | 1:8593e6fcf0c3 | 456 | ADS111X_status_t ADS111X_GetComparator ( ADS111X_data_t* myCOMP ); |
mcm | 1:8593e6fcf0c3 | 457 | |
mcm | 1:8593e6fcf0c3 | 458 | /** It sets the low threshold value. |
mcm | 1:8593e6fcf0c3 | 459 | */ |
mcm | 1:8593e6fcf0c3 | 460 | ADS111X_status_t ADS111X_SetLowThresholdValue ( ADS111X_thresh_t myLoThres ); |
mcm | 1:8593e6fcf0c3 | 461 | |
mcm | 1:8593e6fcf0c3 | 462 | /** It gets the low threshold value. |
mcm | 1:8593e6fcf0c3 | 463 | */ |
mcm | 1:8593e6fcf0c3 | 464 | ADS111X_status_t ADS111X_GetLowThresholdValue ( ADS111X_thresh_t* myLoThres ); |
mcm | 1:8593e6fcf0c3 | 465 | |
mcm | 1:8593e6fcf0c3 | 466 | /** It sets the high threshold value. |
mcm | 1:8593e6fcf0c3 | 467 | */ |
mcm | 1:8593e6fcf0c3 | 468 | ADS111X_status_t ADS111X_SetHighThresholdValue ( ADS111X_thresh_t myHiThres ); |
mcm | 1:8593e6fcf0c3 | 469 | |
mcm | 1:8593e6fcf0c3 | 470 | /** It gets the high threshold value. |
mcm | 1:8593e6fcf0c3 | 471 | */ |
mcm | 1:8593e6fcf0c3 | 472 | ADS111X_status_t ADS111X_GetHighThresholdValue ( ADS111X_thresh_t* myHiThres ); |
mcm | 1:8593e6fcf0c3 | 473 | |
mcm | 1:8593e6fcf0c3 | 474 | |
mcm | 1:8593e6fcf0c3 | 475 | |
mcm | 1:8593e6fcf0c3 | 476 | private: |
mcm | 1:8593e6fcf0c3 | 477 | I2C _i2c; |
mcm | 1:8593e6fcf0c3 | 478 | uint32_t _ADS111X_Addr; |
mcm | 1:8593e6fcf0c3 | 479 | ADS111X_device_t _device; |
mcm | 1:8593e6fcf0c3 | 480 | }; |
mcm | 1:8593e6fcf0c3 | 481 | |
mcm | 1:8593e6fcf0c3 | 482 | #endif |