CN0391 4-thermocouple shield driver

Dependencies:   AD7124 Thermocouple

Dependents:   cn0391-helloworld

For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all

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?

UserRevisionLine numberNew 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