this is testing

Committer:
pmallick
Date:
Thu Jan 14 19:12:57 2021 +0530
Revision:
0:e8a1ba50c46b
this is testing

Who changed what in which revision?

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