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
libraries/CN0391/CN0391.cpp@33:c3ec596a29c2, 2016-11-07 (annotated)
- 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?
User | Revision | Line number | New 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 |