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 "AD7124_Diag.h"
Adrian Suciu 33:c3ec596a29c2 52
Adrian Suciu 33:c3ec596a29c2 53 #include "../../../libraries/Thermocouple/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
Adrian Suciu 33:c3ec596a29c2 61 AD7124_Diag::AD7124_Diag(AD7124& ad) :
Adrian Suciu 33:c3ec596a29c2 62 dut(ad)
Adrian Suciu 33:c3ec596a29c2 63 {
Adrian Suciu 33:c3ec596a29c2 64
Adrian Suciu 33:c3ec596a29c2 65 }
Adrian Suciu 33:c3ec596a29c2 66
Adrian Suciu 33:c3ec596a29c2 67 void AD7124_Diag::setup()
Adrian Suciu 33:c3ec596a29c2 68 {
Adrian Suciu 33:c3ec596a29c2 69 dut.frequency(500000);
Adrian Suciu 33:c3ec596a29c2 70 dut.Setup();
Adrian Suciu 33:c3ec596a29c2 71 }
Adrian Suciu 33:c3ec596a29c2 72
Adrian Suciu 33:c3ec596a29c2 73 void AD7124_Diag::mvpInit()
Adrian Suciu 33:c3ec596a29c2 74 {
Adrian Suciu 33:c3ec596a29c2 75 uint32_t setValue;
Adrian Suciu 33:c3ec596a29c2 76 enum AD7124::ad7124_registers regNr;
Adrian Suciu 33:c3ec596a29c2 77 dut.frequency(500000);
Adrian Suciu 33:c3ec596a29c2 78
Adrian Suciu 33:c3ec596a29c2 79 /* Set Config_0 0x19*/
Adrian Suciu 33:c3ec596a29c2 80 regNr = AD7124::AD7124_Config_0; //Select Config_0 register
Adrian Suciu 33:c3ec596a29c2 81 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 82 setValue |= AD7124_CFG_REG_BIPOLAR; //Select bipolar operation
Adrian Suciu 33:c3ec596a29c2 83 setValue |= AD7124_CFG_REG_BURNOUT(0); //Burnout current source off
Adrian Suciu 33:c3ec596a29c2 84 setValue |= AD7124_CFG_REG_REF_BUFP;
Adrian Suciu 33:c3ec596a29c2 85 setValue |= AD7124_CFG_REG_REF_BUFM;
Adrian Suciu 33:c3ec596a29c2 86 setValue |= AD7124_CFG_REG_AIN_BUFP; //Buffer AIN5
Adrian Suciu 33:c3ec596a29c2 87 setValue |= AD7124_CFG_REG_AINN_BUFM; //Buffer AIN4
Adrian Suciu 33:c3ec596a29c2 88 setValue |= AD7124_CFG_REG_REF_SEL(2); //Select REFIN1(+)/REFIN1(-) internal reference
Adrian Suciu 33:c3ec596a29c2 89 setValue |= AD7124_CFG_REG_PGA(0);
Adrian Suciu 33:c3ec596a29c2 90 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 91 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 92
Adrian Suciu 33:c3ec596a29c2 93 /* Set Channel_0 register 0x09*/
Adrian Suciu 33:c3ec596a29c2 94 regNr = AD7124::AD7124_Channel_0;
Adrian Suciu 33:c3ec596a29c2 95 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 96 //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 97 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
Adrian Suciu 33:c3ec596a29c2 98 setValue |= AD7124_CH_MAP_REG_AINP(0); // Set AIN4 as positive input
Adrian Suciu 33:c3ec596a29c2 99 setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input
Adrian Suciu 33:c3ec596a29c2 100 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 101 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 102
Adrian Suciu 33:c3ec596a29c2 103 regNr = AD7124::AD7124_Channel_1;
Adrian Suciu 33:c3ec596a29c2 104 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 105 //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 106 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
Adrian Suciu 33:c3ec596a29c2 107 setValue |= AD7124_CH_MAP_REG_AINP(1); // Set AIN4 as positive input
Adrian Suciu 33:c3ec596a29c2 108 setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input
Adrian Suciu 33:c3ec596a29c2 109 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 110 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 111
Adrian Suciu 33:c3ec596a29c2 112 regNr = AD7124::AD7124_Channel_2;
Adrian Suciu 33:c3ec596a29c2 113 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 114 //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 115 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
Adrian Suciu 33:c3ec596a29c2 116 setValue |= AD7124_CH_MAP_REG_AINP(2); // Set AIN4 as positive input
Adrian Suciu 33:c3ec596a29c2 117 setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input
Adrian Suciu 33:c3ec596a29c2 118 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 119 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 120
Adrian Suciu 33:c3ec596a29c2 121 regNr = AD7124::AD7124_Channel_3;
Adrian Suciu 33:c3ec596a29c2 122 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 123 //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 124 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
Adrian Suciu 33:c3ec596a29c2 125 setValue |= AD7124_CH_MAP_REG_AINP(3); // Set AIN4 as positive input
Adrian Suciu 33:c3ec596a29c2 126 setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input
Adrian Suciu 33:c3ec596a29c2 127 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 128 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 129
Adrian Suciu 33:c3ec596a29c2 130 regNr = AD7124::AD7124_Channel_4;
Adrian Suciu 33:c3ec596a29c2 131 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 132 //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 133 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
Adrian Suciu 33:c3ec596a29c2 134 setValue |= AD7124_CH_MAP_REG_AINP(4); // Set AIN4 as positive input
Adrian Suciu 33:c3ec596a29c2 135 setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input
Adrian Suciu 33:c3ec596a29c2 136 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 137 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 138
Adrian Suciu 33:c3ec596a29c2 139
Adrian Suciu 33:c3ec596a29c2 140 regNr = AD7124::AD7124_Channel_5;
Adrian Suciu 33:c3ec596a29c2 141 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 142 //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 143 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
Adrian Suciu 33:c3ec596a29c2 144 setValue |= AD7124_CH_MAP_REG_AINP(5); // Set AIN4 as positive input
Adrian Suciu 33:c3ec596a29c2 145 setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input
Adrian Suciu 33:c3ec596a29c2 146 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 147 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 148
Adrian Suciu 33:c3ec596a29c2 149
Adrian Suciu 33:c3ec596a29c2 150 regNr = AD7124::AD7124_Channel_6;
Adrian Suciu 33:c3ec596a29c2 151 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 152 //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 153 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
Adrian Suciu 33:c3ec596a29c2 154 setValue |= AD7124_CH_MAP_REG_AINP(6); // Set AIN4 as positive input
Adrian Suciu 33:c3ec596a29c2 155 setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input
Adrian Suciu 33:c3ec596a29c2 156 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 157 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 158
Adrian Suciu 33:c3ec596a29c2 159 regNr = AD7124::AD7124_Channel_7;
Adrian Suciu 33:c3ec596a29c2 160 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 161 //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 162 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
Adrian Suciu 33:c3ec596a29c2 163 setValue |= AD7124_CH_MAP_REG_AINP(7); // Set AIN4 as positive input
Adrian Suciu 33:c3ec596a29c2 164 setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input
Adrian Suciu 33:c3ec596a29c2 165 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 166 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 167
Adrian Suciu 33:c3ec596a29c2 168 regNr = AD7124::AD7124_Channel_8;
Adrian Suciu 33:c3ec596a29c2 169 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 170 //setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 171 setValue |= AD7124_CH_MAP_REG_SETUP(0); // Select setup0
Adrian Suciu 33:c3ec596a29c2 172 setValue |= AD7124_CH_MAP_REG_AINP(14); // Set AIN4 as positive input
Adrian Suciu 33:c3ec596a29c2 173 setValue |= AD7124_CH_MAP_REG_AINM(15); // Set AIN5 as negative input
Adrian Suciu 33:c3ec596a29c2 174 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 175 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 176
Adrian Suciu 33:c3ec596a29c2 177
Adrian Suciu 33:c3ec596a29c2 178 /* Set Config_0 0x19*/
Adrian Suciu 33:c3ec596a29c2 179 #if 0
Adrian Suciu 33:c3ec596a29c2 180 regNr = AD7124::AD7124_Config_1; //Select Config_0 register
Adrian Suciu 33:c3ec596a29c2 181 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 182 setValue |= AD7124_CFG_REG_BIPOLAR; //Select bipolar operation
Adrian Suciu 33:c3ec596a29c2 183 setValue |= AD7124_CFG_REG_BURNOUT(0); //Burnout current source off
Adrian Suciu 33:c3ec596a29c2 184 setValue |= AD7124_CFG_REG_REF_BUFP;
Adrian Suciu 33:c3ec596a29c2 185 setValue |= AD7124_CFG_REG_REF_BUFM;
Adrian Suciu 33:c3ec596a29c2 186 setValue |= AD7124_CFG_REG_AIN_BUFP; //Buffer AIN5
Adrian Suciu 33:c3ec596a29c2 187 setValue |= AD7124_CFG_REG_AINN_BUFM; //Buffer AIN4
Adrian Suciu 33:c3ec596a29c2 188 setValue |= AD7124_CFG_REG_REF_SEL(2); //Select REFIN1(+)/REFIN1(-) internal reference
Adrian Suciu 33:c3ec596a29c2 189 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 190 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 191 #endif
Adrian Suciu 33:c3ec596a29c2 192
Adrian Suciu 33:c3ec596a29c2 193 #ifdef CALIBRATION
Adrian Suciu 33:c3ec596a29c2 194 // start calibration
Adrian Suciu 33:c3ec596a29c2 195 regNr = AD7124::AD7124_Offset_0;
Adrian Suciu 33:c3ec596a29c2 196 setValue = 0x800000;
Adrian Suciu 33:c3ec596a29c2 197 dut.WriteDeviceRegister(regNr, setValue);// Write data to ADC
Adrian Suciu 33:c3ec596a29c2 198
Adrian Suciu 33:c3ec596a29c2 199 // internal fullscale before zero scale
Adrian Suciu 33:c3ec596a29c2 200 pc.printf("\r\n Gain before cali :%x", dut.ReadDeviceRegister(AD7124::AD7124_Gain_0));
Adrian Suciu 33:c3ec596a29c2 201 regNr = AD7124::AD7124_ADC_Control;//Select ADC_Control register
Adrian Suciu 33:c3ec596a29c2 202 setValue = AD7124_ADC_CTRL_REG_MODE(6);
Adrian Suciu 33:c3ec596a29c2 203 setValue |= AD7124_ADC_CTRL_REG_REF_EN;
Adrian Suciu 33:c3ec596a29c2 204 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 205 dut.WriteDeviceRegister(regNr, setValue);// Write data to ADC
Adrian Suciu 33:c3ec596a29c2 206 //dut.WaitForConvReady(10000);
Adrian Suciu 33:c3ec596a29c2 207 wait_ms(2000);
Adrian Suciu 33:c3ec596a29c2 208
Adrian Suciu 33:c3ec596a29c2 209 pc.printf("\r\n Gain:%x", dut.ReadDeviceRegister(AD7124::AD7124_Gain_0));
Adrian Suciu 33:c3ec596a29c2 210
Adrian Suciu 33:c3ec596a29c2 211 pc.printf("\r\n Offset before cali:%x", dut.ReadDeviceRegister(AD7124::AD7124_Offset_0));
Adrian Suciu 33:c3ec596a29c2 212 // internal zeroscale
Adrian Suciu 33:c3ec596a29c2 213 regNr = AD7124::AD7124_ADC_Control;//Select ADC_Control register
Adrian Suciu 33:c3ec596a29c2 214 setValue = AD7124_ADC_CTRL_REG_MODE(5);
Adrian Suciu 33:c3ec596a29c2 215 setValue |= AD7124_ADC_CTRL_REG_REF_EN;
Adrian Suciu 33:c3ec596a29c2 216 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 217 dut.WriteDeviceRegister(regNr, setValue);// Write data to ADC
Adrian Suciu 33:c3ec596a29c2 218 wait_ms(2000);
Adrian Suciu 33:c3ec596a29c2 219 pc.printf("\r\n Offset:%x\r\n", dut.ReadDeviceRegister(AD7124::AD7124_Offset_0));
Adrian Suciu 33:c3ec596a29c2 220
Adrian Suciu 33:c3ec596a29c2 221 // end of calibration
Adrian Suciu 33:c3ec596a29c2 222
Adrian Suciu 33:c3ec596a29c2 223 #endif
Adrian Suciu 33:c3ec596a29c2 224
Adrian Suciu 33:c3ec596a29c2 225 /* Set IO_Control_1 0x03 */
Adrian Suciu 33:c3ec596a29c2 226 regNr = AD7124::AD7124_IOCon1; //Select IO_Control_1 register
Adrian Suciu 33:c3ec596a29c2 227 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 228 setValue |= AD7124_IO_CTRL1_REG_IOUT0(0x4);// set IOUT0 current to 500uA
Adrian Suciu 33:c3ec596a29c2 229 setValue |= AD7124_IO_CTRL1_REG_IOUT_CH0(0x1);
Adrian Suciu 33:c3ec596a29c2 230 setValue &= 0xFFFFFF;
Adrian Suciu 33:c3ec596a29c2 231 dut.WriteDeviceRegister(regNr, setValue);// Write data to ADC
Adrian Suciu 33:c3ec596a29c2 232 #if 0
Adrian Suciu 33:c3ec596a29c2 233 setValue = 0;
Adrian Suciu 33:c3ec596a29c2 234 regNr = AD7124::AD7124_Channel_1;
Adrian Suciu 33:c3ec596a29c2 235
Adrian Suciu 33:c3ec596a29c2 236 /* Set Channel_1 register 0x0A*/
Adrian Suciu 33:c3ec596a29c2 237
Adrian Suciu 33:c3ec596a29c2 238 setValue = dut.ReadDeviceRegister( regNr );
Adrian Suciu 33:c3ec596a29c2 239 setValue |= (uint32_t)AD7124_CH_MAP_REG_CH_ENABLE;//Enable channel1
Adrian Suciu 33:c3ec596a29c2 240 setValue |= AD7124_CH_MAP_REG_SETUP(1);// Select setup1
Adrian Suciu 33:c3ec596a29c2 241 setValue |= AD7124_CH_MAP_REG_AINP(2);// Set AIN2 as positive input
Adrian Suciu 33:c3ec596a29c2 242 setValue |= AD7124_CH_MAP_REG_AINM(1);// Set AIN1 as negative input
Adrian Suciu 33:c3ec596a29c2 243 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 244 dut.WriteDeviceRegister(regNr, setValue);// Write data to ADC
Adrian Suciu 33:c3ec596a29c2 245
Adrian Suciu 33:c3ec596a29c2 246 /* Set Config_1 0x1A*/
Adrian Suciu 33:c3ec596a29c2 247 regNr = AD7124::AD7124_Config_1; //Select Config_1 register
Adrian Suciu 33:c3ec596a29c2 248 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 249 setValue |= AD7124_CFG_REG_BIPOLAR;//Select bipolar operation
Adrian Suciu 33:c3ec596a29c2 250 setValue |= AD7124_CFG_REG_BURNOUT(0);//Burnout current source off
Adrian Suciu 33:c3ec596a29c2 251 setValue |= AD7124_CFG_REG_REF_BUFP;
Adrian Suciu 33:c3ec596a29c2 252 setValue |= AD7124_CFG_REG_REF_BUFM;
Adrian Suciu 33:c3ec596a29c2 253 setValue |= AD7124_CFG_REG_AIN_BUFP;//Buffer AIN2
Adrian Suciu 33:c3ec596a29c2 254 setValue |= AD7124_CFG_REG_AINN_BUFM;//Buffer AIN1
Adrian Suciu 33:c3ec596a29c2 255 setValue |= AD7124_CFG_REG_REF_SEL(2);//Select internal reference
Adrian Suciu 33:c3ec596a29c2 256 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 257 dut.WriteDeviceRegister(regNr, setValue);// Write data to ADC
Adrian Suciu 33:c3ec596a29c2 258 #endif
Adrian Suciu 33:c3ec596a29c2 259
Adrian Suciu 33:c3ec596a29c2 260 /* Set ADC_Control 0x01 */
Adrian Suciu 33:c3ec596a29c2 261 regNr = AD7124::AD7124_ADC_Control; //Select ADC_Control register
Adrian Suciu 33:c3ec596a29c2 262 setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 263 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 264 setValue |= AD7124_ADC_CTRL_REG_REF_EN;
Adrian Suciu 33:c3ec596a29c2 265 setValue &= 0xFFC3;
Adrian Suciu 33:c3ec596a29c2 266 setValue |= AD7124_ADC_CTRL_REG_MODE(1);
Adrian Suciu 33:c3ec596a29c2 267 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 268 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 269 }
Adrian Suciu 33:c3ec596a29c2 270
Adrian Suciu 33:c3ec596a29c2 271 void AD7124_Diag::write_reg()
Adrian Suciu 33:c3ec596a29c2 272 {
Adrian Suciu 33:c3ec596a29c2 273 uint8_t reg = strtol(cmdbuffer[1].c_str(), NULL, 16);
Adrian Suciu 33:c3ec596a29c2 274 uint32_t regData = strtol(cmdbuffer[2].c_str(), NULL, 16);
Adrian Suciu 33:c3ec596a29c2 275 //dut.write_reg(reg, regData);
Adrian Suciu 33:c3ec596a29c2 276 dut.WriteDeviceRegister(static_cast<AD7124::ad7124_registers>(reg),
Adrian Suciu 33:c3ec596a29c2 277 regData);
Adrian Suciu 33:c3ec596a29c2 278 pc.printf("Wrote mode");
Adrian Suciu 33:c3ec596a29c2 279 }
Adrian Suciu 33:c3ec596a29c2 280 void AD7124_Diag::read_reg()
Adrian Suciu 33:c3ec596a29c2 281 {
Adrian Suciu 33:c3ec596a29c2 282 uint8_t regVal = strtol(cmdbuffer[1].c_str(), NULL, 16);
Adrian Suciu 33:c3ec596a29c2 283 pc.printf("Mode reg: %x ",
Adrian Suciu 33:c3ec596a29c2 284 dut.ReadDeviceRegister(
Adrian Suciu 33:c3ec596a29c2 285 static_cast<AD7124::ad7124_registers>(regVal)));
Adrian Suciu 33:c3ec596a29c2 286 }
Adrian Suciu 33:c3ec596a29c2 287 void AD7124_Diag::reset()
Adrian Suciu 33:c3ec596a29c2 288 {
Adrian Suciu 33:c3ec596a29c2 289 dut.frequency(500000);
Adrian Suciu 33:c3ec596a29c2 290 dut.Reset();
Adrian Suciu 33:c3ec596a29c2 291 pc.printf("Reseted AD7124");
Adrian Suciu 33:c3ec596a29c2 292 }
Adrian Suciu 33:c3ec596a29c2 293
Adrian Suciu 33:c3ec596a29c2 294 float AD7124_Diag::data_to_voltage(uint32_t data)
Adrian Suciu 33:c3ec596a29c2 295 {
Adrian Suciu 33:c3ec596a29c2 296 data = data & 0xFFFFFF;
Adrian Suciu 33:c3ec596a29c2 297 return ((data / static_cast<float>(0xFFFFFF / 2)) - 1) * (2.5 / 1);
Adrian Suciu 33:c3ec596a29c2 298 }
Adrian Suciu 33:c3ec596a29c2 299
Adrian Suciu 33:c3ec596a29c2 300 void AD7124_Diag::enable_channel(int channel)
Adrian Suciu 33:c3ec596a29c2 301 {
Adrian Suciu 33:c3ec596a29c2 302 AD7124::ad7124_registers regNr = static_cast<AD7124::ad7124_registers> (AD7124::AD7124_Channel_0 + channel); //Select ADC_Control register
Adrian Suciu 33:c3ec596a29c2 303 uint32_t setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 304 setValue |= (uint32_t) AD7124_CH_MAP_REG_CH_ENABLE; //Enable channel0
Adrian Suciu 33:c3ec596a29c2 305 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 306 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 307 }
Adrian Suciu 33:c3ec596a29c2 308
Adrian Suciu 33:c3ec596a29c2 309 void AD7124_Diag::disable_channel(int channel)
Adrian Suciu 33:c3ec596a29c2 310 {
Adrian Suciu 33:c3ec596a29c2 311 AD7124::ad7124_registers regNr = static_cast<AD7124::ad7124_registers> (AD7124::AD7124_Channel_0 + channel); //Select ADC_Control register
Adrian Suciu 33:c3ec596a29c2 312 uint32_t setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 313 setValue &= (~(uint32_t) AD7124_CH_MAP_REG_CH_ENABLE); //Enable channel0
Adrian Suciu 33:c3ec596a29c2 314 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 315 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 316 }
Adrian Suciu 33:c3ec596a29c2 317
Adrian Suciu 33:c3ec596a29c2 318 void AD7124_Diag::enable_current_source(int current_source_channel)
Adrian Suciu 33:c3ec596a29c2 319 {
Adrian Suciu 33:c3ec596a29c2 320 AD7124::ad7124_registers regNr = AD7124::AD7124_IOCon1; //Select ADC_Control register
Adrian Suciu 33:c3ec596a29c2 321 uint32_t setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 322 setValue &= ~(AD7124_IO_CTRL1_REG_IOUT_CH0(0xF));
Adrian Suciu 33:c3ec596a29c2 323 setValue |= AD7124_IO_CTRL1_REG_IOUT_CH0(current_source_channel);// set IOUT0 current to 500uA
Adrian Suciu 33:c3ec596a29c2 324 setValue &= 0xFFFFFF;
Adrian Suciu 33:c3ec596a29c2 325
Adrian Suciu 33:c3ec596a29c2 326 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC
Adrian Suciu 33:c3ec596a29c2 327 pc.printf("Enabled 500uA current source on channel %d\r\n", current_source_channel);
Adrian Suciu 33:c3ec596a29c2 328 }
Adrian Suciu 33:c3ec596a29c2 329
Adrian Suciu 33:c3ec596a29c2 330
Adrian Suciu 33:c3ec596a29c2 331 #define R2 (1600.0)
Adrian Suciu 33:c3ec596a29c2 332 #define RTD_SLOPE (15/39.0)
Adrian Suciu 33:c3ec596a29c2 333 #define RTD_CONSTANT (1039.0)
Adrian Suciu 33:c3ec596a29c2 334 #define RTD_CONVERSION(R1) RTD_SLOPE * (R1-RTD_CONSTANT)
Adrian Suciu 33:c3ec596a29c2 335 float convert_rtd(float volt, float current)
Adrian Suciu 33:c3ec596a29c2 336 {
Adrian Suciu 33:c3ec596a29c2 337 float R1 = (volt / current) - R2;
Adrian Suciu 33:c3ec596a29c2 338 float temp = RTD_CONVERSION(R1);
Adrian Suciu 33:c3ec596a29c2 339 pc.printf("Resistance of RTD is: %f\r\n", R1);
Adrian Suciu 33:c3ec596a29c2 340 pc.printf("Temperature is: %f\r\n", temp);
Adrian Suciu 33:c3ec596a29c2 341 // pc.printf("mV equivalent(poly method) of thermocouple is %f \r\n",Thermocouple_Type_E::convert_inv(temp));
Adrian Suciu 33:c3ec596a29c2 342 // pc.printf("mV equivalent(lut method) of thermocouple is %f \r\n",Thermocouple_Type_E::lookup_inv(temp));
Adrian Suciu 33:c3ec596a29c2 343
Adrian Suciu 33:c3ec596a29c2 344 return 0;
Adrian Suciu 33:c3ec596a29c2 345 }
Adrian Suciu 33:c3ec596a29c2 346
Adrian Suciu 33:c3ec596a29c2 347 float cal_current(float volt, float current)
Adrian Suciu 33:c3ec596a29c2 348 {
Adrian Suciu 33:c3ec596a29c2 349 float cal_current = volt / R2;
Adrian Suciu 33:c3ec596a29c2 350 pc.printf("Calibrated current = %f mA \r\n", (cal_current * 1000.0));
Adrian Suciu 33:c3ec596a29c2 351 return cal_current;
Adrian Suciu 33:c3ec596a29c2 352 }
Adrian Suciu 33:c3ec596a29c2 353
Adrian Suciu 33:c3ec596a29c2 354 float dummy(float volt, float current)
Adrian Suciu 33:c3ec596a29c2 355 {
Adrian Suciu 33:c3ec596a29c2 356 /* Nothing to do */
Adrian Suciu 33:c3ec596a29c2 357 return volt;
Adrian Suciu 33:c3ec596a29c2 358 }
Adrian Suciu 33:c3ec596a29c2 359
Adrian Suciu 33:c3ec596a29c2 360 float convert_thermocouple_e(float volt, float current)
Adrian Suciu 33:c3ec596a29c2 361 {
Adrian Suciu 33:c3ec596a29c2 362 float mv = volt * 1000;
Adrian Suciu 33:c3ec596a29c2 363 pc.printf("Voltage in mv = %f\r\n", mv);
Adrian Suciu 33:c3ec596a29c2 364 // pc.printf("Temperature(lookup) in celsius = %f\r\n", Thermocouple_Type_E::lookup(mv));
Adrian Suciu 33:c3ec596a29c2 365 // pc.printf("Temperature(poly) in celsius = %f\r\n\r\n", Thermocouple_Type_E::convert(mv));
Adrian Suciu 33:c3ec596a29c2 366 return 0;
Adrian Suciu 33:c3ec596a29c2 367 }
Adrian Suciu 33:c3ec596a29c2 368
Adrian Suciu 33:c3ec596a29c2 369 float convert_thermocouple_k(float volt, float current)
Adrian Suciu 33:c3ec596a29c2 370 {
Adrian Suciu 33:c3ec596a29c2 371 float mv = volt * 1000;
Adrian Suciu 33:c3ec596a29c2 372 pc.printf("Voltage in mv = %f\r\n", mv);
Adrian Suciu 33:c3ec596a29c2 373 // pc.printf("Temperature(lookup) in celsius = %f\r\n", Thermocouple_Type_K::lookup(mv));
Adrian Suciu 33:c3ec596a29c2 374 // pc.printf("Temperature(poly) in celsius = %f\r\n\r\n", Thermocouple_Type_K::convert(mv));
Adrian Suciu 33:c3ec596a29c2 375 return 0;
Adrian Suciu 33:c3ec596a29c2 376 }
Adrian Suciu 33:c3ec596a29c2 377
Adrian Suciu 33:c3ec596a29c2 378
Adrian Suciu 33:c3ec596a29c2 379 float (*conversion_fkt[9])(float volt, float current) = {convert_thermocouple_e, convert_rtd, convert_thermocouple_k, convert_rtd, dummy, convert_rtd, dummy, convert_rtd, cal_current};
Adrian Suciu 33:c3ec596a29c2 380 float conversion_results[9];
Adrian Suciu 33:c3ec596a29c2 381
Adrian Suciu 33:c3ec596a29c2 382 void AD7124_Diag::start_single_conversion()
Adrian Suciu 33:c3ec596a29c2 383 {
Adrian Suciu 33:c3ec596a29c2 384 AD7124::ad7124_registers regNr = AD7124::AD7124_ADC_Control; //Select ADC_Control register
Adrian Suciu 33:c3ec596a29c2 385 uint32_t setValue = dut.ReadDeviceRegister(regNr);
Adrian Suciu 33:c3ec596a29c2 386 setValue &= 0xFFC3;
Adrian Suciu 33:c3ec596a29c2 387 setValue |= 0x04; //single conversion;
Adrian Suciu 33:c3ec596a29c2 388 setValue |= 0x1600;
Adrian Suciu 33:c3ec596a29c2 389 setValue &= 0xFFFF;
Adrian Suciu 33:c3ec596a29c2 390 dut.WriteDeviceRegister(regNr, setValue); // Write data to ADC*/
Adrian Suciu 33:c3ec596a29c2 391 wait_ms(1);
Adrian Suciu 33:c3ec596a29c2 392 }
Adrian Suciu 33:c3ec596a29c2 393
Adrian Suciu 33:c3ec596a29c2 394 void AD7124_Diag::read_data()
Adrian Suciu 33:c3ec596a29c2 395 {
Adrian Suciu 33:c3ec596a29c2 396 int32_t data;
Adrian Suciu 33:c3ec596a29c2 397 float volt;
Adrian Suciu 33:c3ec596a29c2 398 float cal_current = 0;
Adrian Suciu 33:c3ec596a29c2 399
Adrian Suciu 33:c3ec596a29c2 400 for(int i = 0; i < 8; i++) {
Adrian Suciu 33:c3ec596a29c2 401 if(i % 2 == 0) {
Adrian Suciu 33:c3ec596a29c2 402 //enable_current_source(i+1);
Adrian Suciu 33:c3ec596a29c2 403 } else {
Adrian Suciu 33:c3ec596a29c2 404 enable_current_source(i);
Adrian Suciu 33:c3ec596a29c2 405 enable_channel(8); // calibration channel
Adrian Suciu 33:c3ec596a29c2 406 start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 407 if (dut.WaitForConvReady(10000) == -3) {
Adrian Suciu 33:c3ec596a29c2 408 pc.printf("TIMEOUT");
Adrian Suciu 33:c3ec596a29c2 409 return;
Adrian Suciu 33:c3ec596a29c2 410 }
Adrian Suciu 33:c3ec596a29c2 411
Adrian Suciu 33:c3ec596a29c2 412 dut.ReadData(&data);
Adrian Suciu 33:c3ec596a29c2 413 disable_channel(8);
Adrian Suciu 33:c3ec596a29c2 414
Adrian Suciu 33:c3ec596a29c2 415 pc.printf("Channel: %d\r\n", data & 0xff);
Adrian Suciu 33:c3ec596a29c2 416 pc.printf("Data reg: %x \r\n", data);
Adrian Suciu 33:c3ec596a29c2 417 volt = data_to_voltage(data >> 8);
Adrian Suciu 33:c3ec596a29c2 418 pc.printf("Voltage = %f\r\n", volt);
Adrian Suciu 33:c3ec596a29c2 419 cal_current = conversion_fkt[8](volt, 0);
Adrian Suciu 33:c3ec596a29c2 420 conversion_results[8] = cal_current;
Adrian Suciu 33:c3ec596a29c2 421
Adrian Suciu 33:c3ec596a29c2 422 }
Adrian Suciu 33:c3ec596a29c2 423
Adrian Suciu 33:c3ec596a29c2 424 enable_channel(i);
Adrian Suciu 33:c3ec596a29c2 425 start_single_conversion();
Adrian Suciu 33:c3ec596a29c2 426
Adrian Suciu 33:c3ec596a29c2 427
Adrian Suciu 33:c3ec596a29c2 428 if (dut.WaitForConvReady(10000) == -3) {
Adrian Suciu 33:c3ec596a29c2 429 pc.printf("TIMEOUT");
Adrian Suciu 33:c3ec596a29c2 430 return;
Adrian Suciu 33:c3ec596a29c2 431 }
Adrian Suciu 33:c3ec596a29c2 432
Adrian Suciu 33:c3ec596a29c2 433 dut.ReadData(&data);
Adrian Suciu 33:c3ec596a29c2 434
Adrian Suciu 33:c3ec596a29c2 435 disable_channel(i);
Adrian Suciu 33:c3ec596a29c2 436
Adrian Suciu 33:c3ec596a29c2 437
Adrian Suciu 33:c3ec596a29c2 438 pc.printf("Channel: %d\r\n", data & 0xff);
Adrian Suciu 33:c3ec596a29c2 439 pc.printf("Data reg: %x \r\n", data);
Adrian Suciu 33:c3ec596a29c2 440 volt = data_to_voltage(data >> 8);
Adrian Suciu 33:c3ec596a29c2 441 pc.printf("Voltage = %f\r\n", volt);
Adrian Suciu 33:c3ec596a29c2 442 conversion_results[i] = conversion_fkt[i](volt, cal_current);
Adrian Suciu 33:c3ec596a29c2 443 pc.printf("\r\n");
Adrian Suciu 33:c3ec596a29c2 444
Adrian Suciu 33:c3ec596a29c2 445 }
Adrian Suciu 33:c3ec596a29c2 446 }
Adrian Suciu 33:c3ec596a29c2 447
Adrian Suciu 33:c3ec596a29c2 448 void AD7124_Diag::read_volt()
Adrian Suciu 33:c3ec596a29c2 449 {
Adrian Suciu 33:c3ec596a29c2 450 uint8_t regVal = strtol(cmdbuffer[1].c_str(), NULL, 16);
Adrian Suciu 33:c3ec596a29c2 451 pc.printf("Data reg: %x ",
Adrian Suciu 33:c3ec596a29c2 452 dut.ReadDeviceRegister(
Adrian Suciu 33:c3ec596a29c2 453 static_cast<AD7124::ad7124_registers>(regVal)));
Adrian Suciu 33:c3ec596a29c2 454 }