CN0391 4-thermocouple shield driver
Dependencies: AD7124 Thermocouple
For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all
CN0391.cpp@1:f40851ca9316, 2016-11-07 (annotated)
- Committer:
- adisuciu
- Date:
- Mon Nov 07 16:05:19 2016 +0000
- Revision:
- 1:f40851ca9316
- Parent:
- 0:69053d5c21ee
Updated dependencies
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
adisuciu | 0:69053d5c21ee | 1 | #include "CN0391.h" |
adisuciu | 0:69053d5c21ee | 2 | #include "Thermocouple.h" |
adisuciu | 0:69053d5c21ee | 3 | #include "AD7124.h" |
adisuciu | 0:69053d5c21ee | 4 | |
adisuciu | 0:69053d5c21ee | 5 | //#define DEBUG_MODE |
adisuciu | 0:69053d5c21ee | 6 | |
adisuciu | 0:69053d5c21ee | 7 | extern Serial pc; |
adisuciu | 0:69053d5c21ee | 8 | |
adisuciu | 0:69053d5c21ee | 9 | |
adisuciu | 0:69053d5c21ee | 10 | #define ms_delay (1) |
adisuciu | 0:69053d5c21ee | 11 | #define R2 (1600.0) |
adisuciu | 0:69053d5c21ee | 12 | #define RTD_SLOPE (15/39.0) |
adisuciu | 0:69053d5c21ee | 13 | #define RTD_CONSTANT (1039.0) |
adisuciu | 0:69053d5c21ee | 14 | #define RTD_CONVERSION(R1) RTD_SLOPE * (R1-RTD_CONSTANT) |
adisuciu | 0:69053d5c21ee | 15 | #define CAL_CHANNEL (8) |
adisuciu | 0:69053d5c21ee | 16 | Thermocouple_Channel::Thermocouple_Channel() |
adisuciu | 0:69053d5c21ee | 17 | { |
adisuciu | 0:69053d5c21ee | 18 | this->t = NULL; |
adisuciu | 0:69053d5c21ee | 19 | } |
adisuciu | 0:69053d5c21ee | 20 | |
adisuciu | 0:69053d5c21ee | 21 | Thermocouple* Thermocouple_Channel::get_thermocouple_type() |
adisuciu | 0:69053d5c21ee | 22 | { |
adisuciu | 0:69053d5c21ee | 23 | return t; |
adisuciu | 0:69053d5c21ee | 24 | } |
adisuciu | 0:69053d5c21ee | 25 | void Thermocouple_Channel::set_thermocouple_type(Thermocouple* new_t) |
adisuciu | 0:69053d5c21ee | 26 | { |
adisuciu | 0:69053d5c21ee | 27 | t = new_t; |
adisuciu | 0:69053d5c21ee | 28 | } |
adisuciu | 0:69053d5c21ee | 29 | |
adisuciu | 0:69053d5c21ee | 30 | void Thermocouple_Channel::setup_channel(Thermocouple* new_t, uint16_t thermocouple_channel, uint16_t rtd_channel, uint16_t calibration_channel) |
adisuciu | 0:69053d5c21ee | 31 | { |
adisuciu | 0:69053d5c21ee | 32 | |
adisuciu | 0:69053d5c21ee | 33 | this->t = new_t; |
adisuciu | 0:69053d5c21ee | 34 | this->thermocouple_channel = thermocouple_channel; |
adisuciu | 0:69053d5c21ee | 35 | this->rtd_channel = rtd_channel; |
adisuciu | 0:69053d5c21ee | 36 | this->calibration_channel = calibration_channel; |
adisuciu | 0:69053d5c21ee | 37 | this->calibration_current = 0.0005; |
adisuciu | 0:69053d5c21ee | 38 | } |
adisuciu | 0:69053d5c21ee | 39 | |
adisuciu | 0:69053d5c21ee | 40 | CN0391::CN0391(PinName cs) : ad7124(cs) |
adisuciu | 0:69053d5c21ee | 41 | { |
adisuciu | 0:69053d5c21ee | 42 | |
adisuciu | 0:69053d5c21ee | 43 | } |
adisuciu | 0:69053d5c21ee | 44 | |
adisuciu | 0:69053d5c21ee | 45 | void CN0391::set_thermocouple_type(channel_t ch, Thermocouple* new_t) |
adisuciu | 0:69053d5c21ee | 46 | { |
adisuciu | 0:69053d5c21ee | 47 | tc[ch].setup_channel(new_t, ch * 2, (ch * 2) + 1, CAL_CHANNEL); |
adisuciu | 0:69053d5c21ee | 48 | } |
adisuciu | 0:69053d5c21ee | 49 | |
adisuciu | 0:69053d5c21ee | 50 | |
adisuciu | 0:69053d5c21ee | 51 | float CN0391::read_channel(channel_t ch) |
adisuciu | 0:69053d5c21ee | 52 | { |
adisuciu | 0:69053d5c21ee | 53 | int32_t data; |
adisuciu | 0:69053d5c21ee | 54 | |
adisuciu | 0:69053d5c21ee | 55 | enable_current_source(tc[ch].rtd_channel); |
adisuciu | 0:69053d5c21ee | 56 | enable_channel(tc[ch].rtd_channel); |
adisuciu | 0:69053d5c21ee | 57 | start_single_conversion(); |
adisuciu | 0:69053d5c21ee | 58 | |
adisuciu | 0:69053d5c21ee | 59 | if (ad7124.WaitForConvReady(10000) == -3) { |
adisuciu | 0:69053d5c21ee | 60 | pc.printf("TIMEOUT"); |
adisuciu | 0:69053d5c21ee | 61 | return 0; |
adisuciu | 0:69053d5c21ee | 62 | } |
adisuciu | 0:69053d5c21ee | 63 | |
adisuciu | 0:69053d5c21ee | 64 | ad7124.ReadData(&data); |
adisuciu | 0:69053d5c21ee | 65 | disable_channel(tc[ch].rtd_channel); |
adisuciu | 0:69053d5c21ee | 66 | float volt = data_to_voltage(data >> 8); |
adisuciu | 0:69053d5c21ee | 67 | float R1 = (volt / tc[ch].calibration_current) - R2; |
adisuciu | 0:69053d5c21ee | 68 | float temp = RTD_CONVERSION(R1); |
adisuciu | 0:69053d5c21ee | 69 | float mv_cold_junction = tc[ch].t->convert_inv(temp); |
adisuciu | 0:69053d5c21ee | 70 | //disable_current_source(tc[ch].rtd_channel); |
adisuciu | 0:69053d5c21ee | 71 | #ifdef DEBUG_MODE |
adisuciu | 0:69053d5c21ee | 72 | pc.printf("Resistance of RTD on channel %d is: %f\r\n", ch , R1); |
adisuciu | 0:69053d5c21ee | 73 | pc.printf("Temperature of RTD on channel %d is: %f\r\n", ch, temp); |
adisuciu | 0:69053d5c21ee | 74 | pc.printf("mV equivalent(poly method) of thermocouple is %f \r\n", mv_cold_junction); |
adisuciu | 0:69053d5c21ee | 75 | #endif |
adisuciu | 0:69053d5c21ee | 76 | // read thermocouple |
adisuciu | 0:69053d5c21ee | 77 | enable_channel(tc[ch].thermocouple_channel); |
adisuciu | 0:69053d5c21ee | 78 | start_single_conversion(); |
adisuciu | 0:69053d5c21ee | 79 | |
adisuciu | 0:69053d5c21ee | 80 | if (ad7124.WaitForConvReady(10000) == -3) { |
adisuciu | 0:69053d5c21ee | 81 | pc.printf("TIMEOUT"); |
adisuciu | 0:69053d5c21ee | 82 | return 0; |
adisuciu | 0:69053d5c21ee | 83 | } |
adisuciu | 0:69053d5c21ee | 84 | |
adisuciu | 0:69053d5c21ee | 85 | ad7124.ReadData(&data); |
adisuciu | 0:69053d5c21ee | 86 | disable_channel(tc[ch].thermocouple_channel); |
adisuciu | 0:69053d5c21ee | 87 | |
adisuciu | 0:69053d5c21ee | 88 | |
adisuciu | 0:69053d5c21ee | 89 | volt = data_to_voltage(data >> 8); |
adisuciu | 0:69053d5c21ee | 90 | float mv = volt * 1000 + mv_cold_junction; |
adisuciu | 0:69053d5c21ee | 91 | temp = tc[ch].t->convert(mv); |
adisuciu | 0:69053d5c21ee | 92 | #ifdef DEBUG_MODE |
adisuciu | 0:69053d5c21ee | 93 | pc.printf("mV of thermocouple on channel %d is: %f\r\n", ch, volt * 1000.0); |
adisuciu | 0:69053d5c21ee | 94 | pc.printf("mV(compensated) of thermocouple on channel %d is: %f\r\n", ch, mv); |
adisuciu | 0:69053d5c21ee | 95 | pc.printf("Temperature on channel %d is: %f\r\n", ch, temp); |
adisuciu | 0:69053d5c21ee | 96 | #endif |
adisuciu | 0:69053d5c21ee | 97 | return temp; |
adisuciu | 0:69053d5c21ee | 98 | } |
adisuciu | 0:69053d5c21ee | 99 | float CN0391::calibrate(channel_t ch) |
adisuciu | 0:69053d5c21ee | 100 | { |
adisuciu | 0:69053d5c21ee | 101 | int32_t data; |
adisuciu | 0:69053d5c21ee | 102 | enable_current_source(tc[ch].rtd_channel); |
adisuciu | 0:69053d5c21ee | 103 | enable_channel(tc[ch].calibration_channel); // calibration channel |
adisuciu | 0:69053d5c21ee | 104 | start_single_conversion(); |
adisuciu | 0:69053d5c21ee | 105 | if (ad7124.WaitForConvReady(10000) == -3) { |
adisuciu | 0:69053d5c21ee | 106 | pc.printf("TIMEOUT"); |
adisuciu | 0:69053d5c21ee | 107 | return 0; |
adisuciu | 0:69053d5c21ee | 108 | } |
adisuciu | 0:69053d5c21ee | 109 | |
adisuciu | 0:69053d5c21ee | 110 | ad7124.ReadData(&data); |
adisuciu | 0:69053d5c21ee | 111 | disable_channel(tc[ch].calibration_channel); |
adisuciu | 0:69053d5c21ee | 112 | //disable_current_source(tc[ch].rtd_channel); |
adisuciu | 0:69053d5c21ee | 113 | float volt = data_to_voltage(data >> 8); |
adisuciu | 0:69053d5c21ee | 114 | tc[ch].calibration_current = volt / R2; |
adisuciu | 0:69053d5c21ee | 115 | |
adisuciu | 0:69053d5c21ee | 116 | #ifdef DEBUG_MODE |
adisuciu | 0:69053d5c21ee | 117 | pc.printf("Calibration current for channel %d is: %f \r\n", ch, tc[ch].calibration_current); |
adisuciu | 0:69053d5c21ee | 118 | #endif |
adisuciu | 0:69053d5c21ee | 119 | return tc[ch].calibration_current; |
adisuciu | 0:69053d5c21ee | 120 | |
adisuciu | 0:69053d5c21ee | 121 | } |
adisuciu | 0:69053d5c21ee | 122 | |
adisuciu | 0:69053d5c21ee | 123 | |
adisuciu | 0:69053d5c21ee | 124 | float CN0391::data_to_voltage(uint32_t data) |
adisuciu | 0:69053d5c21ee | 125 | { |
adisuciu | 0:69053d5c21ee | 126 | data = data & 0xFFFFFF; |
adisuciu | 0:69053d5c21ee | 127 | return ((data / static_cast<float>(0xFFFFFF / 2)) - 1) * (2.5 / 1); |
adisuciu | 0:69053d5c21ee | 128 | } |
adisuciu | 0:69053d5c21ee | 129 | |
adisuciu | 0:69053d5c21ee | 130 | void CN0391::enable_channel(int channel) |
adisuciu | 0:69053d5c21ee | 131 | { |
adisuciu | 0:69053d5c21ee | 132 | AD7124::ad7124_registers regNr = static_cast<AD7124::ad7124_registers> (AD7124::AD7124_Channel_0 + channel); //Select ADC_Control register |
adisuciu | 0:69053d5c21ee | 133 | uint32_t setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 134 | setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel |
adisuciu | 0:69053d5c21ee | 135 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 136 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 137 | wait_ms(ms_delay); |
adisuciu | 0:69053d5c21ee | 138 | } |
adisuciu | 0:69053d5c21ee | 139 | |
adisuciu | 0:69053d5c21ee | 140 | void CN0391::disable_channel(int channel) |
adisuciu | 0:69053d5c21ee | 141 | { |
adisuciu | 0:69053d5c21ee | 142 | AD7124::ad7124_registers regNr = static_cast<AD7124::ad7124_registers> (AD7124::AD7124_Channel_0 + channel); //Select ADC_Control register |
adisuciu | 0:69053d5c21ee | 143 | uint32_t setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 144 | setValue &= (~(uint32_t) AD7124_CH_MAP_REG_CH_ENABLE); //Enable channel |
adisuciu | 0:69053d5c21ee | 145 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 146 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 147 | wait_ms(ms_delay); |
adisuciu | 0:69053d5c21ee | 148 | } |
adisuciu | 0:69053d5c21ee | 149 | |
adisuciu | 0:69053d5c21ee | 150 | void CN0391::enable_current_source(int current_source_channel) |
adisuciu | 0:69053d5c21ee | 151 | { |
adisuciu | 0:69053d5c21ee | 152 | AD7124::ad7124_registers regNr = AD7124::AD7124_IOCon1; //Select ADC_Control register |
adisuciu | 0:69053d5c21ee | 153 | uint32_t setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 154 | setValue &= ~(AD7124_IO_CTRL1_REG_IOUT_CH0(0xF)); |
adisuciu | 0:69053d5c21ee | 155 | setValue |= AD7124_IO_CTRL1_REG_IOUT_CH0(current_source_channel);// set IOUT0 current to 500uA |
adisuciu | 0:69053d5c21ee | 156 | setValue &= 0xFFFFFF; |
adisuciu | 0:69053d5c21ee | 157 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 158 | wait_ms(ms_delay); |
adisuciu | 0:69053d5c21ee | 159 | } |
adisuciu | 0:69053d5c21ee | 160 | |
adisuciu | 0:69053d5c21ee | 161 | void CN0391::start_single_conversion() |
adisuciu | 0:69053d5c21ee | 162 | { |
adisuciu | 0:69053d5c21ee | 163 | AD7124::ad7124_registers regNr = AD7124::AD7124_ADC_Control; //Select ADC_Control register |
adisuciu | 0:69053d5c21ee | 164 | uint32_t setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 165 | setValue &= 0xFFC3; |
adisuciu | 0:69053d5c21ee | 166 | setValue |= 0x04; //single conversion; |
adisuciu | 0:69053d5c21ee | 167 | setValue |= 0x1600; |
adisuciu | 0:69053d5c21ee | 168 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 169 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC*/ |
adisuciu | 0:69053d5c21ee | 170 | wait_ms(ms_delay); |
adisuciu | 0:69053d5c21ee | 171 | } |
adisuciu | 0:69053d5c21ee | 172 | |
adisuciu | 0:69053d5c21ee | 173 | void CN0391::reset() |
adisuciu | 0:69053d5c21ee | 174 | { |
adisuciu | 0:69053d5c21ee | 175 | ad7124.frequency(500000); |
adisuciu | 0:69053d5c21ee | 176 | ad7124.Reset(); |
adisuciu | 0:69053d5c21ee | 177 | pc.printf("Reseted AD7124\r\n"); |
adisuciu | 0:69053d5c21ee | 178 | } |
adisuciu | 0:69053d5c21ee | 179 | |
adisuciu | 0:69053d5c21ee | 180 | void CN0391::setup() |
adisuciu | 0:69053d5c21ee | 181 | { |
adisuciu | 0:69053d5c21ee | 182 | ad7124.frequency(500000); |
adisuciu | 0:69053d5c21ee | 183 | ad7124.Setup(); |
adisuciu | 0:69053d5c21ee | 184 | } |
adisuciu | 0:69053d5c21ee | 185 | |
adisuciu | 0:69053d5c21ee | 186 | void CN0391::init() |
adisuciu | 0:69053d5c21ee | 187 | { |
adisuciu | 0:69053d5c21ee | 188 | uint32_t setValue; |
adisuciu | 0:69053d5c21ee | 189 | enum AD7124::ad7124_registers regNr; |
adisuciu | 0:69053d5c21ee | 190 | setup(); |
adisuciu | 0:69053d5c21ee | 191 | wait_ms(ms_delay); |
adisuciu | 0:69053d5c21ee | 192 | |
adisuciu | 0:69053d5c21ee | 193 | /* Set Config_0 0x19*/ |
adisuciu | 0:69053d5c21ee | 194 | regNr = AD7124::AD7124_Config_0; //Select Config_0 register |
adisuciu | 0:69053d5c21ee | 195 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 196 | setValue |= AD7124_CFG_REG_BIPOLAR; //Select bipolar operation |
adisuciu | 0:69053d5c21ee | 197 | setValue |= AD7124_CFG_REG_BURNOUT(0); //Burnout current source off |
adisuciu | 0:69053d5c21ee | 198 | setValue |= AD7124_CFG_REG_REF_BUFP; |
adisuciu | 0:69053d5c21ee | 199 | setValue |= AD7124_CFG_REG_REF_BUFM; |
adisuciu | 0:69053d5c21ee | 200 | setValue |= AD7124_CFG_REG_AIN_BUFP; //Buffer AIN5 |
adisuciu | 0:69053d5c21ee | 201 | setValue |= AD7124_CFG_REG_AINN_BUFM; //Buffer AIN4 |
adisuciu | 0:69053d5c21ee | 202 | setValue |= AD7124_CFG_REG_REF_SEL(2); //Select REFIN1(+)/REFIN1(-) internal reference |
adisuciu | 0:69053d5c21ee | 203 | setValue |= AD7124_CFG_REG_PGA(0); |
adisuciu | 0:69053d5c21ee | 204 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 205 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 206 | |
adisuciu | 0:69053d5c21ee | 207 | /* Set Channel_0 register 0x09*/ |
adisuciu | 0:69053d5c21ee | 208 | regNr = AD7124::AD7124_Channel_0; |
adisuciu | 0:69053d5c21ee | 209 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 210 | //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0 |
adisuciu | 0:69053d5c21ee | 211 | setValue &= (~(uint32_t)AD7124_CH_MAP_REG_CH_ENABLE); |
adisuciu | 0:69053d5c21ee | 212 | setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0 |
adisuciu | 0:69053d5c21ee | 213 | setValue |= AD7124_CH_MAP_REG_AINP(0); // Set AIN4 as positive input |
adisuciu | 0:69053d5c21ee | 214 | setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input |
adisuciu | 0:69053d5c21ee | 215 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 216 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 217 | |
adisuciu | 0:69053d5c21ee | 218 | regNr = AD7124::AD7124_Channel_1; |
adisuciu | 0:69053d5c21ee | 219 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 220 | //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0 |
adisuciu | 0:69053d5c21ee | 221 | setValue &= (~(uint32_t)AD7124_CH_MAP_REG_CH_ENABLE); |
adisuciu | 0:69053d5c21ee | 222 | setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0 |
adisuciu | 0:69053d5c21ee | 223 | setValue |= AD7124_CH_MAP_REG_AINP(1); // Set AIN4 as positive input |
adisuciu | 0:69053d5c21ee | 224 | setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input |
adisuciu | 0:69053d5c21ee | 225 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 226 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 227 | |
adisuciu | 0:69053d5c21ee | 228 | regNr = AD7124::AD7124_Channel_2; |
adisuciu | 0:69053d5c21ee | 229 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 230 | //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0 |
adisuciu | 0:69053d5c21ee | 231 | setValue &= (~(uint32_t)AD7124_CH_MAP_REG_CH_ENABLE); |
adisuciu | 0:69053d5c21ee | 232 | setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0 |
adisuciu | 0:69053d5c21ee | 233 | setValue |= AD7124_CH_MAP_REG_AINP(2); // Set AIN4 as positive input |
adisuciu | 0:69053d5c21ee | 234 | setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input |
adisuciu | 0:69053d5c21ee | 235 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 236 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 237 | |
adisuciu | 0:69053d5c21ee | 238 | regNr = AD7124::AD7124_Channel_3; |
adisuciu | 0:69053d5c21ee | 239 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 240 | //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0 |
adisuciu | 0:69053d5c21ee | 241 | setValue &= (~(uint32_t)AD7124_CH_MAP_REG_CH_ENABLE); |
adisuciu | 0:69053d5c21ee | 242 | setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0 |
adisuciu | 0:69053d5c21ee | 243 | setValue |= AD7124_CH_MAP_REG_AINP(3); // Set AIN4 as positive input |
adisuciu | 0:69053d5c21ee | 244 | setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input |
adisuciu | 0:69053d5c21ee | 245 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 246 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 247 | |
adisuciu | 0:69053d5c21ee | 248 | regNr = AD7124::AD7124_Channel_4; |
adisuciu | 0:69053d5c21ee | 249 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 250 | //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0 |
adisuciu | 0:69053d5c21ee | 251 | setValue &= (~(uint32_t)AD7124_CH_MAP_REG_CH_ENABLE); |
adisuciu | 0:69053d5c21ee | 252 | setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0 |
adisuciu | 0:69053d5c21ee | 253 | setValue |= AD7124_CH_MAP_REG_AINP(4); // Set AIN4 as positive input |
adisuciu | 0:69053d5c21ee | 254 | setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input |
adisuciu | 0:69053d5c21ee | 255 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 256 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 257 | |
adisuciu | 0:69053d5c21ee | 258 | |
adisuciu | 0:69053d5c21ee | 259 | regNr = AD7124::AD7124_Channel_5; |
adisuciu | 0:69053d5c21ee | 260 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 261 | //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0 |
adisuciu | 0:69053d5c21ee | 262 | setValue &= (~(uint32_t)AD7124_CH_MAP_REG_CH_ENABLE); |
adisuciu | 0:69053d5c21ee | 263 | setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0 |
adisuciu | 0:69053d5c21ee | 264 | setValue |= AD7124_CH_MAP_REG_AINP(5); // Set AIN4 as positive input |
adisuciu | 0:69053d5c21ee | 265 | setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input |
adisuciu | 0:69053d5c21ee | 266 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 267 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 268 | |
adisuciu | 0:69053d5c21ee | 269 | |
adisuciu | 0:69053d5c21ee | 270 | regNr = AD7124::AD7124_Channel_6; |
adisuciu | 0:69053d5c21ee | 271 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 272 | //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0 |
adisuciu | 0:69053d5c21ee | 273 | setValue &= (~(uint32_t)AD7124_CH_MAP_REG_CH_ENABLE); |
adisuciu | 0:69053d5c21ee | 274 | setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0 |
adisuciu | 0:69053d5c21ee | 275 | setValue |= AD7124_CH_MAP_REG_AINP(6); // Set AIN4 as positive input |
adisuciu | 0:69053d5c21ee | 276 | setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input |
adisuciu | 0:69053d5c21ee | 277 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 278 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 279 | |
adisuciu | 0:69053d5c21ee | 280 | regNr = AD7124::AD7124_Channel_7; |
adisuciu | 0:69053d5c21ee | 281 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 282 | //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0 |
adisuciu | 0:69053d5c21ee | 283 | setValue &= (~(uint32_t)AD7124_CH_MAP_REG_CH_ENABLE); |
adisuciu | 0:69053d5c21ee | 284 | setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0 |
adisuciu | 0:69053d5c21ee | 285 | setValue |= AD7124_CH_MAP_REG_AINP(7); // Set AIN4 as positive input |
adisuciu | 0:69053d5c21ee | 286 | setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input |
adisuciu | 0:69053d5c21ee | 287 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 288 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 289 | |
adisuciu | 0:69053d5c21ee | 290 | regNr = AD7124::AD7124_Channel_8; |
adisuciu | 0:69053d5c21ee | 291 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 292 | //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0 |
adisuciu | 0:69053d5c21ee | 293 | setValue &= (~(uint32_t)AD7124_CH_MAP_REG_CH_ENABLE); |
adisuciu | 0:69053d5c21ee | 294 | setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0 |
adisuciu | 0:69053d5c21ee | 295 | setValue |= AD7124_CH_MAP_REG_AINP(14); // Set AIN4 as positive input |
adisuciu | 0:69053d5c21ee | 296 | setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input |
adisuciu | 0:69053d5c21ee | 297 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 298 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 299 | |
adisuciu | 0:69053d5c21ee | 300 | |
adisuciu | 0:69053d5c21ee | 301 | /* Set Config_0 0x19*/ |
adisuciu | 0:69053d5c21ee | 302 | |
adisuciu | 0:69053d5c21ee | 303 | #ifdef CALIBRATION |
adisuciu | 0:69053d5c21ee | 304 | // start calibration |
adisuciu | 0:69053d5c21ee | 305 | regNr = AD7124::AD7124_Offset_0; |
adisuciu | 0:69053d5c21ee | 306 | setValue = 0x800000; |
adisuciu | 0:69053d5c21ee | 307 | ad7124.WriteDeviceRegister(regNr, setValue);// Write data to ADC |
adisuciu | 0:69053d5c21ee | 308 | |
adisuciu | 0:69053d5c21ee | 309 | // internal fullscale before zero scale |
adisuciu | 0:69053d5c21ee | 310 | pc.printf("\r\n Gain before cali :%x", ad7124.ReadDeviceRegister(AD7124::AD7124_Gain_0)); |
adisuciu | 0:69053d5c21ee | 311 | regNr = AD7124::AD7124_ADC_Control;//Select ADC_Control register |
adisuciu | 0:69053d5c21ee | 312 | setValue = AD7124_ADC_CTRL_REG_MODE(6); |
adisuciu | 0:69053d5c21ee | 313 | setValue |= AD7124_ADC_CTRL_REG_REF_EN; |
adisuciu | 0:69053d5c21ee | 314 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 315 | ad7124.WriteDeviceRegister(regNr, setValue);// Write data to ADC |
adisuciu | 0:69053d5c21ee | 316 | //dut.WaitForConvReady(10000); |
adisuciu | 0:69053d5c21ee | 317 | wait_ms(2000); |
adisuciu | 0:69053d5c21ee | 318 | |
adisuciu | 0:69053d5c21ee | 319 | pc.printf("\r\n Gain:%x", ad7124.ReadDeviceRegister(AD7124::AD7124_Gain_0)); |
adisuciu | 0:69053d5c21ee | 320 | |
adisuciu | 0:69053d5c21ee | 321 | pc.printf("\r\n Offset before cali:%x", ad7124.ReadDeviceRegister(AD7124::AD7124_Offset_0)); |
adisuciu | 0:69053d5c21ee | 322 | // internal zeroscale |
adisuciu | 0:69053d5c21ee | 323 | regNr = AD7124::AD7124_ADC_Control;//Select ADC_Control register |
adisuciu | 0:69053d5c21ee | 324 | setValue = AD7124_ADC_CTRL_REG_MODE(5); |
adisuciu | 0:69053d5c21ee | 325 | setValue |= AD7124_ADC_CTRL_REG_REF_EN; |
adisuciu | 0:69053d5c21ee | 326 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 327 | ad7124.WriteDeviceRegister(regNr, setValue);// Write data to ADC |
adisuciu | 0:69053d5c21ee | 328 | wait_ms(2000); |
adisuciu | 0:69053d5c21ee | 329 | pc.printf("\r\n Offset:%x\r\n", ad7124.ReadDeviceRegister(AD7124::AD7124_Offset_0)); |
adisuciu | 0:69053d5c21ee | 330 | |
adisuciu | 0:69053d5c21ee | 331 | // end of calibration |
adisuciu | 0:69053d5c21ee | 332 | |
adisuciu | 0:69053d5c21ee | 333 | #endif |
adisuciu | 0:69053d5c21ee | 334 | |
adisuciu | 0:69053d5c21ee | 335 | /* Set IO_Control_1 0x03 */ |
adisuciu | 0:69053d5c21ee | 336 | regNr = AD7124::AD7124_IOCon1; //Select IO_Control_1 register |
adisuciu | 0:69053d5c21ee | 337 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 338 | setValue |= AD7124_IO_CTRL1_REG_IOUT0(0x4);// set IOUT0 current to 500uA |
adisuciu | 0:69053d5c21ee | 339 | setValue |= AD7124_IO_CTRL1_REG_IOUT_CH0(0x1); |
adisuciu | 0:69053d5c21ee | 340 | setValue &= 0xFFFFFF; |
adisuciu | 0:69053d5c21ee | 341 | ad7124.WriteDeviceRegister(regNr, setValue);// Write data to ADC |
adisuciu | 0:69053d5c21ee | 342 | |
adisuciu | 0:69053d5c21ee | 343 | /* Set ADC_Control 0x01 */ |
adisuciu | 0:69053d5c21ee | 344 | regNr = AD7124::AD7124_ADC_Control; //Select ADC_Control register |
adisuciu | 0:69053d5c21ee | 345 | setValue = ad7124.ReadDeviceRegister(regNr); |
adisuciu | 0:69053d5c21ee | 346 | setValue |= AD7124_ADC_CTRL_REG_DATA_STATUS; // set data status bit in order to check on which channel the conversion is |
adisuciu | 0:69053d5c21ee | 347 | setValue |= AD7124_ADC_CTRL_REG_REF_EN; |
adisuciu | 0:69053d5c21ee | 348 | setValue &= 0xFFC3; |
adisuciu | 0:69053d5c21ee | 349 | setValue |= AD7124_ADC_CTRL_REG_MODE(1); |
adisuciu | 0:69053d5c21ee | 350 | setValue &= 0xFFFF; |
adisuciu | 0:69053d5c21ee | 351 | ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC |
adisuciu | 0:69053d5c21ee | 352 | wait_ms(ms_delay); |
adisuciu | 0:69053d5c21ee | 353 | } |
adisuciu | 0:69053d5c21ee | 354 | |
adisuciu | 0:69053d5c21ee | 355 | |
adisuciu | 0:69053d5c21ee | 356 | |
adisuciu | 0:69053d5c21ee | 357 | |
adisuciu | 0:69053d5c21ee | 358 |