A collection of Analog Devices drivers for the mbed platform

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

Committer:
Adrian Suciu
Date:
Mon Nov 07 16:27:12 2016 +0200
Revision:
33:c3ec596a29c2
Added CN0391, CN0396 and CN0397 shields

Who changed what in which revision?

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