Soil Measurements for pH and moisture

Dependencies:   AD7124

Dependents:   cn0398-helloworld

Fork of CN0398 by Analog Devices

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 Oct 24 15:27:31 2016 +0000
Revision:
0:d6b384fb3c16
Child:
2:f1b9c875e725
Initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adisuciu 0:d6b384fb3c16 1 #include "CN0398.h"
adisuciu 0:d6b384fb3c16 2 #include "AD7124.h"
adisuciu 0:d6b384fb3c16 3 #include <mbed.h>
adisuciu 0:d6b384fb3c16 4
adisuciu 0:d6b384fb3c16 5 #define RREF (5000.0)
adisuciu 0:d6b384fb3c16 6 #define TEMP_GAIN (16.0)
adisuciu 0:d6b384fb3c16 7 #define PT100_RESISTANCE_TO_TEMP(x) ((x-100.0)/(0.385))
adisuciu 0:d6b384fb3c16 8 #define _2_23 (1<<23)
adisuciu 0:d6b384fb3c16 9
adisuciu 0:d6b384fb3c16 10 #define CALIBRATION_NR_OF_SAMPLES (5)
adisuciu 0:d6b384fb3c16 11
adisuciu 0:d6b384fb3c16 12 extern Serial pc;
adisuciu 0:d6b384fb3c16 13
adisuciu 0:d6b384fb3c16 14 #define ms_delay (1)
adisuciu 0:d6b384fb3c16 15
adisuciu 0:d6b384fb3c16 16 CN0398::CN0398(PinName cs, PinName adp7118enable) : ad7124(cs), ADP7118Enable(adp7118enable), offset_voltage(default_offset_voltage)
adisuciu 0:d6b384fb3c16 17 {
adisuciu 0:d6b384fb3c16 18 calibration_ph[0][0] = default_calibration_ph[0][0];
adisuciu 0:d6b384fb3c16 19 calibration_ph[0][1] = default_calibration_ph[0][1];
adisuciu 0:d6b384fb3c16 20 calibration_ph[1][0] = default_calibration_ph[1][0];
adisuciu 0:d6b384fb3c16 21 calibration_ph[1][1] = default_calibration_ph[1][1];
adisuciu 0:d6b384fb3c16 22 solution0 = 0;
adisuciu 0:d6b384fb3c16 23 solution1 = 0;
adisuciu 0:d6b384fb3c16 24 }
adisuciu 0:d6b384fb3c16 25
adisuciu 0:d6b384fb3c16 26 void CN0398::calibrate_ph_pt0(float temperature)
adisuciu 0:d6b384fb3c16 27 {
adisuciu 0:d6b384fb3c16 28 float volt = 0;
adisuciu 0:d6b384fb3c16 29 for(int i = 0; i < CALIBRATION_NR_OF_SAMPLES; i++) {
adisuciu 0:d6b384fb3c16 30 set_digital_output(P2, true);
adisuciu 0:d6b384fb3c16 31 int32_t data = read_channel(0);
adisuciu 0:d6b384fb3c16 32 set_digital_output(P2, false);
adisuciu 0:d6b384fb3c16 33 volt += data_to_voltage_bipolar(data >> 8, 1, 3.3);
adisuciu 0:d6b384fb3c16 34 }
adisuciu 0:d6b384fb3c16 35 volt = volt / CALIBRATION_NR_OF_SAMPLES;
adisuciu 0:d6b384fb3c16 36 if(temperature < 0) {
adisuciu 0:d6b384fb3c16 37 calibration_ph[0][0] = ph_temp_lut[solution0][0];
adisuciu 0:d6b384fb3c16 38 } else {
adisuciu 0:d6b384fb3c16 39 for(uint8_t i = 1; i < NUMBER_OF_TEMPERATURE_ENTRIES; i++) {
adisuciu 0:d6b384fb3c16 40 if(temperature > ph_temperatures[i - 1] && temperature <= ph_temperatures[i]) {
adisuciu 0:d6b384fb3c16 41 calibration_ph[0][0] = ph_temp_lut[solution0][i];
adisuciu 0:d6b384fb3c16 42 break;
adisuciu 0:d6b384fb3c16 43 }
adisuciu 0:d6b384fb3c16 44 }
adisuciu 0:d6b384fb3c16 45 }
adisuciu 0:d6b384fb3c16 46 calibration_ph[0][1] = volt;
adisuciu 0:d6b384fb3c16 47 pc.printf("Calibration solution 1 ph: %f with sensor voltage of %f\r\n", calibration_ph[0][0], volt);
adisuciu 0:d6b384fb3c16 48 }
adisuciu 0:d6b384fb3c16 49 void CN0398::calibrate_ph_pt1(float temperature)
adisuciu 0:d6b384fb3c16 50 {
adisuciu 0:d6b384fb3c16 51 float volt = 0;
adisuciu 0:d6b384fb3c16 52 for(int i = 0; i < CALIBRATION_NR_OF_SAMPLES; i++) {
adisuciu 0:d6b384fb3c16 53 set_digital_output(P2, true);
adisuciu 0:d6b384fb3c16 54 int32_t data = read_channel(0);
adisuciu 0:d6b384fb3c16 55 set_digital_output(P2, false);
adisuciu 0:d6b384fb3c16 56 volt += data_to_voltage_bipolar(data >> 8, 1, 3.3);
adisuciu 0:d6b384fb3c16 57 }
adisuciu 0:d6b384fb3c16 58
adisuciu 0:d6b384fb3c16 59 volt = volt / CALIBRATION_NR_OF_SAMPLES;
adisuciu 0:d6b384fb3c16 60 if(temperature < 0) {
adisuciu 0:d6b384fb3c16 61 calibration_ph[1][0] = ph_temp_lut[solution1][0];
adisuciu 0:d6b384fb3c16 62 } else {
adisuciu 0:d6b384fb3c16 63 for(uint8_t i = 1; i < NUMBER_OF_TEMPERATURE_ENTRIES; i++) {
adisuciu 0:d6b384fb3c16 64 if(temperature > ph_temperatures[i - 1] && temperature <= ph_temperatures[i]) {
adisuciu 0:d6b384fb3c16 65 calibration_ph[1][0] = ph_temp_lut[solution1][i];
adisuciu 0:d6b384fb3c16 66 break;
adisuciu 0:d6b384fb3c16 67 }
adisuciu 0:d6b384fb3c16 68 }
adisuciu 0:d6b384fb3c16 69 }
adisuciu 0:d6b384fb3c16 70 calibration_ph[1][1] = volt;
adisuciu 0:d6b384fb3c16 71 pc.printf("Calibration solution 2 ph: %f with sensor voltage of %f\r\n", calibration_ph[1][0], volt);
adisuciu 0:d6b384fb3c16 72 }
adisuciu 0:d6b384fb3c16 73
adisuciu 0:d6b384fb3c16 74 void CN0398::calibrate_ph_offset()
adisuciu 0:d6b384fb3c16 75 {
adisuciu 0:d6b384fb3c16 76 float volt = 0;
adisuciu 0:d6b384fb3c16 77 for(int i = 0; i < CALIBRATION_NR_OF_SAMPLES; i++) {
adisuciu 0:d6b384fb3c16 78 set_digital_output(P2, true);
adisuciu 0:d6b384fb3c16 79 int32_t data = read_channel(0);
adisuciu 0:d6b384fb3c16 80 set_digital_output(P2, false);
adisuciu 0:d6b384fb3c16 81 volt += data_to_voltage_bipolar(data >> 8, 1, 3.3);
adisuciu 0:d6b384fb3c16 82 }
adisuciu 0:d6b384fb3c16 83 offset_voltage = volt / CALIBRATION_NR_OF_SAMPLES;
adisuciu 0:d6b384fb3c16 84 pc.printf("Offset voltage is: %f \r\n", volt);
adisuciu 0:d6b384fb3c16 85 }
adisuciu 0:d6b384fb3c16 86
adisuciu 0:d6b384fb3c16 87
adisuciu 0:d6b384fb3c16 88 float CN0398::read_rtd()
adisuciu 0:d6b384fb3c16 89 {
adisuciu 0:d6b384fb3c16 90 float temperature = 25.0;
adisuciu 0:d6b384fb3c16 91 #ifdef TEMPERATURE_SENSOR_PRESENT
adisuciu 0:d6b384fb3c16 92 int32_t data = read_channel(2);
adisuciu 0:d6b384fb3c16 93 data = (data >> 8) & 0x00ffffff;
adisuciu 0:d6b384fb3c16 94 float resistance = ((static_cast<float>(data) - _2_23) * RREF) / (TEMP_GAIN * _2_23);
adisuciu 0:d6b384fb3c16 95 #ifdef USE_LINEAR_TEMP_EQ
adisuciu 0:d6b384fb3c16 96 temperature = PT100_RESISTANCE_TO_TEMP(resistance);
adisuciu 0:d6b384fb3c16 97 #else
adisuciu 0:d6b384fb3c16 98
adisuciu 0:d6b384fb3c16 99 #define A (3.9083*pow(10,-3))
adisuciu 0:d6b384fb3c16 100 #define B (-5.775*pow(10,-7))
adisuciu 0:d6b384fb3c16 101 /*if(resistance < 100.0)
adisuciu 0:d6b384fb3c16 102 temperature = -242.02 + 2.228 * resistance + (2.5859 * pow(10, -3)) * pow(resistance, 2) - (48260 * pow(10, -6)) * pow(resistance, 3) - (2.8183 * pow(10, -3)) * pow(resistance, 4) + (1.5243 * pow(10, -10)) * pow(resistance, 5);
adisuciu 0:d6b384fb3c16 103 else*/
adisuciu 0:d6b384fb3c16 104 temperature = ((-A + sqrt(double(pow(A, 2) - 4 * B * (1 - resistance / 100.0))) ) / (2 * B));
adisuciu 0:d6b384fb3c16 105 #endif
adisuciu 0:d6b384fb3c16 106 #endif
adisuciu 0:d6b384fb3c16 107 return temperature;
adisuciu 0:d6b384fb3c16 108
adisuciu 0:d6b384fb3c16 109 }
adisuciu 0:d6b384fb3c16 110
adisuciu 0:d6b384fb3c16 111 int32_t CN0398::read_channel(uint8_t ch)
adisuciu 0:d6b384fb3c16 112 {
adisuciu 0:d6b384fb3c16 113 int32_t data;
adisuciu 0:d6b384fb3c16 114 enable_channel(ch);
adisuciu 0:d6b384fb3c16 115 start_single_conversion();
adisuciu 0:d6b384fb3c16 116
adisuciu 0:d6b384fb3c16 117 if (ad7124.WaitForConvReady(10000) == -3) {
adisuciu 0:d6b384fb3c16 118 pc.printf("TIMEOUT");
adisuciu 0:d6b384fb3c16 119 return -1;
adisuciu 0:d6b384fb3c16 120 }
adisuciu 0:d6b384fb3c16 121 ad7124.ReadData(&data);
adisuciu 0:d6b384fb3c16 122 disable_channel(ch);
adisuciu 0:d6b384fb3c16 123 return data;
adisuciu 0:d6b384fb3c16 124
adisuciu 0:d6b384fb3c16 125 }
adisuciu 0:d6b384fb3c16 126 float CN0398::read_ph(float temperature)
adisuciu 0:d6b384fb3c16 127 {
adisuciu 0:d6b384fb3c16 128 float ph = 0;
adisuciu 0:d6b384fb3c16 129 #ifdef PH_SENSOR_PRESENT
adisuciu 0:d6b384fb3c16 130 set_digital_output(P2, true);
adisuciu 0:d6b384fb3c16 131 int32_t data = read_channel(0);
adisuciu 0:d6b384fb3c16 132 set_digital_output(P2, false);
adisuciu 0:d6b384fb3c16 133 float volt = data_to_voltage_bipolar(data >> 8, 1, 3.3);
adisuciu 0:d6b384fb3c16 134 #ifdef DEBUG_MODE
adisuciu 0:d6b384fb3c16 135 pc.printf("pH sensor voltage - %f\n", volt);
adisuciu 0:d6b384fb3c16 136 #endif
adisuciu 0:d6b384fb3c16 137
adisuciu 0:d6b384fb3c16 138 if(use_nernst) {
adisuciu 0:d6b384fb3c16 139 ph = -((volt - ZERO_POINT_TOLERANCE) / ((2.303 * AVOGADRO * (temperature + KELVIN_OFFSET)) / FARADAY_CONSTANT) ) + PH_ISO;
adisuciu 0:d6b384fb3c16 140 } else {
adisuciu 0:d6b384fb3c16 141 float m = (calibration_ph[1][0] - calibration_ph[0][0]) / (calibration_ph[1][1] - calibration_ph[0][1]);
adisuciu 0:d6b384fb3c16 142 ph = m * (volt - calibration_ph[1][1] + offset_voltage) + calibration_ph[1][0];
adisuciu 0:d6b384fb3c16 143 }
adisuciu 0:d6b384fb3c16 144 #endif
adisuciu 0:d6b384fb3c16 145 return ph;
adisuciu 0:d6b384fb3c16 146 }
adisuciu 0:d6b384fb3c16 147 float CN0398::read_moist()
adisuciu 0:d6b384fb3c16 148 {
adisuciu 0:d6b384fb3c16 149 float moisture = 0;
adisuciu 0:d6b384fb3c16 150 #ifdef MOISTURE_SENSOR_PRESENT
adisuciu 0:d6b384fb3c16 151 ADP7118Enable = true;
adisuciu 0:d6b384fb3c16 152 set_digital_output(P3, true);
adisuciu 0:d6b384fb3c16 153 wait_ms(SENSOR_SETTLING_TIME);
adisuciu 0:d6b384fb3c16 154 int32_t data = read_channel(1);
adisuciu 0:d6b384fb3c16 155 ADP7118Enable = false;
adisuciu 0:d6b384fb3c16 156 set_digital_output(P3, false);
adisuciu 0:d6b384fb3c16 157
adisuciu 0:d6b384fb3c16 158 data = (data >> 8) & 0x00ffffff;
adisuciu 0:d6b384fb3c16 159 float volt = data_to_voltage(data, 1, 3.3);
adisuciu 0:d6b384fb3c16 160 #ifdef USE_MANUFACTURER_MOISTURE_EQ
adisuciu 0:d6b384fb3c16 161 if(volt <= 1.1) {
adisuciu 0:d6b384fb3c16 162 moisture = 10 * volt - 1;
adisuciu 0:d6b384fb3c16 163 } else if(volt > 1.1 && volt <= 1.3) {
adisuciu 0:d6b384fb3c16 164 moisture = 25 * volt - 17.5;
adisuciu 0:d6b384fb3c16 165 } else if(volt > 1.3 && volt <= 1.82) {
adisuciu 0:d6b384fb3c16 166 moisture = 48.08 * volt - 47.5;
adisuciu 0:d6b384fb3c16 167 } else if(volt > 1.82) {
adisuciu 0:d6b384fb3c16 168 moisture = 26.32 * volt - 7.89;
adisuciu 0:d6b384fb3c16 169 }
adisuciu 0:d6b384fb3c16 170 #else
adisuciu 0:d6b384fb3c16 171 moisture = -1.18467 + 21.5371 * volt - 110.996 * (pow(volt, 2)) + 397.025 * (pow(volt, 3)) - 666.986 * (pow(volt, 4)) + 569.236 * (pow(volt, 5)) - 246.005 * (pow(volt, 6)) + 49.4867 * (pow(volt, 7)) - 3.37077 * (pow(volt, 8));
adisuciu 0:d6b384fb3c16 172 #endif
adisuciu 0:d6b384fb3c16 173 if(moisture > 100) moisture = 100;
adisuciu 0:d6b384fb3c16 174 if(moisture < 0 ) moisture = 0;
adisuciu 0:d6b384fb3c16 175 #endif
adisuciu 0:d6b384fb3c16 176 return moisture;
adisuciu 0:d6b384fb3c16 177 }
adisuciu 0:d6b384fb3c16 178
adisuciu 0:d6b384fb3c16 179 float CN0398::data_to_voltage_bipolar(uint32_t data, uint8_t gain, float VREF)
adisuciu 0:d6b384fb3c16 180 {
adisuciu 0:d6b384fb3c16 181 data = data & 0xFFFFFF;
adisuciu 0:d6b384fb3c16 182 return ((data / static_cast<float>(0xFFFFFF / 2)) - 1) * (VREF / gain);
adisuciu 0:d6b384fb3c16 183 }
adisuciu 0:d6b384fb3c16 184
adisuciu 0:d6b384fb3c16 185 float CN0398::data_to_voltage(uint32_t data, uint8_t gain, float VREF)
adisuciu 0:d6b384fb3c16 186 {
adisuciu 0:d6b384fb3c16 187 data = data & 0xFFFFFF;
adisuciu 0:d6b384fb3c16 188 return (data / static_cast<float>(0xFFFFFF)) * (VREF / gain);
adisuciu 0:d6b384fb3c16 189 }
adisuciu 0:d6b384fb3c16 190
adisuciu 0:d6b384fb3c16 191 void CN0398::enable_channel(int channel)
adisuciu 0:d6b384fb3c16 192 {
adisuciu 0:d6b384fb3c16 193 AD7124::ad7124_registers regNr = static_cast<AD7124::ad7124_registers> (AD7124::AD7124_Channel_0 + channel); //Select ADC_Control register
adisuciu 0:d6b384fb3c16 194 uint32_t setValue = ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 195 setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
adisuciu 0:d6b384fb3c16 196 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 197 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 198 wait_ms(ms_delay);
adisuciu 0:d6b384fb3c16 199 }
adisuciu 0:d6b384fb3c16 200
adisuciu 0:d6b384fb3c16 201 void CN0398::disable_channel(int channel)
adisuciu 0:d6b384fb3c16 202 {
adisuciu 0:d6b384fb3c16 203 AD7124::ad7124_registers regNr = static_cast<AD7124::ad7124_registers> (AD7124::AD7124_Channel_0 + channel); //Select ADC_Control register
adisuciu 0:d6b384fb3c16 204 uint32_t setValue = ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 205 setValue &= (~(uint32_t) AD7124_CH_MAP_REG_CH_ENABLE); //Enable channel0
adisuciu 0:d6b384fb3c16 206 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 207 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 208 wait_ms(ms_delay);
adisuciu 0:d6b384fb3c16 209 }
adisuciu 0:d6b384fb3c16 210
adisuciu 0:d6b384fb3c16 211 /*
adisuciu 0:d6b384fb3c16 212 void CN0398::enable_current_source0(int current_source_channel)
adisuciu 0:d6b384fb3c16 213 {
adisuciu 0:d6b384fb3c16 214 AD7124::ad7124_registers regNr = AD7124::AD7124_IOCon1; //Select ADC_Control register
adisuciu 0:d6b384fb3c16 215 uint32_t setValue = ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 216 setValue &= ~(AD7124_IO_CTRL1_REG_IOUT_CH0(0xF));
adisuciu 0:d6b384fb3c16 217 setValue |= AD7124_IO_CTRL1_REG_IOUT_CH0(current_source_channel);// set IOUT0 current to 500uA
adisuciu 0:d6b384fb3c16 218 setValue &= 0xFFFFFF;
adisuciu 0:d6b384fb3c16 219 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 220 wait_ms(ms_delay);
adisuciu 0:d6b384fb3c16 221 }
adisuciu 0:d6b384fb3c16 222
adisuciu 0:d6b384fb3c16 223 void CN0398::enable_current_source1(int current_source_channel)
adisuciu 0:d6b384fb3c16 224 {
adisuciu 0:d6b384fb3c16 225 AD7124::ad7124_registers regNr = AD7124::AD7124_IOCon1; //Select ADC_Control register
adisuciu 0:d6b384fb3c16 226 uint32_t setValue = ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 227 setValue &= ~(AD7124_IO_CTRL1_REG_IOUT_CH1(0xF));
adisuciu 0:d6b384fb3c16 228 setValue |= AD7124_IO_CTRL1_REG_IOUT_CH1(current_source_channel);// set IOUT0 current to 500uA
adisuciu 0:d6b384fb3c16 229 setValue &= 0xFFFFFF;
adisuciu 0:d6b384fb3c16 230 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 231 wait_ms(ms_delay);
adisuciu 0:d6b384fb3c16 232 }*/
adisuciu 0:d6b384fb3c16 233
adisuciu 0:d6b384fb3c16 234 void CN0398::set_digital_output(ad_digital_output_t p, bool state)
adisuciu 0:d6b384fb3c16 235 {
adisuciu 0:d6b384fb3c16 236 AD7124::ad7124_registers regNr = AD7124::AD7124_IOCon1; //Select ADC_Control register
adisuciu 0:d6b384fb3c16 237 uint32_t setValue = ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 238 if(state)
adisuciu 0:d6b384fb3c16 239 setValue |= ((AD7124_8_IO_CTRL1_REG_GPIO_DAT1) << p);
adisuciu 0:d6b384fb3c16 240 else
adisuciu 0:d6b384fb3c16 241 setValue &= (~((AD7124_8_IO_CTRL1_REG_GPIO_DAT1) << p));
adisuciu 0:d6b384fb3c16 242 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 243 wait_ms(ms_delay);
adisuciu 0:d6b384fb3c16 244 }
adisuciu 0:d6b384fb3c16 245
adisuciu 0:d6b384fb3c16 246
adisuciu 0:d6b384fb3c16 247 void CN0398::start_single_conversion()
adisuciu 0:d6b384fb3c16 248 {
adisuciu 0:d6b384fb3c16 249 AD7124::ad7124_registers regNr = AD7124::AD7124_ADC_Control; //Select ADC_Control register
adisuciu 0:d6b384fb3c16 250 uint32_t setValue = ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 251 setValue &= 0xFFC3;
adisuciu 0:d6b384fb3c16 252 setValue |= 0x04; //single conversion;
adisuciu 0:d6b384fb3c16 253 setValue |= AD7124_ADC_CTRL_REG_DATA_STATUS;
adisuciu 0:d6b384fb3c16 254 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 255 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC*/
adisuciu 0:d6b384fb3c16 256 wait_ms(ms_delay * 10);
adisuciu 0:d6b384fb3c16 257 }
adisuciu 0:d6b384fb3c16 258
adisuciu 0:d6b384fb3c16 259 void CN0398::reset()
adisuciu 0:d6b384fb3c16 260 {
adisuciu 0:d6b384fb3c16 261 ad7124.frequency(500000);
adisuciu 0:d6b384fb3c16 262 ad7124.Reset();
adisuciu 0:d6b384fb3c16 263 pc.printf("Reseted AD7124\r\n");
adisuciu 0:d6b384fb3c16 264 wait_ms(1000);
adisuciu 0:d6b384fb3c16 265 }
adisuciu 0:d6b384fb3c16 266
adisuciu 0:d6b384fb3c16 267 void CN0398::setup()
adisuciu 0:d6b384fb3c16 268 {
adisuciu 0:d6b384fb3c16 269 ad7124.Setup();
adisuciu 0:d6b384fb3c16 270 }
adisuciu 0:d6b384fb3c16 271
adisuciu 0:d6b384fb3c16 272 void CN0398::init()
adisuciu 0:d6b384fb3c16 273 {
adisuciu 0:d6b384fb3c16 274 uint32_t setValue;
adisuciu 0:d6b384fb3c16 275 enum AD7124::ad7124_registers regNr;
adisuciu 0:d6b384fb3c16 276
adisuciu 0:d6b384fb3c16 277 /* Set Config_0 0x19*/
adisuciu 0:d6b384fb3c16 278 regNr = AD7124::AD7124_Config_0; //Select Config_0 register - pH
adisuciu 0:d6b384fb3c16 279 setValue = 0;//ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 280 setValue |= AD7124_CFG_REG_BIPOLAR; //Select bipolar operation
adisuciu 0:d6b384fb3c16 281 setValue |= AD7124_CFG_REG_BURNOUT(0); //Burnout current source off
adisuciu 0:d6b384fb3c16 282 setValue |= AD7124_CFG_REG_REF_BUFP;
adisuciu 0:d6b384fb3c16 283 setValue |= AD7124_CFG_REG_REF_BUFM;
adisuciu 0:d6b384fb3c16 284 setValue |= AD7124_CFG_REG_AIN_BUFP; //Buffer AIN5
adisuciu 0:d6b384fb3c16 285 setValue |= AD7124_CFG_REG_AINN_BUFM; //Buffer AIN4
adisuciu 0:d6b384fb3c16 286 setValue |= AD7124_CFG_REG_REF_SEL(0); //REFIN1(+)/REFIN1(−).
adisuciu 0:d6b384fb3c16 287 setValue |= AD7124_CFG_REG_PGA(0);
adisuciu 0:d6b384fb3c16 288 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 289 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 290
adisuciu 0:d6b384fb3c16 291 /* Set Config_0 0x1A*/
adisuciu 0:d6b384fb3c16 292 regNr = AD7124::AD7124_Config_1; //Select Config_1 register - Moisture
adisuciu 0:d6b384fb3c16 293 setValue = 0;//ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 294 setValue &= ~AD7124_CFG_REG_BIPOLAR; //Select bipolar operation
adisuciu 0:d6b384fb3c16 295 setValue |= AD7124_CFG_REG_BURNOUT(0); //Burnout current source off
adisuciu 0:d6b384fb3c16 296 setValue |= AD7124_CFG_REG_REF_BUFP;
adisuciu 0:d6b384fb3c16 297 setValue |= AD7124_CFG_REG_REF_BUFM;
adisuciu 0:d6b384fb3c16 298 setValue |= AD7124_CFG_REG_AIN_BUFP; //Buffer AIN5
adisuciu 0:d6b384fb3c16 299 setValue |= AD7124_CFG_REG_AINN_BUFM; //Buffer AIN4*/
adisuciu 0:d6b384fb3c16 300 setValue |= AD7124_CFG_REG_REF_SEL(0); // REFIN1(+)/REFIN1(−).
adisuciu 0:d6b384fb3c16 301 setValue |= AD7124_CFG_REG_PGA(0);
adisuciu 0:d6b384fb3c16 302 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 303 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 304
adisuciu 0:d6b384fb3c16 305 /* Set Config_0 0x1B*/
adisuciu 0:d6b384fb3c16 306 regNr = AD7124::AD7124_Config_2; //Select Config_2 register - temp
adisuciu 0:d6b384fb3c16 307 setValue = 0;//ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 308 setValue |= AD7124_CFG_REG_BIPOLAR; //Select bipolar operation
adisuciu 0:d6b384fb3c16 309 setValue |= AD7124_CFG_REG_BURNOUT(0); //Burnout current source off
adisuciu 0:d6b384fb3c16 310 setValue |= AD7124_CFG_REG_REF_BUFP;
adisuciu 0:d6b384fb3c16 311 setValue |= AD7124_CFG_REG_REF_BUFM;
adisuciu 0:d6b384fb3c16 312 setValue |= AD7124_CFG_REG_AIN_BUFP; //Buffer AIN5
adisuciu 0:d6b384fb3c16 313 setValue |= AD7124_CFG_REG_AINN_BUFM; //Buffer AIN4
adisuciu 0:d6b384fb3c16 314 setValue |= AD7124_CFG_REG_REF_SEL(1); //REFIN2(+)/REFIN2(-).
adisuciu 0:d6b384fb3c16 315 setValue |= AD7124_CFG_REG_PGA(4); // gain 16
adisuciu 0:d6b384fb3c16 316 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 317 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 318
adisuciu 0:d6b384fb3c16 319 /* Set Channel_0 register 0x09*/
adisuciu 0:d6b384fb3c16 320 regNr = AD7124::AD7124_Channel_0; // pH reading
adisuciu 0:d6b384fb3c16 321 setValue = 0;
adisuciu 0:d6b384fb3c16 322 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
adisuciu 0:d6b384fb3c16 323 setValue |= AD7124_CH_MAP_REG_AINP(6); // Set AIN4 as positive input
adisuciu 0:d6b384fb3c16 324 setValue |= AD7124_CH_MAP_REG_AINM(7); // Set AIN5 as negative input
adisuciu 0:d6b384fb3c16 325 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 326 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 327
adisuciu 0:d6b384fb3c16 328 regNr = AD7124::AD7124_Channel_1; // Moisture
adisuciu 0:d6b384fb3c16 329 setValue = 0;
adisuciu 0:d6b384fb3c16 330 setValue |= AD7124_CH_MAP_REG_SETUP(1); // Select setup0
adisuciu 0:d6b384fb3c16 331 setValue |= AD7124_CH_MAP_REG_AINP(8); // Set AIN4 as positive input
adisuciu 0:d6b384fb3c16 332 setValue |= AD7124_CH_MAP_REG_AINM(19); // Set AIN5 as negative input
adisuciu 0:d6b384fb3c16 333 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 334 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 335
adisuciu 0:d6b384fb3c16 336 regNr = AD7124::AD7124_Channel_2; // RTD - gain 16
adisuciu 0:d6b384fb3c16 337 setValue = 0;
adisuciu 0:d6b384fb3c16 338 setValue |= AD7124_CH_MAP_REG_SETUP(2); // Select setup0
adisuciu 0:d6b384fb3c16 339 setValue |= AD7124_CH_MAP_REG_AINP(9); // Set AIN4 as positive input
adisuciu 0:d6b384fb3c16 340 setValue |= AD7124_CH_MAP_REG_AINM(10); // Set AIN5 as negative input
adisuciu 0:d6b384fb3c16 341 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 342 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 343
adisuciu 0:d6b384fb3c16 344 /* Set IO_Control_1 0x03 */
adisuciu 0:d6b384fb3c16 345 regNr = AD7124::AD7124_IOCon1; //Select IO_Control_1 register
adisuciu 0:d6b384fb3c16 346 //setValue = ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 347 setValue = 0;
adisuciu 0:d6b384fb3c16 348 setValue |= AD7124_8_IO_CTRL1_REG_GPIO_CTRL2; // enable AIN3 as digital output
adisuciu 0:d6b384fb3c16 349 setValue |= AD7124_8_IO_CTRL1_REG_GPIO_CTRL3; // enable AIN4 as digital output
adisuciu 0:d6b384fb3c16 350 setValue |= AD7124_IO_CTRL1_REG_IOUT_CH0(11); // source ain11
adisuciu 0:d6b384fb3c16 351 setValue |= AD7124_IO_CTRL1_REG_IOUT_CH1(12); // source ain12
adisuciu 0:d6b384fb3c16 352 setValue |= AD7124_IO_CTRL1_REG_IOUT0(0x4);// set IOUT0 current to 500uA
adisuciu 0:d6b384fb3c16 353 setValue |= AD7124_IO_CTRL1_REG_IOUT1(0x4);// set IOUT0 current to 500uA*/
adisuciu 0:d6b384fb3c16 354 setValue &= 0xFFFFFF;
adisuciu 0:d6b384fb3c16 355 ad7124.WriteDeviceRegister(regNr, setValue);// Write data to ADC
adisuciu 0:d6b384fb3c16 356
adisuciu 0:d6b384fb3c16 357 // Set IO_Control_2
adisuciu 0:d6b384fb3c16 358 regNr = AD7124::AD7124_IOCon2; //Select IO_Control_2 register
adisuciu 0:d6b384fb3c16 359 setValue = 0;
adisuciu 0:d6b384fb3c16 360 setValue |= AD7124_8_IO_CTRL2_REG_GPIO_VBIAS7; // enable AIN3 as digital output
adisuciu 0:d6b384fb3c16 361 setValue &= 0xFFFFFF;
adisuciu 0:d6b384fb3c16 362 ad7124.WriteDeviceRegister(regNr, setValue);// Write data to ADC
adisuciu 0:d6b384fb3c16 363
adisuciu 0:d6b384fb3c16 364
adisuciu 0:d6b384fb3c16 365 /* Set ADC_Control 0x01 */
adisuciu 0:d6b384fb3c16 366 regNr = AD7124::AD7124_ADC_Control; //Select ADC_Control register
adisuciu 0:d6b384fb3c16 367 setValue = ad7124.ReadDeviceRegister(regNr);
adisuciu 0:d6b384fb3c16 368 setValue |= AD7124_ADC_CTRL_REG_DATA_STATUS; // set data status bit in order to check on which channel the conversion is
adisuciu 0:d6b384fb3c16 369 setValue &= 0xFFC3; // remove prev mode bits
adisuciu 0:d6b384fb3c16 370 setValue |= AD7124_ADC_CTRL_REG_MODE(2);
adisuciu 0:d6b384fb3c16 371 setValue &= 0xFFFF;
adisuciu 0:d6b384fb3c16 372 ad7124.WriteDeviceRegister(regNr, setValue); // Write data to ADC
adisuciu 0:d6b384fb3c16 373 wait_ms(ms_delay);
adisuciu 0:d6b384fb3c16 374 }
adisuciu 0:d6b384fb3c16 375
adisuciu 0:d6b384fb3c16 376
adisuciu 0:d6b384fb3c16 377
adisuciu 0:d6b384fb3c16 378
adisuciu 0:d6b384fb3c16 379