this is testing

Committer:
pmallick
Date:
Thu Jan 14 18:54:16 2021 +0530
Revision:
0:3afcd581558d
this is testing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pmallick 0:3afcd581558d 1 /***************************************************************************//**
pmallick 0:3afcd581558d 2 * @file AD5933.c
pmallick 0:3afcd581558d 3 * @brief Implementation of AD5933 Driver.
pmallick 0:3afcd581558d 4 * @author DBogdan (dragos.bogdan@analog.com)
pmallick 0:3afcd581558d 5 ********************************************************************************
pmallick 0:3afcd581558d 6 * Copyright 2012(c) Analog Devices, Inc.
pmallick 0:3afcd581558d 7 *
pmallick 0:3afcd581558d 8 * All rights reserved.
pmallick 0:3afcd581558d 9 *
pmallick 0:3afcd581558d 10 * Redistribution and use in source and binary forms, with or without
pmallick 0:3afcd581558d 11 * modification, are permitted provided that the following conditions are met:
pmallick 0:3afcd581558d 12 * - Redistributions of source code must retain the above copyright
pmallick 0:3afcd581558d 13 * notice, this list of conditions and the following disclaimer.
pmallick 0:3afcd581558d 14 * - Redistributions in binary form must reproduce the above copyright
pmallick 0:3afcd581558d 15 * notice, this list of conditions and the following disclaimer in
pmallick 0:3afcd581558d 16 * the documentation and/or other materials provided with the
pmallick 0:3afcd581558d 17 * distribution.
pmallick 0:3afcd581558d 18 * - Neither the name of Analog Devices, Inc. nor the names of its
pmallick 0:3afcd581558d 19 * contributors may be used to endorse or promote products derived
pmallick 0:3afcd581558d 20 * from this software without specific prior written permission.
pmallick 0:3afcd581558d 21 * - The use of this software may or may not infringe the patent rights
pmallick 0:3afcd581558d 22 * of one or more patent holders. This license does not release you
pmallick 0:3afcd581558d 23 * from the requirement that you obtain separate licenses from these
pmallick 0:3afcd581558d 24 * patent holders to use this software.
pmallick 0:3afcd581558d 25 * - Use of the software either in source or binary form, must be run
pmallick 0:3afcd581558d 26 * on or directly connected to an Analog Devices Inc. component.
pmallick 0:3afcd581558d 27 *
pmallick 0:3afcd581558d 28 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
pmallick 0:3afcd581558d 29 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
pmallick 0:3afcd581558d 30 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
pmallick 0:3afcd581558d 31 * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
pmallick 0:3afcd581558d 32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
pmallick 0:3afcd581558d 33 * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
pmallick 0:3afcd581558d 34 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
pmallick 0:3afcd581558d 35 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
pmallick 0:3afcd581558d 36 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
pmallick 0:3afcd581558d 37 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
pmallick 0:3afcd581558d 38 *******************************************************************************/
pmallick 0:3afcd581558d 39
pmallick 0:3afcd581558d 40 /*****************************************************************************/
pmallick 0:3afcd581558d 41 /***************************** Include Files *********************************/
pmallick 0:3afcd581558d 42 /*****************************************************************************/
pmallick 0:3afcd581558d 43 #include <stdint.h>
pmallick 0:3afcd581558d 44 #include <stdlib.h>
pmallick 0:3afcd581558d 45 #include "platform_drivers.h"
pmallick 0:3afcd581558d 46 #include "ad5933.h"
pmallick 0:3afcd581558d 47
pmallick 0:3afcd581558d 48
pmallick 0:3afcd581558d 49 /******************************************************************************/
pmallick 0:3afcd581558d 50 /************************** Constants Definitions *****************************/
pmallick 0:3afcd581558d 51 /******************************************************************************/
pmallick 0:3afcd581558d 52 const int32_t pow_2_27 = 134217728ul; // 2 to the power of 27
pmallick 0:3afcd581558d 53
pmallick 0:3afcd581558d 54 /******************************************************************************/
pmallick 0:3afcd581558d 55 /************************ Functions Definitions *******************************/
pmallick 0:3afcd581558d 56 /******************************************************************************/
pmallick 0:3afcd581558d 57
pmallick 0:3afcd581558d 58 /***************************************************************************//**
pmallick 0:3afcd581558d 59 * @brief Initializes the communication peripheral and the initial Values for
pmallick 0:3afcd581558d 60 * AD5933 Board.
pmallick 0:3afcd581558d 61 *
pmallick 0:3afcd581558d 62 * @param device - The device structure.
pmallick 0:3afcd581558d 63 * @param init_param - The structure that contains the device initial
pmallick 0:3afcd581558d 64 * parameters.
pmallick 0:3afcd581558d 65 *
pmallick 0:3afcd581558d 66 * @return ret - The result of the initialization procedure.
pmallick 0:3afcd581558d 67 * Example: -1 - I2C peripheral was not initialized or the
pmallick 0:3afcd581558d 68 * device is not present.
pmallick 0:3afcd581558d 69 * 0 - I2C peripheral was initialized and the
pmallick 0:3afcd581558d 70 * device is present.
pmallick 0:3afcd581558d 71 *******************************************************************************/
pmallick 0:3afcd581558d 72 int32_t ad5933_init(struct ad5933_dev **device,
pmallick 0:3afcd581558d 73 struct ad5933_init_param init_param)
pmallick 0:3afcd581558d 74 {
pmallick 0:3afcd581558d 75 struct ad5933_dev *dev;
pmallick 0:3afcd581558d 76 int32_t status;
pmallick 0:3afcd581558d 77
pmallick 0:3afcd581558d 78 dev = (struct ad5933_dev *)malloc(sizeof(*dev));
pmallick 0:3afcd581558d 79 if (!dev)
pmallick 0:3afcd581558d 80 return -1;
pmallick 0:3afcd581558d 81
pmallick 0:3afcd581558d 82 dev->current_sys_clk = init_param.current_sys_clk;
pmallick 0:3afcd581558d 83 dev->current_clock_source = init_param.current_clock_source;
pmallick 0:3afcd581558d 84 dev->current_gain = init_param.current_gain;
pmallick 0:3afcd581558d 85 dev->current_range = init_param.current_range;
pmallick 0:3afcd581558d 86 dev->current_settling = init_param.current_settling;
pmallick 0:3afcd581558d 87
pmallick 0:3afcd581558d 88 status = i2c_init(&dev->i2c_desc, &init_param.i2c_init);
pmallick 0:3afcd581558d 89
pmallick 0:3afcd581558d 90 *device = dev;
pmallick 0:3afcd581558d 91
pmallick 0:3afcd581558d 92 return status;
pmallick 0:3afcd581558d 93 }
pmallick 0:3afcd581558d 94
pmallick 0:3afcd581558d 95 /***************************************************************************//**
pmallick 0:3afcd581558d 96 * @brief Free the resources allocated by ad5933_init().
pmallick 0:3afcd581558d 97 *
pmallick 0:3afcd581558d 98 * @param dev - The device structure.
pmallick 0:3afcd581558d 99 *
pmallick 0:3afcd581558d 100 * @return ret - The result of the remove procedure.
pmallick 0:3afcd581558d 101 *******************************************************************************/
pmallick 0:3afcd581558d 102 int32_t ad5933_remove(struct ad5933_dev *dev)
pmallick 0:3afcd581558d 103 {
pmallick 0:3afcd581558d 104 int32_t status;
pmallick 0:3afcd581558d 105
pmallick 0:3afcd581558d 106 status = i2c_remove(dev->i2c_desc);
pmallick 0:3afcd581558d 107
pmallick 0:3afcd581558d 108 free(dev);
pmallick 0:3afcd581558d 109
pmallick 0:3afcd581558d 110 return status;
pmallick 0:3afcd581558d 111 }
pmallick 0:3afcd581558d 112
pmallick 0:3afcd581558d 113 /***************************************************************************//**
pmallick 0:3afcd581558d 114 * @brief Writes data into a register.
pmallick 0:3afcd581558d 115 *
pmallick 0:3afcd581558d 116 * @param dev - The device structure.
pmallick 0:3afcd581558d 117 * @param register_address - Address of the register.
pmallick 0:3afcd581558d 118 * @param register_value - Data value to write.
pmallick 0:3afcd581558d 119 * @param bytes_number - Number of bytes.
pmallick 0:3afcd581558d 120 *
pmallick 0:3afcd581558d 121 * @return None.
pmallick 0:3afcd581558d 122 *******************************************************************************/
pmallick 0:3afcd581558d 123 void ad5933_set_register_value(struct ad5933_dev *dev,
pmallick 0:3afcd581558d 124 uint8_t register_address,
pmallick 0:3afcd581558d 125 uint32_t register_value,
pmallick 0:3afcd581558d 126 uint8_t bytes_number)
pmallick 0:3afcd581558d 127 {
pmallick 0:3afcd581558d 128 uint8_t byte = 0;
pmallick 0:3afcd581558d 129 uint8_t write_data[2] = {0, 0};
pmallick 0:3afcd581558d 130
pmallick 0:3afcd581558d 131 for(byte = 0; byte < bytes_number; byte++) {
pmallick 0:3afcd581558d 132 write_data[0] = register_address + bytes_number - byte - 1;
pmallick 0:3afcd581558d 133 write_data[1] = (uint8_t)((register_value >> (byte * 8)) & 0xFF);
pmallick 0:3afcd581558d 134 i2c_write(dev->i2c_desc, write_data, 2, 1);
pmallick 0:3afcd581558d 135 }
pmallick 0:3afcd581558d 136 }
pmallick 0:3afcd581558d 137
pmallick 0:3afcd581558d 138 /***************************************************************************//**
pmallick 0:3afcd581558d 139 * @brief Reads the value of a register.
pmallick 0:3afcd581558d 140 *
pmallick 0:3afcd581558d 141 * @param dev - The device structure.
pmallick 0:3afcd581558d 142 * @param register_address - Address of the register.
pmallick 0:3afcd581558d 143 * @param bytes_number - Number of bytes.
pmallick 0:3afcd581558d 144 *
pmallick 0:3afcd581558d 145 * @return registerValue - Value of the register.
pmallick 0:3afcd581558d 146 *******************************************************************************/
pmallick 0:3afcd581558d 147 uint32_t ad5933_get_register_value(struct ad5933_dev *dev,
pmallick 0:3afcd581558d 148 uint8_t register_address,
pmallick 0:3afcd581558d 149 uint8_t bytes_number)
pmallick 0:3afcd581558d 150 {
pmallick 0:3afcd581558d 151 uint32_t register_value = 0;
pmallick 0:3afcd581558d 152 uint8_t byte = 0;
pmallick 0:3afcd581558d 153 uint8_t write_data[2] = {0, 0};
pmallick 0:3afcd581558d 154 uint8_t read_data[2] = {0, 0};
pmallick 0:3afcd581558d 155
pmallick 0:3afcd581558d 156 for(byte = 0; byte < bytes_number; byte ++) {
pmallick 0:3afcd581558d 157 /* Set the register pointer. */
pmallick 0:3afcd581558d 158 write_data[0] = AD5933_ADDR_POINTER;
pmallick 0:3afcd581558d 159 write_data[1] = register_address + byte;
pmallick 0:3afcd581558d 160 i2c_write(dev->i2c_desc, write_data, 2, 1);
pmallick 0:3afcd581558d 161 /* Read Register Data. */
pmallick 0:3afcd581558d 162 read_data[0] = 0xFF;
pmallick 0:3afcd581558d 163 i2c_read(dev->i2c_desc, read_data, 1, 1);
pmallick 0:3afcd581558d 164 register_value = register_value << 8;
pmallick 0:3afcd581558d 165 register_value += read_data[0];
pmallick 0:3afcd581558d 166 }
pmallick 0:3afcd581558d 167
pmallick 0:3afcd581558d 168 return register_value;
pmallick 0:3afcd581558d 169 }
pmallick 0:3afcd581558d 170
pmallick 0:3afcd581558d 171 /***************************************************************************//**
pmallick 0:3afcd581558d 172 * @brief Resets the device.
pmallick 0:3afcd581558d 173 *
pmallick 0:3afcd581558d 174 * @param dev - The device structure.
pmallick 0:3afcd581558d 175 *
pmallick 0:3afcd581558d 176 * @return None.
pmallick 0:3afcd581558d 177 *******************************************************************************/
pmallick 0:3afcd581558d 178 void ad5933_reset(struct ad5933_dev *dev)
pmallick 0:3afcd581558d 179 {
pmallick 0:3afcd581558d 180 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 181 AD5933_REG_CONTROL_LB,
pmallick 0:3afcd581558d 182 AD5933_CONTROL_RESET | dev->current_clock_source,
pmallick 0:3afcd581558d 183 1);
pmallick 0:3afcd581558d 184 }
pmallick 0:3afcd581558d 185
pmallick 0:3afcd581558d 186 /***************************************************************************//**
pmallick 0:3afcd581558d 187 * @brief Selects the source of the system clock.
pmallick 0:3afcd581558d 188 *
pmallick 0:3afcd581558d 189 * @param dev - The device structure.
pmallick 0:3afcd581558d 190 * @param clk_source - Selects the source of the system clock.
pmallick 0:3afcd581558d 191 * Example: AD5933_CONTROL_INT_SYSCLK
pmallick 0:3afcd581558d 192 * AD5933_CONTROL_EXT_SYSCLK
pmallick 0:3afcd581558d 193 * @param ext_clk_freq - Frequency value of the external clock, if used.
pmallick 0:3afcd581558d 194 *
pmallick 0:3afcd581558d 195 * @return None.
pmallick 0:3afcd581558d 196 *******************************************************************************/
pmallick 0:3afcd581558d 197 void ad5933_set_system_clk(struct ad5933_dev *dev,
pmallick 0:3afcd581558d 198 int8_t clk_source,
pmallick 0:3afcd581558d 199 uint32_t ext_clk_freq)
pmallick 0:3afcd581558d 200 {
pmallick 0:3afcd581558d 201 dev->current_clock_source = clk_source;
pmallick 0:3afcd581558d 202 if(clk_source == AD5933_CONTROL_EXT_SYSCLK) {
pmallick 0:3afcd581558d 203 dev->current_sys_clk = ext_clk_freq; // External clock frequency
pmallick 0:3afcd581558d 204 } else {
pmallick 0:3afcd581558d 205 dev->current_sys_clk = AD5933_INTERNAL_SYS_CLK; // 16 MHz
pmallick 0:3afcd581558d 206 }
pmallick 0:3afcd581558d 207 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 208 AD5933_REG_CONTROL_LB,
pmallick 0:3afcd581558d 209 dev->current_clock_source,
pmallick 0:3afcd581558d 210 1);
pmallick 0:3afcd581558d 211 }
pmallick 0:3afcd581558d 212
pmallick 0:3afcd581558d 213
pmallick 0:3afcd581558d 214 /***************************************************************************//**
pmallick 0:3afcd581558d 215 * @brief Selects the range and gain of the device.
pmallick 0:3afcd581558d 216 *
pmallick 0:3afcd581558d 217 * @param dev - The device structure.
pmallick 0:3afcd581558d 218 * @param range - Range option.
pmallick 0:3afcd581558d 219 * Example: AD5933_RANGE_2000mVpp
pmallick 0:3afcd581558d 220 * AD5933_RANGE_200mVpp
pmallick 0:3afcd581558d 221 * AD5933_RANGE_400mVpp
pmallick 0:3afcd581558d 222
pmallick 0:3afcd581558d 223 * AD5933_RANGE_1000mVpp
pmallick 0:3afcd581558d 224 * @param gain - Gain option.
pmallick 0:3afcd581558d 225 * Example: AD5933_GAIN_X5
pmallick 0:3afcd581558d 226 * AD5933_GAIN_X1
pmallick 0:3afcd581558d 227 *
pmallick 0:3afcd581558d 228 * @return None.
pmallick 0:3afcd581558d 229 *******************************************************************************/
pmallick 0:3afcd581558d 230 void ad5933_set_range_and_gain(struct ad5933_dev *dev,
pmallick 0:3afcd581558d 231 int8_t range,
pmallick 0:3afcd581558d 232 int8_t gain)
pmallick 0:3afcd581558d 233 {
pmallick 0:3afcd581558d 234 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 235 AD5933_REG_CONTROL_HB,
pmallick 0:3afcd581558d 236 AD5933_CONTROL_FUNCTION(AD5933_FUNCTION_NOP) |
pmallick 0:3afcd581558d 237 AD5933_CONTROL_RANGE(range) |
pmallick 0:3afcd581558d 238 AD5933_CONTROL_PGA_GAIN(gain),
pmallick 0:3afcd581558d 239 1);
pmallick 0:3afcd581558d 240 /* Store the last settings made to range and gain. */
pmallick 0:3afcd581558d 241 dev->current_range = range;
pmallick 0:3afcd581558d 242 dev->current_gain = gain;
pmallick 0:3afcd581558d 243 }
pmallick 0:3afcd581558d 244
pmallick 0:3afcd581558d 245 /***************************************************************************//**
pmallick 0:3afcd581558d 246 * @brief Reads the temperature from the part and returns the data in
pmallick 0:3afcd581558d 247 * degrees Celsius.
pmallick 0:3afcd581558d 248 *
pmallick 0:3afcd581558d 249 * @param dev - The device structure.
pmallick 0:3afcd581558d 250 *
pmallick 0:3afcd581558d 251 * @return temperature - Temperature.
pmallick 0:3afcd581558d 252 *******************************************************************************/
pmallick 0:3afcd581558d 253 float ad5933_get_temperature(struct ad5933_dev *dev)
pmallick 0:3afcd581558d 254 {
pmallick 0:3afcd581558d 255 float temperature = 0;
pmallick 0:3afcd581558d 256 uint8_t status = 0;
pmallick 0:3afcd581558d 257
pmallick 0:3afcd581558d 258 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 259 AD5933_REG_CONTROL_HB,
pmallick 0:3afcd581558d 260 AD5933_CONTROL_FUNCTION(AD5933_FUNCTION_MEASURE_TEMP) |
pmallick 0:3afcd581558d 261 AD5933_CONTROL_RANGE(dev->current_range) |
pmallick 0:3afcd581558d 262 AD5933_CONTROL_PGA_GAIN(dev->current_gain),
pmallick 0:3afcd581558d 263 1);
pmallick 0:3afcd581558d 264 while((status & AD5933_STAT_TEMP_VALID) == 0) {
pmallick 0:3afcd581558d 265 status = ad5933_get_register_value(dev,
pmallick 0:3afcd581558d 266 AD5933_REG_STATUS,
pmallick 0:3afcd581558d 267 1);
pmallick 0:3afcd581558d 268 }
pmallick 0:3afcd581558d 269
pmallick 0:3afcd581558d 270 temperature = ad5933_get_register_value(dev,
pmallick 0:3afcd581558d 271 AD5933_REG_TEMP_DATA,
pmallick 0:3afcd581558d 272 2);
pmallick 0:3afcd581558d 273 if(temperature < 8192) {
pmallick 0:3afcd581558d 274 temperature /= 32;
pmallick 0:3afcd581558d 275 } else {
pmallick 0:3afcd581558d 276 temperature -= 16384;
pmallick 0:3afcd581558d 277 temperature /= 32;
pmallick 0:3afcd581558d 278 }
pmallick 0:3afcd581558d 279
pmallick 0:3afcd581558d 280 return temperature;
pmallick 0:3afcd581558d 281 }
pmallick 0:3afcd581558d 282
pmallick 0:3afcd581558d 283 /***************************************************************************//**
pmallick 0:3afcd581558d 284 * @brief Configures the sweep parameters: Start frequency, Frequency increment
pmallick 0:3afcd581558d 285 * and Number of increments.
pmallick 0:3afcd581558d 286 *
pmallick 0:3afcd581558d 287 * @param dev - The device structure.
pmallick 0:3afcd581558d 288 * @param start_freq - Start frequency in Hz;
pmallick 0:3afcd581558d 289 * @param inc_freq - Frequency increment in Hz;
pmallick 0:3afcd581558d 290 * @param inc_num - Number of increments. Maximum value is 511(0x1FF).
pmallick 0:3afcd581558d 291 *
pmallick 0:3afcd581558d 292 * @return None.
pmallick 0:3afcd581558d 293 *******************************************************************************/
pmallick 0:3afcd581558d 294 void ad5933_config_sweep(struct ad5933_dev *dev,
pmallick 0:3afcd581558d 295 uint32_t start_freq,
pmallick 0:3afcd581558d 296 uint32_t inc_freq,
pmallick 0:3afcd581558d 297 uint16_t inc_num)
pmallick 0:3afcd581558d 298 {
pmallick 0:3afcd581558d 299 uint32_t start_freq_reg = 0;
pmallick 0:3afcd581558d 300 uint32_t inc_freq_reg = 0;
pmallick 0:3afcd581558d 301 uint16_t inc_num_reg = 0;
pmallick 0:3afcd581558d 302
pmallick 0:3afcd581558d 303 /* Ensure that incNum is a valid data. */
pmallick 0:3afcd581558d 304 if(inc_num > AD5933_MAX_INC_NUM) {
pmallick 0:3afcd581558d 305 inc_num_reg = AD5933_MAX_INC_NUM;
pmallick 0:3afcd581558d 306 } else {
pmallick 0:3afcd581558d 307 inc_num_reg = inc_num;
pmallick 0:3afcd581558d 308 }
pmallick 0:3afcd581558d 309
pmallick 0:3afcd581558d 310 /* Convert users start frequency to binary code. */
pmallick 0:3afcd581558d 311 start_freq_reg = (uint32_t)((double)start_freq * 4 / dev->current_sys_clk *
pmallick 0:3afcd581558d 312 pow_2_27);
pmallick 0:3afcd581558d 313
pmallick 0:3afcd581558d 314 /* Convert users increment frequency to binary code. */
pmallick 0:3afcd581558d 315 inc_freq_reg = (uint32_t)((double)inc_freq * 4 / dev->current_sys_clk *
pmallick 0:3afcd581558d 316 pow_2_27);
pmallick 0:3afcd581558d 317
pmallick 0:3afcd581558d 318 /* Configure the device with the sweep parameters. */
pmallick 0:3afcd581558d 319 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 320 AD5933_REG_FREQ_START,
pmallick 0:3afcd581558d 321 start_freq_reg,
pmallick 0:3afcd581558d 322 3);
pmallick 0:3afcd581558d 323 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 324 AD5933_REG_FREQ_INC,
pmallick 0:3afcd581558d 325 inc_freq_reg,
pmallick 0:3afcd581558d 326 3);
pmallick 0:3afcd581558d 327 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 328 AD5933_REG_INC_NUM,
pmallick 0:3afcd581558d 329 inc_num_reg,
pmallick 0:3afcd581558d 330 2);
pmallick 0:3afcd581558d 331 }
pmallick 0:3afcd581558d 332
pmallick 0:3afcd581558d 333 /***************************************************************************//**
pmallick 0:3afcd581558d 334 * @brief Starts the sweep operation.
pmallick 0:3afcd581558d 335 *
pmallick 0:3afcd581558d 336 * @param dev - The device structure.
pmallick 0:3afcd581558d 337 *
pmallick 0:3afcd581558d 338 * @return None.
pmallick 0:3afcd581558d 339 *******************************************************************************/
pmallick 0:3afcd581558d 340 void ad5933_start_sweep(struct ad5933_dev *dev)
pmallick 0:3afcd581558d 341 {
pmallick 0:3afcd581558d 342 uint8_t status = 0;
pmallick 0:3afcd581558d 343
pmallick 0:3afcd581558d 344 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 345 AD5933_REG_CONTROL_HB,
pmallick 0:3afcd581558d 346 AD5933_CONTROL_FUNCTION(AD5933_FUNCTION_STANDBY) |
pmallick 0:3afcd581558d 347 AD5933_CONTROL_RANGE(dev->current_range) |
pmallick 0:3afcd581558d 348 AD5933_CONTROL_PGA_GAIN(dev->current_gain),
pmallick 0:3afcd581558d 349 1);
pmallick 0:3afcd581558d 350 ad5933_reset(dev);
pmallick 0:3afcd581558d 351 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 352 AD5933_REG_CONTROL_HB,
pmallick 0:3afcd581558d 353 AD5933_CONTROL_FUNCTION(AD5933_FUNCTION_INIT_START_FREQ)|
pmallick 0:3afcd581558d 354 AD5933_CONTROL_RANGE(dev->current_range) |
pmallick 0:3afcd581558d 355 AD5933_CONTROL_PGA_GAIN(dev->current_gain),
pmallick 0:3afcd581558d 356 1);
pmallick 0:3afcd581558d 357 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 358 AD5933_REG_CONTROL_HB,
pmallick 0:3afcd581558d 359 AD5933_CONTROL_FUNCTION(AD5933_FUNCTION_START_SWEEP) |
pmallick 0:3afcd581558d 360 AD5933_CONTROL_RANGE(dev->current_range) |
pmallick 0:3afcd581558d 361 AD5933_CONTROL_PGA_GAIN(dev->current_gain),
pmallick 0:3afcd581558d 362 1);
pmallick 0:3afcd581558d 363 status = 0;
pmallick 0:3afcd581558d 364 while((status & AD5933_STAT_DATA_VALID) == 0) {
pmallick 0:3afcd581558d 365 status = ad5933_get_register_value(dev,
pmallick 0:3afcd581558d 366 AD5933_REG_STATUS,
pmallick 0:3afcd581558d 367 1);
pmallick 0:3afcd581558d 368 };
pmallick 0:3afcd581558d 369 }
pmallick 0:3afcd581558d 370
pmallick 0:3afcd581558d 371 /***************************************************************************//**
pmallick 0:3afcd581558d 372 * @brief Reads the real and the imaginary data and calculates the Gain Factor.
pmallick 0:3afcd581558d 373 *
pmallick 0:3afcd581558d 374 * @param dev - The device structure.
pmallick 0:3afcd581558d 375 * @param calibration_impedance - The calibration impedance value.
pmallick 0:3afcd581558d 376 * @param freq_function - Frequency function.
pmallick 0:3afcd581558d 377 * Example: AD5933_FUNCTION_INC_FREQ - Increment
pmallick 0:3afcd581558d 378 freq.;
pmallick 0:3afcd581558d 379 * AD5933_FUNCTION_REPEAT_FREQ - Repeat
pmallick 0:3afcd581558d 380 freq..
pmallick 0:3afcd581558d 381 *
pmallick 0:3afcd581558d 382 * @return gainFactor - Calculated gain factor.
pmallick 0:3afcd581558d 383 *******************************************************************************/
pmallick 0:3afcd581558d 384 double ad5933_calculate_gain_factor(struct ad5933_dev *dev,
pmallick 0:3afcd581558d 385 uint32_t calibration_impedance,
pmallick 0:3afcd581558d 386 uint8_t freq_function)
pmallick 0:3afcd581558d 387 {
pmallick 0:3afcd581558d 388 double gain_factor = 0;
pmallick 0:3afcd581558d 389 double magnitude = 0;
pmallick 0:3afcd581558d 390 signed short real_data = 0;
pmallick 0:3afcd581558d 391 signed short imag_data = 0;
pmallick 0:3afcd581558d 392 uint8_t status = 0;
pmallick 0:3afcd581558d 393
pmallick 0:3afcd581558d 394 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 395 AD5933_REG_CONTROL_HB,
pmallick 0:3afcd581558d 396 AD5933_CONTROL_FUNCTION(freq_function) |
pmallick 0:3afcd581558d 397 AD5933_CONTROL_RANGE(dev->current_range) |
pmallick 0:3afcd581558d 398 AD5933_CONTROL_PGA_GAIN(dev->current_gain),
pmallick 0:3afcd581558d 399 1);
pmallick 0:3afcd581558d 400 status = 0;
pmallick 0:3afcd581558d 401 while((status & AD5933_STAT_DATA_VALID) == 0) {
pmallick 0:3afcd581558d 402 status = ad5933_get_register_value(dev,
pmallick 0:3afcd581558d 403 AD5933_REG_STATUS,
pmallick 0:3afcd581558d 404 1);
pmallick 0:3afcd581558d 405 }
pmallick 0:3afcd581558d 406 real_data = ad5933_get_register_value(dev,
pmallick 0:3afcd581558d 407 AD5933_REG_REAL_DATA,
pmallick 0:3afcd581558d 408 2);
pmallick 0:3afcd581558d 409 imag_data = ad5933_get_register_value(dev,
pmallick 0:3afcd581558d 410 AD5933_REG_IMAG_DATA,
pmallick 0:3afcd581558d 411 2);
pmallick 0:3afcd581558d 412 magnitude = sqrt((real_data * real_data) + (imag_data * imag_data));
pmallick 0:3afcd581558d 413 gain_factor = 1 / (magnitude * calibration_impedance);
pmallick 0:3afcd581558d 414
pmallick 0:3afcd581558d 415 return gain_factor;
pmallick 0:3afcd581558d 416 }
pmallick 0:3afcd581558d 417
pmallick 0:3afcd581558d 418 /***************************************************************************//**
pmallick 0:3afcd581558d 419 * @brief Reads the real and the imaginary data and calculates the Impedance.
pmallick 0:3afcd581558d 420 *
pmallick 0:3afcd581558d 421 * @param dev - The device structure.
pmallick 0:3afcd581558d 422 * @param gain_factor - The gain factor.
pmallick 0:3afcd581558d 423 * @param freq_function - Frequency function.
pmallick 0:3afcd581558d 424 * Example: AD5933_FUNCTION_INC_FREQ - Increment freq.;
pmallick 0:3afcd581558d 425 * AD5933_FUNCTION_REPEAT_FREQ - Repeat freq..
pmallick 0:3afcd581558d 426 *
pmallick 0:3afcd581558d 427 * @return ad5933_results - Struct of calculated values.
pmallick 0:3afcd581558d 428 *******************************************************************************/
pmallick 0:3afcd581558d 429 ad5933_result ad5933_calculate_impedance(struct ad5933_dev *dev,
pmallick 0:3afcd581558d 430 double gain_factor,
pmallick 0:3afcd581558d 431 uint8_t freq_function)
pmallick 0:3afcd581558d 432 {
pmallick 0:3afcd581558d 433 signed short real_data = 0;
pmallick 0:3afcd581558d 434 signed short imag_data = 0;
pmallick 0:3afcd581558d 435 double magnitude = 0;
pmallick 0:3afcd581558d 436 uint8_t status = 0;
pmallick 0:3afcd581558d 437 ad5933_result result;
pmallick 0:3afcd581558d 438
pmallick 0:3afcd581558d 439 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 440 AD5933_REG_CONTROL_HB,
pmallick 0:3afcd581558d 441 AD5933_CONTROL_FUNCTION(freq_function) |
pmallick 0:3afcd581558d 442 AD5933_CONTROL_RANGE(dev->current_range) |
pmallick 0:3afcd581558d 443 AD5933_CONTROL_PGA_GAIN(dev->current_gain),
pmallick 0:3afcd581558d 444 1);
pmallick 0:3afcd581558d 445 status = 0;
pmallick 0:3afcd581558d 446 while((status & AD5933_STAT_DATA_VALID) == 0) {
pmallick 0:3afcd581558d 447 status = ad5933_get_register_value(dev,
pmallick 0:3afcd581558d 448 AD5933_REG_STATUS,
pmallick 0:3afcd581558d 449 1);
pmallick 0:3afcd581558d 450 }
pmallick 0:3afcd581558d 451 real_data = ad5933_get_register_value(dev,
pmallick 0:3afcd581558d 452 AD5933_REG_REAL_DATA,
pmallick 0:3afcd581558d 453 2);
pmallick 0:3afcd581558d 454 imag_data = ad5933_get_register_value(dev,
pmallick 0:3afcd581558d 455 AD5933_REG_IMAG_DATA,
pmallick 0:3afcd581558d 456 2);
pmallick 0:3afcd581558d 457 magnitude = sqrt((real_data * real_data) + (imag_data * imag_data));
pmallick 0:3afcd581558d 458
pmallick 0:3afcd581558d 459
pmallick 0:3afcd581558d 460 result.magnitude = magnitude;
pmallick 0:3afcd581558d 461 result.phase = atan2(imag_data,real_data) * radToDeg180ovPi;
pmallick 0:3afcd581558d 462
pmallick 0:3afcd581558d 463 return result;
pmallick 0:3afcd581558d 464 }
pmallick 0:3afcd581558d 465
pmallick 0:3afcd581558d 466 /***************************************************************************//**
pmallick 0:3afcd581558d 467 * @brief Selects the number of settling cycles of the device.
pmallick 0:3afcd581558d 468 *
pmallick 0:3afcd581558d 469 * @param dev - The device structure.
pmallick 0:3afcd581558d 470 * @param cycles - 9-bit number of cycles to wait before triggering ADC
pmallick 0:3afcd581558d 471 *
pmallick 0:3afcd581558d 472 * @param multiplier - Multiply number of cycles by X1, X2 or X4
pmallick 0:3afcd581558d 473 * Example: AD5933_SETTLING_X1
pmallick 0:3afcd581558d 474 * AD5933_SETTLING_X2
pmallick 0:3afcd581558d 475 * AD5933_SETTLING_X4
pmallick 0:3afcd581558d 476 *
pmallick 0:3afcd581558d 477 * @return None.
pmallick 0:3afcd581558d 478 *******************************************************************************/
pmallick 0:3afcd581558d 479 void ad5933_set_settling_time(struct ad5933_dev *dev,
pmallick 0:3afcd581558d 480 uint8_t multiplier,
pmallick 0:3afcd581558d 481 uint16_t number_cycles)
pmallick 0:3afcd581558d 482 {
pmallick 0:3afcd581558d 483
pmallick 0:3afcd581558d 484
pmallick 0:3afcd581558d 485 if ((multiplier != AD5933_SETTLING_X2) && (multiplier != AD5933_SETTLING_X4))
pmallick 0:3afcd581558d 486 multiplier = AD5933_SETTLING_X1;
pmallick 0:3afcd581558d 487
pmallick 0:3afcd581558d 488 ad5933_set_register_value(dev,
pmallick 0:3afcd581558d 489 AD5933_REG_SETTLING_CYCLES,
pmallick 0:3afcd581558d 490 number_cycles | (multiplier << 9),
pmallick 0:3afcd581558d 491 2);
pmallick 0:3afcd581558d 492 /* Store the last settings made. */
pmallick 0:3afcd581558d 493 dev->current_settling = number_cycles;
pmallick 0:3afcd581558d 494 }