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 /**
Adrian Suciu 33:c3ec596a29c2 2 * @file ad7124_diag.cpp
Adrian Suciu 33:c3ec596a29c2 3 * @brief Source file for the AD7124 wrapper used by the driver diag
Adrian Suciu 33:c3ec596a29c2 4 * @author Analog Devices Inc.
Adrian Suciu 33:c3ec596a29c2 5 *
Adrian Suciu 33:c3ec596a29c2 6 * For support please go to:
Adrian Suciu 33:c3ec596a29c2 7 * Github: https://github.com/analogdevicesinc/mbed-adi
Adrian Suciu 33:c3ec596a29c2 8 * Support: https://ez.analog.com/community/linux-device-drivers/microcontroller-no-os-drivers
Adrian Suciu 33:c3ec596a29c2 9 * More: https://wiki.analog.com/resources/tools-software/mbed-drivers-all
Adrian Suciu 33:c3ec596a29c2 10
Adrian Suciu 33:c3ec596a29c2 11 ********************************************************************************
Adrian Suciu 33:c3ec596a29c2 12 * Copyright 2016(c) Analog Devices, Inc.
Adrian Suciu 33:c3ec596a29c2 13 *
Adrian Suciu 33:c3ec596a29c2 14 * All rights reserved.
Adrian Suciu 33:c3ec596a29c2 15 *
Adrian Suciu 33:c3ec596a29c2 16 * Redistribution and use in source and binary forms, with or without
Adrian Suciu 33:c3ec596a29c2 17 * modification, are permitted provided that the following conditions are met:
Adrian Suciu 33:c3ec596a29c2 18 * - Redistributions of source code must retain the above copyright
Adrian Suciu 33:c3ec596a29c2 19 * notice, this list of conditions and the following disclaimer.
Adrian Suciu 33:c3ec596a29c2 20 * - Redistributions in binary form must reproduce the above copyright
Adrian Suciu 33:c3ec596a29c2 21 * notice, this list of conditions and the following disclaimer in
Adrian Suciu 33:c3ec596a29c2 22 * the documentation and/or other materials provided with the
Adrian Suciu 33:c3ec596a29c2 23 * distribution.
Adrian Suciu 33:c3ec596a29c2 24 * - Neither the name of Analog Devices, Inc. nor the names of its
Adrian Suciu 33:c3ec596a29c2 25 * contributors may be used to endorse or promote products derived
Adrian Suciu 33:c3ec596a29c2 26 * from this software without specific prior written permission.
Adrian Suciu 33:c3ec596a29c2 27 * - The use of this software may or may not infringe the patent rights
Adrian Suciu 33:c3ec596a29c2 28 * of one or more patent holders. This license does not release you
Adrian Suciu 33:c3ec596a29c2 29 * from the requirement that you obtain separate licenses from these
Adrian Suciu 33:c3ec596a29c2 30 * patent holders to use this software.
Adrian Suciu 33:c3ec596a29c2 31 * - Use of the software either in source or binary form, must be run
Adrian Suciu 33:c3ec596a29c2 32 * on or directly connected to an Analog Devices Inc. component.
Adrian Suciu 33:c3ec596a29c2 33 *
Adrian Suciu 33:c3ec596a29c2 34 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
Adrian Suciu 33:c3ec596a29c2 35 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
Adrian Suciu 33:c3ec596a29c2 36 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Adrian Suciu 33:c3ec596a29c2 37 * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
Adrian Suciu 33:c3ec596a29c2 38 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Adrian Suciu 33:c3ec596a29c2 39 * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
Adrian Suciu 33:c3ec596a29c2 40 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Adrian Suciu 33:c3ec596a29c2 41 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Adrian Suciu 33:c3ec596a29c2 42 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Adrian Suciu 33:c3ec596a29c2 43 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Adrian Suciu 33:c3ec596a29c2 44 *
Adrian Suciu 33:c3ec596a29c2 45 ********************************************************************************/
Adrian Suciu 33:c3ec596a29c2 46
Adrian Suciu 33:c3ec596a29c2 47 #include "mbed.h"
Adrian Suciu 33:c3ec596a29c2 48 #include <stdio.h>
Adrian Suciu 33:c3ec596a29c2 49 #include <vector>
Adrian Suciu 33:c3ec596a29c2 50 #include <string>
Adrian Suciu 33:c3ec596a29c2 51 #include "CN0398_Diag.h"
Adrian Suciu 33:c3ec596a29c2 52
Adrian Suciu 33:c3ec596a29c2 53 #include "Thermocouple.h"
Adrian Suciu 33:c3ec596a29c2 54
Adrian Suciu 33:c3ec596a29c2 55
Adrian Suciu 33:c3ec596a29c2 56 extern Serial pc;
Adrian Suciu 33:c3ec596a29c2 57 extern vector<string> cmdbuffer;
Adrian Suciu 33:c3ec596a29c2 58
Adrian Suciu 33:c3ec596a29c2 59 //#define CALIBRATION
Adrian Suciu 33:c3ec596a29c2 60 #define VH400
Adrian Suciu 33:c3ec596a29c2 61 //#define EC5
Adrian Suciu 33:c3ec596a29c2 62
Adrian Suciu 33:c3ec596a29c2 63
Adrian Suciu 33:c3ec596a29c2 64 CN0398_Diag::CN0398_Diag(CN0398& ad) :
Adrian Suciu 33:c3ec596a29c2 65 dut(ad), offset_voltage(default_offset_voltage)
Adrian Suciu 33:c3ec596a29c2 66 {
Adrian Suciu 33:c3ec596a29c2 67 calibration_ph[0][0] = default_calibration_ph[0][0];
Adrian Suciu 33:c3ec596a29c2 68 calibration_ph[0][1] = default_calibration_ph[0][1];
Adrian Suciu 33:c3ec596a29c2 69 calibration_ph[1][0] = default_calibration_ph[1][0];
Adrian Suciu 33:c3ec596a29c2 70 calibration_ph[1][1] = default_calibration_ph[1][1];
Adrian Suciu 33:c3ec596a29c2 71 }
Adrian Suciu 33:c3ec596a29c2 72
Adrian Suciu 33:c3ec596a29c2 73 void CN0398_Diag::init()
Adrian Suciu 33:c3ec596a29c2 74 {
Adrian Suciu 33:c3ec596a29c2 75 dut.reset();
Adrian Suciu 33:c3ec596a29c2 76 dut.setup();
Adrian Suciu 33:c3ec596a29c2 77 dut.init();
Adrian Suciu 33:c3ec596a29c2 78 }
Adrian Suciu 33:c3ec596a29c2 79
Adrian Suciu 33:c3ec596a29c2 80
Adrian Suciu 33:c3ec596a29c2 81 void CN0398_Diag::write_reg()
Adrian Suciu 33:c3ec596a29c2 82 {
Adrian Suciu 33:c3ec596a29c2 83 uint8_t reg = strtol(cmdbuffer[1].c_str(), NULL, 16);
Adrian Suciu 33:c3ec596a29c2 84 uint32_t regData = strtol(cmdbuffer[2].c_str(), NULL, 16);
Adrian Suciu 33:c3ec596a29c2 85 //dut.write_reg(reg, regData);
Adrian Suciu 33:c3ec596a29c2 86 dut.ad7124.WriteDeviceRegister(static_cast<AD7124::ad7124_registers>(reg),
Adrian Suciu 33:c3ec596a29c2 87 regData);
Adrian Suciu 33:c3ec596a29c2 88 pc.printf("Wrote mode");
Adrian Suciu 33:c3ec596a29c2 89 }
Adrian Suciu 33:c3ec596a29c2 90 void CN0398_Diag::read_reg()
Adrian Suciu 33:c3ec596a29c2 91 {
Adrian Suciu 33:c3ec596a29c2 92 uint8_t regVal = strtol(cmdbuffer[1].c_str(), NULL, 16);
Adrian Suciu 33:c3ec596a29c2 93 pc.printf("Mode reg: %x ",
Adrian Suciu 33:c3ec596a29c2 94 dut.ad7124.ReadDeviceRegister(
Adrian Suciu 33:c3ec596a29c2 95 static_cast<AD7124::ad7124_registers>(regVal)));
Adrian Suciu 33:c3ec596a29c2 96 }
Adrian Suciu 33:c3ec596a29c2 97 void CN0398_Diag::reset()
Adrian Suciu 33:c3ec596a29c2 98 {
Adrian Suciu 33:c3ec596a29c2 99 dut.ad7124.frequency(500000);
Adrian Suciu 33:c3ec596a29c2 100 dut.ad7124.Reset();
Adrian Suciu 33:c3ec596a29c2 101 pc.printf("Reseted AD7124");
Adrian Suciu 33:c3ec596a29c2 102 wait_ms(500);
Adrian Suciu 33:c3ec596a29c2 103 }
Adrian Suciu 33:c3ec596a29c2 104
Adrian Suciu 33:c3ec596a29c2 105 float CN0398_Diag::data_to_voltage(uint32_t data)
Adrian Suciu 33:c3ec596a29c2 106 {
Adrian Suciu 33:c3ec596a29c2 107 data = data & 0xFFFFFF;
Adrian Suciu 33:c3ec596a29c2 108 return ((data / static_cast<float>(0xFFFFFF / 2)) - 1) * (2.5 / 1);
Adrian Suciu 33:c3ec596a29c2 109 }
Adrian Suciu 33:c3ec596a29c2 110
Adrian Suciu 33:c3ec596a29c2 111 void CN0398_Diag::enable_channel(int channel)
Adrian Suciu 33:c3ec596a29c2 112 {
Adrian Suciu 33:c3ec596a29c2 113 dut.enable_channel(channel);
Adrian Suciu 33:c3ec596a29c2 114 }
Adrian Suciu 33:c3ec596a29c2 115
Adrian Suciu 33:c3ec596a29c2 116 void CN0398_Diag::disable_channel(int channel)
Adrian Suciu 33:c3ec596a29c2 117 {
Adrian Suciu 33:c3ec596a29c2 118 dut.disable_channel(channel);
Adrian Suciu 33:c3ec596a29c2 119 }
Adrian Suciu 33:c3ec596a29c2 120
Adrian Suciu 33:c3ec596a29c2 121 void CN0398_Diag::enable_current_source()
Adrian Suciu 33:c3ec596a29c2 122 {
Adrian Suciu 33:c3ec596a29c2 123 dut.enable_current_source0(11);
Adrian Suciu 33:c3ec596a29c2 124 dut.enable_current_source1(12);
Adrian Suciu 33:c3ec596a29c2 125 pc.printf("Enabled 500uA current sources on channel 11, 12\r\n");
Adrian Suciu 33:c3ec596a29c2 126 }
Adrian Suciu 33:c3ec596a29c2 127
Adrian Suciu 33:c3ec596a29c2 128 void CN0398_Diag::toggle_output(int channel, uint8_t state)
Adrian Suciu 33:c3ec596a29c2 129 {
Adrian Suciu 33:c3ec596a29c2 130 dut.set_digital_output(static_cast<CN0398::ad_digital_output_t>(channel), state);
Adrian Suciu 33:c3ec596a29c2 131 }
Adrian Suciu 33:c3ec596a29c2 132
Adrian Suciu 33:c3ec596a29c2 133
Adrian Suciu 33:c3ec596a29c2 134 void CN0398_Diag::readt()
Adrian Suciu 33:c3ec596a29c2 135 {
Adrian Suciu 33:c3ec596a29c2 136
Adrian Suciu 33:c3ec596a29c2 137 //enable_current_source();
Adrian Suciu 33:c3ec596a29c2 138 enable_channel(2);
Adrian Suciu 33:c3ec596a29c2 139 //wait_ms(100);
Adrian Suciu 33:c3ec596a29c2 140 start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 141 //wait_ms(100);
Adrian Suciu 33:c3ec596a29c2 142 if (dut.ad7124.WaitForConvReady(10000) == -3) {
Adrian Suciu 33:c3ec596a29c2 143 pc.printf("TIMEOUT");
Adrian Suciu 33:c3ec596a29c2 144 return;
Adrian Suciu 33:c3ec596a29c2 145 }
Adrian Suciu 33:c3ec596a29c2 146 int32_t data;
Adrian Suciu 33:c3ec596a29c2 147 dut.ad7124.ReadData(&data);
Adrian Suciu 33:c3ec596a29c2 148 disable_channel(2);
Adrian Suciu 33:c3ec596a29c2 149
Adrian Suciu 33:c3ec596a29c2 150 pc.printf("Channel: %d\r\n", data & 0xff);
Adrian Suciu 33:c3ec596a29c2 151 pc.printf("Data reg: %x \r\n", data);
Adrian Suciu 33:c3ec596a29c2 152 float volt = dut.data_to_voltage(data >> 8, 16);
Adrian Suciu 33:c3ec596a29c2 153 pc.printf("Voltage = %f\r\n", volt);
Adrian Suciu 33:c3ec596a29c2 154 data = (data >> 8) & 0x00ffffff;
Adrian Suciu 33:c3ec596a29c2 155 float a1 = (static_cast<float>(data) - (1 << 23));
Adrian Suciu 33:c3ec596a29c2 156 float a2 = a1 * 5000;
Adrian Suciu 33:c3ec596a29c2 157 float a3 = 16.0 * (1 << 23);
Adrian Suciu 33:c3ec596a29c2 158
Adrian Suciu 33:c3ec596a29c2 159 float resistance = a2 / a3; //((data- (1<<23)) * 5000.0) / 16.0*(1<<23) ;
Adrian Suciu 33:c3ec596a29c2 160 pc.printf("Resistance: %f\r\n", resistance);
Adrian Suciu 33:c3ec596a29c2 161 pc.printf("Temperature = %f\r\n", (resistance - 100.0) / 0.385);
Adrian Suciu 33:c3ec596a29c2 162
Adrian Suciu 33:c3ec596a29c2 163 }
Adrian Suciu 33:c3ec596a29c2 164
Adrian Suciu 33:c3ec596a29c2 165 void CN0398_Diag::readm()
Adrian Suciu 33:c3ec596a29c2 166 {
Adrian Suciu 33:c3ec596a29c2 167
Adrian Suciu 33:c3ec596a29c2 168 toggle_output(0, 1);
Adrian Suciu 33:c3ec596a29c2 169 #ifdef EC5
Adrian Suciu 33:c3ec596a29c2 170 wait_ms(10);
Adrian Suciu 33:c3ec596a29c2 171 #endif
Adrian Suciu 33:c3ec596a29c2 172 enable_channel(1);
Adrian Suciu 33:c3ec596a29c2 173 //wait_ms(100);
Adrian Suciu 33:c3ec596a29c2 174 start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 175 //wait_ms(100);
Adrian Suciu 33:c3ec596a29c2 176 if (dut.ad7124.WaitForConvReady(10000) == -3) {
Adrian Suciu 33:c3ec596a29c2 177 pc.printf("TIMEOUT");
Adrian Suciu 33:c3ec596a29c2 178 return;
Adrian Suciu 33:c3ec596a29c2 179 }
Adrian Suciu 33:c3ec596a29c2 180 int32_t data;
Adrian Suciu 33:c3ec596a29c2 181 dut.ad7124.ReadData(&data);
Adrian Suciu 33:c3ec596a29c2 182 disable_channel(1);
Adrian Suciu 33:c3ec596a29c2 183 toggle_output(0, 0);
Adrian Suciu 33:c3ec596a29c2 184
Adrian Suciu 33:c3ec596a29c2 185 pc.printf("Channel: %d\r\n", data & 0xff);
Adrian Suciu 33:c3ec596a29c2 186 pc.printf("Data reg: %x \r\n", data);
Adrian Suciu 33:c3ec596a29c2 187 float volt = dut.data_to_voltage(data >> 8, 16);
Adrian Suciu 33:c3ec596a29c2 188 pc.printf("Voltage = %f\r\n", volt);
Adrian Suciu 33:c3ec596a29c2 189 data = (data >> 8) & 0x00ffffff;
Adrian Suciu 33:c3ec596a29c2 190
Adrian Suciu 33:c3ec596a29c2 191
Adrian Suciu 33:c3ec596a29c2 192 float moisture;
Adrian Suciu 33:c3ec596a29c2 193 #ifdef VH400
Adrian Suciu 33:c3ec596a29c2 194 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));
Adrian Suciu 33:c3ec596a29c2 195 #elif EC5
Adrian Suciu 33:c3ec596a29c2 196 moisture = 0.000992 * (volt * 1000) - 0.45;
Adrian Suciu 33:c3ec596a29c2 197 #endif
Adrian Suciu 33:c3ec596a29c2 198 pc.printf("Moisture = %f\r\n", moisture);
Adrian Suciu 33:c3ec596a29c2 199
Adrian Suciu 33:c3ec596a29c2 200
Adrian Suciu 33:c3ec596a29c2 201
Adrian Suciu 33:c3ec596a29c2 202 }
Adrian Suciu 33:c3ec596a29c2 203
Adrian Suciu 33:c3ec596a29c2 204 void CN0398_Diag::offsetph()
Adrian Suciu 33:c3ec596a29c2 205 {
Adrian Suciu 33:c3ec596a29c2 206 enable_channel(0);
Adrian Suciu 33:c3ec596a29c2 207 //wait_ms(100);
Adrian Suciu 33:c3ec596a29c2 208 start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 209 //wait_ms(100);
Adrian Suciu 33:c3ec596a29c2 210 if (dut.ad7124.WaitForConvReady(10000) == -3) {
Adrian Suciu 33:c3ec596a29c2 211 pc.printf("TIMEOUT");
Adrian Suciu 33:c3ec596a29c2 212 return;
Adrian Suciu 33:c3ec596a29c2 213 }
Adrian Suciu 33:c3ec596a29c2 214 int32_t data;
Adrian Suciu 33:c3ec596a29c2 215 dut.ad7124.ReadData(&data);
Adrian Suciu 33:c3ec596a29c2 216 disable_channel(0);
Adrian Suciu 33:c3ec596a29c2 217 pc.printf("Channel: %d\r\n", data & 0xff);
Adrian Suciu 33:c3ec596a29c2 218 pc.printf("Data reg: %x \r\n", data);
Adrian Suciu 33:c3ec596a29c2 219 float volt = dut.data_to_voltage(data >> 8, 1);
Adrian Suciu 33:c3ec596a29c2 220 pc.printf("Voltage = %f\r\n", volt);
Adrian Suciu 33:c3ec596a29c2 221 offset_voltage = volt;
Adrian Suciu 33:c3ec596a29c2 222
Adrian Suciu 33:c3ec596a29c2 223 }
Adrian Suciu 33:c3ec596a29c2 224
Adrian Suciu 33:c3ec596a29c2 225 void CN0398_Diag::calibp(int point)
Adrian Suciu 33:c3ec596a29c2 226 {
Adrian Suciu 33:c3ec596a29c2 227 calibration_ph[point][0] = strtof(cmdbuffer[1].c_str(), NULL);
Adrian Suciu 33:c3ec596a29c2 228 enable_channel(0);
Adrian Suciu 33:c3ec596a29c2 229 start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 230 if (dut.ad7124.WaitForConvReady(10000) == -3) {
Adrian Suciu 33:c3ec596a29c2 231 pc.printf("TIMEOUT");
Adrian Suciu 33:c3ec596a29c2 232 return;
Adrian Suciu 33:c3ec596a29c2 233 }
Adrian Suciu 33:c3ec596a29c2 234 int32_t data;
Adrian Suciu 33:c3ec596a29c2 235 dut.ad7124.ReadData(&data);
Adrian Suciu 33:c3ec596a29c2 236 disable_channel(0);
Adrian Suciu 33:c3ec596a29c2 237 pc.printf("Channel: %d\r\n", data & 0xff);
Adrian Suciu 33:c3ec596a29c2 238 pc.printf("Data reg: %x \r\n", data);
Adrian Suciu 33:c3ec596a29c2 239 float volt = dut.data_to_voltage(data >> 8, 1);
Adrian Suciu 33:c3ec596a29c2 240 pc.printf("Voltage = %f\r\n", volt);
Adrian Suciu 33:c3ec596a29c2 241 calibration_ph[point][1] = volt;
Adrian Suciu 33:c3ec596a29c2 242
Adrian Suciu 33:c3ec596a29c2 243 }
Adrian Suciu 33:c3ec596a29c2 244 void CN0398_Diag::readp()
Adrian Suciu 33:c3ec596a29c2 245 {
Adrian Suciu 33:c3ec596a29c2 246 enable_channel(0);
Adrian Suciu 33:c3ec596a29c2 247 start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 248 if (dut.ad7124.WaitForConvReady(10000) == -3) {
Adrian Suciu 33:c3ec596a29c2 249 pc.printf("TIMEOUT");
Adrian Suciu 33:c3ec596a29c2 250 return;
Adrian Suciu 33:c3ec596a29c2 251 }
Adrian Suciu 33:c3ec596a29c2 252 int32_t data;
Adrian Suciu 33:c3ec596a29c2 253 dut.ad7124.ReadData(&data);
Adrian Suciu 33:c3ec596a29c2 254 disable_channel(0);
Adrian Suciu 33:c3ec596a29c2 255 pc.printf("Channel: %d\r\n", data & 0xff);
Adrian Suciu 33:c3ec596a29c2 256 pc.printf("Data reg: %x \r\n", data);
Adrian Suciu 33:c3ec596a29c2 257 float volt = dut.data_to_voltage(data >> 8, 1);
Adrian Suciu 33:c3ec596a29c2 258 pc.printf("Voltage = %f\r\n", volt);
Adrian Suciu 33:c3ec596a29c2 259 float m = (calibration_ph[1][0] - calibration_ph[0][0]) / (calibration_ph[1][1] - calibration_ph[0][1]);
Adrian Suciu 33:c3ec596a29c2 260 pc.printf("pH = %f", m * (volt - calibration_ph[1][1]) + calibration_ph[1][0]);
Adrian Suciu 33:c3ec596a29c2 261
Adrian Suciu 33:c3ec596a29c2 262 }
Adrian Suciu 33:c3ec596a29c2 263
Adrian Suciu 33:c3ec596a29c2 264
Adrian Suciu 33:c3ec596a29c2 265 void CN0398_Diag::start_single_conversion()
Adrian Suciu 33:c3ec596a29c2 266 {
Adrian Suciu 33:c3ec596a29c2 267 dut.start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 268 }
Adrian Suciu 33:c3ec596a29c2 269
Adrian Suciu 33:c3ec596a29c2 270 /*void CN0398_Diag::read_data()
Adrian Suciu 33:c3ec596a29c2 271 {
Adrian Suciu 33:c3ec596a29c2 272 int32_t data;
Adrian Suciu 33:c3ec596a29c2 273 float volt;
Adrian Suciu 33:c3ec596a29c2 274 float cal_current = 0;
Adrian Suciu 33:c3ec596a29c2 275
Adrian Suciu 33:c3ec596a29c2 276 for(int i = 0; i < 8; i++) {
Adrian Suciu 33:c3ec596a29c2 277 if(i % 2 == 0) {
Adrian Suciu 33:c3ec596a29c2 278 //enable_current_source(i+1);
Adrian Suciu 33:c3ec596a29c2 279 } else {
Adrian Suciu 33:c3ec596a29c2 280 enable_current_source(i);
Adrian Suciu 33:c3ec596a29c2 281 enable_channel(8); // calibration channel
Adrian Suciu 33:c3ec596a29c2 282 start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 283 if (dut.WaitForConvReady(10000) == -3) {
Adrian Suciu 33:c3ec596a29c2 284 pc.printf("TIMEOUT");
Adrian Suciu 33:c3ec596a29c2 285 return;
Adrian Suciu 33:c3ec596a29c2 286 }
Adrian Suciu 33:c3ec596a29c2 287
Adrian Suciu 33:c3ec596a29c2 288 dut.ReadData(&data);
Adrian Suciu 33:c3ec596a29c2 289 disable_channel(8);
Adrian Suciu 33:c3ec596a29c2 290
Adrian Suciu 33:c3ec596a29c2 291 pc.printf("Channel: %d\r\n", data & 0xff);
Adrian Suciu 33:c3ec596a29c2 292 pc.printf("Data reg: %x \r\n", data);
Adrian Suciu 33:c3ec596a29c2 293 volt = data_to_voltage(data >> 8);
Adrian Suciu 33:c3ec596a29c2 294 pc.printf("Voltage = %f\r\n", volt);
Adrian Suciu 33:c3ec596a29c2 295 cal_current = conversion_fkt[8](volt, 0);
Adrian Suciu 33:c3ec596a29c2 296 conversion_results[8] = cal_current;
Adrian Suciu 33:c3ec596a29c2 297
Adrian Suciu 33:c3ec596a29c2 298 }
Adrian Suciu 33:c3ec596a29c2 299
Adrian Suciu 33:c3ec596a29c2 300 enable_channel(i);
Adrian Suciu 33:c3ec596a29c2 301 start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 302
Adrian Suciu 33:c3ec596a29c2 303
Adrian Suciu 33:c3ec596a29c2 304 if (dut.WaitForConvReady(10000) == -3) {
Adrian Suciu 33:c3ec596a29c2 305 pc.printf("TIMEOUT");
Adrian Suciu 33:c3ec596a29c2 306 return;
Adrian Suciu 33:c3ec596a29c2 307 }
Adrian Suciu 33:c3ec596a29c2 308
Adrian Suciu 33:c3ec596a29c2 309 dut.ReadData(&data);
Adrian Suciu 33:c3ec596a29c2 310
Adrian Suciu 33:c3ec596a29c2 311 disable_channel(i);
Adrian Suciu 33:c3ec596a29c2 312
Adrian Suciu 33:c3ec596a29c2 313
Adrian Suciu 33:c3ec596a29c2 314 pc.printf("Channel: %d\r\n", data & 0xff);
Adrian Suciu 33:c3ec596a29c2 315 pc.printf("Data reg: %x \r\n", data);
Adrian Suciu 33:c3ec596a29c2 316 volt = data_to_voltage(data >> 8);
Adrian Suciu 33:c3ec596a29c2 317 pc.printf("Voltage = %f\r\n", volt);
Adrian Suciu 33:c3ec596a29c2 318 conversion_results[i] = conversion_fkt[i](volt, cal_current);
Adrian Suciu 33:c3ec596a29c2 319 pc.printf("\r\n");
Adrian Suciu 33:c3ec596a29c2 320
Adrian Suciu 33:c3ec596a29c2 321 }
Adrian Suciu 33:c3ec596a29c2 322 }
Adrian Suciu 33:c3ec596a29c2 323
Adrian Suciu 33:c3ec596a29c2 324 void CN0398_Diag::read_volt()
Adrian Suciu 33:c3ec596a29c2 325 {
Adrian Suciu 33:c3ec596a29c2 326 uint8_t regVal = strtol(cmdbuffer[1].c_str(), NULL, 16);
Adrian Suciu 33:c3ec596a29c2 327 pc.printf("Data reg: %x ",
Adrian Suciu 33:c3ec596a29c2 328 dut.ReadDeviceRegister(
Adrian Suciu 33:c3ec596a29c2 329 static_cast<AD7124::ad7124_registers>(regVal)));
Adrian Suciu 33:c3ec596a29c2 330 }
Adrian Suciu 33:c3ec596a29c2 331 */