Forked repository to push EVAL-AD593x updates

Dependencies:   platform_drivers

Committer:
pmallick
Date:
Wed Oct 13 14:39:58 2021 +0530
Revision:
5:ca8fe90d3ab5
No-OS Adoption Changes:
* Updated the .lib files for adoption of no-OS repository as-is.
* Replaced 'platform_drivers.h' with required header files.
* Updated the copyright year.

Mbed OS update changes:
1) Added the mbed_app.json file with custom parameters.
2) Updated the mbed-os version to 6.8.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pmallick 5:ca8fe90d3ab5 1 /*************************************************************************//**
pmallick 5:ca8fe90d3ab5 2 * @file main.cpp
pmallick 5:ca8fe90d3ab5 3 * @brief Main application code for AD5933 firmware example program
pmallick 5:ca8fe90d3ab5 4 * @author ssmith (sean.smith@analog.com)
pmallick 5:ca8fe90d3ab5 5 ******************************************************************************
pmallick 5:ca8fe90d3ab5 6 * Copyright (c) 2019-2021 Analog Devices, Inc.
pmallick 5:ca8fe90d3ab5 7 *
pmallick 5:ca8fe90d3ab5 8 * All rights reserved.
pmallick 5:ca8fe90d3ab5 9 *
pmallick 5:ca8fe90d3ab5 10 * Redistribution and use in source and binary forms, with or without
pmallick 5:ca8fe90d3ab5 11 * modification, are permitted provided that the following conditions are met:
pmallick 5:ca8fe90d3ab5 12 * - Redistributions of source code must retain the above copyright notice,
pmallick 5:ca8fe90d3ab5 13 * this list of conditions and the following disclaimer.
pmallick 5:ca8fe90d3ab5 14 * - Redistributions in binary form must reproduce the above copyright notice,
pmallick 5:ca8fe90d3ab5 15 * this list of conditions and the following disclaimer in the documentation
pmallick 5:ca8fe90d3ab5 16 * and/or other materials provided with the distribution.
pmallick 5:ca8fe90d3ab5 17 * - Modified versions of the software must be conspicuously marked as such.
pmallick 5:ca8fe90d3ab5 18 * - This software is licensed solely and exclusively for use with
pmallick 5:ca8fe90d3ab5 19 * processors/products manufactured by or for Analog Devices, Inc.
pmallick 5:ca8fe90d3ab5 20 * - This software may not be combined or merged with other code in any manner
pmallick 5:ca8fe90d3ab5 21 * that would cause the software to become subject to terms and
pmallick 5:ca8fe90d3ab5 22 * conditions which differ from those listed here.
pmallick 5:ca8fe90d3ab5 23 * - Neither the name of Analog Devices, Inc. nor the names of its
pmallick 5:ca8fe90d3ab5 24 * contributors may be used to endorse or promote products derived
pmallick 5:ca8fe90d3ab5 25 * from this software without specific prior written permission.
pmallick 5:ca8fe90d3ab5 26 * - The use of this software may or may not infringe the patent rights
pmallick 5:ca8fe90d3ab5 27 * of one or more patent holders. This license does not release you from
pmallick 5:ca8fe90d3ab5 28 * the requirement that you obtain separate licenses from these patent
pmallick 5:ca8fe90d3ab5 29 * holders to use this software.
pmallick 5:ca8fe90d3ab5 30 *
pmallick 5:ca8fe90d3ab5 31 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS"
pmallick 5:ca8fe90d3ab5 32 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
pmallick 5:ca8fe90d3ab5 33 * NON-INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A
pmallick 5:ca8fe90d3ab5 34 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES,
pmallick 5:ca8fe90d3ab5 35 * INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
pmallick 5:ca8fe90d3ab5 36 * SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES
pmallick 5:ca8fe90d3ab5 37 * (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF
pmallick 5:ca8fe90d3ab5 38 * INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE
pmallick 5:ca8fe90d3ab5 39 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
pmallick 5:ca8fe90d3ab5 40 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
pmallick 5:ca8fe90d3ab5 41 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
pmallick 5:ca8fe90d3ab5 42 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
pmallick 5:ca8fe90d3ab5 43 * POSSIBILITY OF SUCH DAMAGE.
pmallick 5:ca8fe90d3ab5 44 *
pmallick 5:ca8fe90d3ab5 45 * 20180927-7CBSD SLA
pmallick 5:ca8fe90d3ab5 46 *****************************************************************************/
pmallick 5:ca8fe90d3ab5 47
pmallick 5:ca8fe90d3ab5 48 #include <mbed.h>
pmallick 5:ca8fe90d3ab5 49 #include <ctype.h>
pmallick 5:ca8fe90d3ab5 50 #include "i2c.h"
pmallick 5:ca8fe90d3ab5 51 #include "i2c_extra.h"
pmallick 5:ca8fe90d3ab5 52 #include "error.h"
pmallick 5:ca8fe90d3ab5 53 #include "app_config.h"
pmallick 5:ca8fe90d3ab5 54
pmallick 5:ca8fe90d3ab5 55 #ifdef __cplusplus
pmallick 5:ca8fe90d3ab5 56 extern "C"
pmallick 5:ca8fe90d3ab5 57 {
pmallick 5:ca8fe90d3ab5 58 #endif // _cplusplus
pmallick 5:ca8fe90d3ab5 59 #include "delay.h"
pmallick 5:ca8fe90d3ab5 60 #ifdef __cplusplus // Closing extern c
pmallick 5:ca8fe90d3ab5 61 }
pmallick 5:ca8fe90d3ab5 62 #endif // _cplusplus
pmallick 5:ca8fe90d3ab5 63
pmallick 5:ca8fe90d3ab5 64 //Lower this value if storage becomes a problem
pmallick 5:ca8fe90d3ab5 65 #define MAX_FREQ_INCREMENTS 511
pmallick 5:ca8fe90d3ab5 66 #define TEMP_LIMIT_MIN -40
pmallick 5:ca8fe90d3ab5 67 #define TEMP_LIMIT_MAX 125
pmallick 5:ca8fe90d3ab5 68 #define MAX_SETTLING_CYCLES 511
pmallick 5:ca8fe90d3ab5 69
pmallick 5:ca8fe90d3ab5 70 static void print_title(void);
pmallick 5:ca8fe90d3ab5 71 static void getMenuSelect(uint8_t *menuSelect);
pmallick 5:ca8fe90d3ab5 72 static void print_prompt();
pmallick 5:ca8fe90d3ab5 73 static uint8_t read_temperature();
pmallick 5:ca8fe90d3ab5 74 static uint8_t set_system_clock();
pmallick 5:ca8fe90d3ab5 75 static uint8_t set_vrange_and_pga_gain();
pmallick 5:ca8fe90d3ab5 76 static int32_t configure_system();
pmallick 5:ca8fe90d3ab5 77 static uint8_t calculate_gain_factor();
pmallick 5:ca8fe90d3ab5 78 static uint8_t guide();
pmallick 5:ca8fe90d3ab5 79 static uint8_t impedance_sweep();
pmallick 5:ca8fe90d3ab5 80
pmallick 5:ca8fe90d3ab5 81 typedef struct ad5933_config_data {
pmallick 5:ca8fe90d3ab5 82 float start_freq;
pmallick 5:ca8fe90d3ab5 83 uint8_t pga_gain;
pmallick 5:ca8fe90d3ab5 84 float output_voltage_range;
pmallick 5:ca8fe90d3ab5 85 int32_t start_frequency;
pmallick 5:ca8fe90d3ab5 86 int32_t frequency_increment;
pmallick 5:ca8fe90d3ab5 87 int32_t number_increments;
pmallick 5:ca8fe90d3ab5 88 int32_t number_settling_cycles;
pmallick 5:ca8fe90d3ab5 89 }ad5933_config_data;
pmallick 5:ca8fe90d3ab5 90
pmallick 5:ca8fe90d3ab5 91 ad5933_config_data config_data;
pmallick 5:ca8fe90d3ab5 92
pmallick 5:ca8fe90d3ab5 93 static double gain_factor = 0;
pmallick 5:ca8fe90d3ab5 94 static double temperature;
pmallick 5:ca8fe90d3ab5 95
pmallick 5:ca8fe90d3ab5 96
pmallick 5:ca8fe90d3ab5 97 /******************************************************************************/
pmallick 5:ca8fe90d3ab5 98 /************************** Variables Declarations ****************************/
pmallick 5:ca8fe90d3ab5 99 /******************************************************************************/
pmallick 5:ca8fe90d3ab5 100
pmallick 5:ca8fe90d3ab5 101 // Initialize the extra parameters for I2C initialization
pmallick 5:ca8fe90d3ab5 102 mbed_i2c_init_param i2c_init_extra_params = {
pmallick 5:ca8fe90d3ab5 103 .i2c_sda_pin = I2C_SDA,
pmallick 5:ca8fe90d3ab5 104 .i2c_scl_pin = I2C_SCL
pmallick 5:ca8fe90d3ab5 105 };
pmallick 5:ca8fe90d3ab5 106
pmallick 5:ca8fe90d3ab5 107 i2c_init_param i2c_params =
pmallick 5:ca8fe90d3ab5 108 {
pmallick 5:ca8fe90d3ab5 109 .max_speed_hz = 100000, // i2c max speed (hz)
pmallick 5:ca8fe90d3ab5 110 .slave_address = AD5933_ADDRESS, // i2c slave address //A0 tied high
pmallick 5:ca8fe90d3ab5 111 .extra = &i2c_init_extra_params // i2c extra initialization parameters
pmallick 5:ca8fe90d3ab5 112 };
pmallick 5:ca8fe90d3ab5 113
pmallick 5:ca8fe90d3ab5 114
pmallick 5:ca8fe90d3ab5 115 ad5933_init_param init_params = {
pmallick 5:ca8fe90d3ab5 116 .i2c_init = i2c_params, // I2C parameters
pmallick 5:ca8fe90d3ab5 117 .current_sys_clk = AD5933_INTERNAL_SYS_CLK, //current_sys_clk frequency (16MHz)
pmallick 5:ca8fe90d3ab5 118 .current_clock_source = AD5933_CONTROL_INT_SYSCLK, //current_clock_source
pmallick 5:ca8fe90d3ab5 119 .current_gain = AD5933_RANGE_1000mVpp, //current_gain
pmallick 5:ca8fe90d3ab5 120 .current_range = AD5933_GAIN_X1, //current_range
pmallick 5:ca8fe90d3ab5 121 };
pmallick 5:ca8fe90d3ab5 122
pmallick 5:ca8fe90d3ab5 123 ad5933_dev *device;
pmallick 5:ca8fe90d3ab5 124 int32_t connected = -1;
pmallick 5:ca8fe90d3ab5 125
pmallick 5:ca8fe90d3ab5 126 int main()
pmallick 5:ca8fe90d3ab5 127 {
pmallick 5:ca8fe90d3ab5 128
pmallick 5:ca8fe90d3ab5 129 uint8_t menu_select = 0;
pmallick 5:ca8fe90d3ab5 130 print_title();
pmallick 5:ca8fe90d3ab5 131 connected = ad5933_init(&device, init_params);
pmallick 5:ca8fe90d3ab5 132
pmallick 5:ca8fe90d3ab5 133
pmallick 5:ca8fe90d3ab5 134 //Do a quick check to ensure basic connectivity is ok
pmallick 5:ca8fe90d3ab5 135 temperature = ad5933_get_temperature(device);
pmallick 5:ca8fe90d3ab5 136 if (temperature >= TEMP_LIMIT_MIN && temperature <= TEMP_LIMIT_MAX) {
pmallick 5:ca8fe90d3ab5 137 printf("\nTemperature: %f, AD5933 initialisation successful!\n",temperature);
pmallick 5:ca8fe90d3ab5 138 }
pmallick 5:ca8fe90d3ab5 139 else {
pmallick 5:ca8fe90d3ab5 140 printf("AD5933 initialisation reported a bad temperature - recommend debug :\n");
pmallick 5:ca8fe90d3ab5 141 }
pmallick 5:ca8fe90d3ab5 142
pmallick 5:ca8fe90d3ab5 143 while (connected == SUCCESS) {
pmallick 5:ca8fe90d3ab5 144 print_prompt();
pmallick 5:ca8fe90d3ab5 145 getMenuSelect(&menu_select);
pmallick 5:ca8fe90d3ab5 146 config_data.start_freq = 10000;
pmallick 5:ca8fe90d3ab5 147
pmallick 5:ca8fe90d3ab5 148 if (menu_select > 12)
pmallick 5:ca8fe90d3ab5 149 print_prompt();
pmallick 5:ca8fe90d3ab5 150 else switch (menu_select)
pmallick 5:ca8fe90d3ab5 151 {
pmallick 5:ca8fe90d3ab5 152 case 0:
pmallick 5:ca8fe90d3ab5 153 guide();
pmallick 5:ca8fe90d3ab5 154 mdelay(2000);
pmallick 5:ca8fe90d3ab5 155 break;
pmallick 5:ca8fe90d3ab5 156
pmallick 5:ca8fe90d3ab5 157 case 1:
pmallick 5:ca8fe90d3ab5 158 read_temperature();
pmallick 5:ca8fe90d3ab5 159 break;
pmallick 5:ca8fe90d3ab5 160 case 2:
pmallick 5:ca8fe90d3ab5 161 configure_system();
pmallick 5:ca8fe90d3ab5 162 break;
pmallick 5:ca8fe90d3ab5 163 case 3:
pmallick 5:ca8fe90d3ab5 164 calculate_gain_factor();
pmallick 5:ca8fe90d3ab5 165 break;
pmallick 5:ca8fe90d3ab5 166 case 4:
pmallick 5:ca8fe90d3ab5 167 impedance_sweep();
pmallick 5:ca8fe90d3ab5 168 break;
pmallick 5:ca8fe90d3ab5 169
pmallick 5:ca8fe90d3ab5 170 default:
pmallick 5:ca8fe90d3ab5 171 printf("Invalid option: Ignored.");
pmallick 5:ca8fe90d3ab5 172 break;
pmallick 5:ca8fe90d3ab5 173 }
pmallick 5:ca8fe90d3ab5 174
pmallick 5:ca8fe90d3ab5 175 mdelay(100);
pmallick 5:ca8fe90d3ab5 176 }
pmallick 5:ca8fe90d3ab5 177
pmallick 5:ca8fe90d3ab5 178 return 0;
pmallick 5:ca8fe90d3ab5 179 }
pmallick 5:ca8fe90d3ab5 180
pmallick 5:ca8fe90d3ab5 181 //! Prints the title block
pmallick 5:ca8fe90d3ab5 182 void print_title()
pmallick 5:ca8fe90d3ab5 183 {
pmallick 5:ca8fe90d3ab5 184 printf("*****************************************************************\n");
pmallick 5:ca8fe90d3ab5 185 printf("* AD5933 Demonstration Program *\n");
pmallick 5:ca8fe90d3ab5 186 printf("* *\n");
pmallick 5:ca8fe90d3ab5 187 printf("* This program demonstrates communication with the AD5933 *\n");
pmallick 5:ca8fe90d3ab5 188 printf("* *\n");
pmallick 5:ca8fe90d3ab5 189 printf("* 1 MSPS, 12-Bit Impedance Converter, Network analyser *\n");
pmallick 5:ca8fe90d3ab5 190 printf("* *\n");
pmallick 5:ca8fe90d3ab5 191 printf("* Set the baud rate to 115200 select the newline terminator. *\n");
pmallick 5:ca8fe90d3ab5 192 printf("*****************************************************************\n");
pmallick 5:ca8fe90d3ab5 193 }
pmallick 5:ca8fe90d3ab5 194
pmallick 5:ca8fe90d3ab5 195 void print_prompt()
pmallick 5:ca8fe90d3ab5 196 {
pmallick 5:ca8fe90d3ab5 197 printf("\n\n\rCommand Summary:\n\n");
pmallick 5:ca8fe90d3ab5 198 printf(" 0 -Software Guide\n");
pmallick 5:ca8fe90d3ab5 199 printf(" 1 -Read temperature\n");
pmallick 5:ca8fe90d3ab5 200 printf(" 2 -Configure voltage-range, PGA-Gain and sweep parameters\n");
pmallick 5:ca8fe90d3ab5 201 printf(" 3 -Calculate Gain-Factor\n");
pmallick 5:ca8fe90d3ab5 202 printf(" 4 -Do an impedance sweep\n");
pmallick 5:ca8fe90d3ab5 203 printf("\n\rMake a selection...\n");
pmallick 5:ca8fe90d3ab5 204
pmallick 5:ca8fe90d3ab5 205 }
pmallick 5:ca8fe90d3ab5 206
pmallick 5:ca8fe90d3ab5 207
pmallick 5:ca8fe90d3ab5 208 static void getMenuSelect(uint8_t *menuSelect) {
pmallick 5:ca8fe90d3ab5 209 scanf("%d", (int *)menuSelect);
pmallick 5:ca8fe90d3ab5 210 }
pmallick 5:ca8fe90d3ab5 211
pmallick 5:ca8fe90d3ab5 212 static uint8_t read_temperature()
pmallick 5:ca8fe90d3ab5 213 {
pmallick 5:ca8fe90d3ab5 214 temperature = ad5933_get_temperature(device);
pmallick 5:ca8fe90d3ab5 215
pmallick 5:ca8fe90d3ab5 216 printf("Current temperature:%.3f C", temperature);
pmallick 5:ca8fe90d3ab5 217 return SUCCESS;
pmallick 5:ca8fe90d3ab5 218 }
pmallick 5:ca8fe90d3ab5 219
pmallick 5:ca8fe90d3ab5 220 static uint8_t set_system_clock()
pmallick 5:ca8fe90d3ab5 221 {
pmallick 5:ca8fe90d3ab5 222 printf(" Select Internal (1) or external clock (2): ");
pmallick 5:ca8fe90d3ab5 223
pmallick 5:ca8fe90d3ab5 224 int input = 0;
pmallick 5:ca8fe90d3ab5 225 scanf("%d", &input);
pmallick 5:ca8fe90d3ab5 226 if (isdigit(input) == 0 && (input == 1 || input == 2))
pmallick 5:ca8fe90d3ab5 227 {
pmallick 5:ca8fe90d3ab5 228 input == 1 ? printf("\n You selected Internal clock source\n") :
pmallick 5:ca8fe90d3ab5 229 printf(" You selected external Source clock source\n");
pmallick 5:ca8fe90d3ab5 230 }
pmallick 5:ca8fe90d3ab5 231 else
pmallick 5:ca8fe90d3ab5 232 {
pmallick 5:ca8fe90d3ab5 233 printf("Invalid entry\n");
pmallick 5:ca8fe90d3ab5 234 mdelay(2000);
pmallick 5:ca8fe90d3ab5 235 return FAILURE;
pmallick 5:ca8fe90d3ab5 236 }
pmallick 5:ca8fe90d3ab5 237
pmallick 5:ca8fe90d3ab5 238 if (input == 2)
pmallick 5:ca8fe90d3ab5 239 {
pmallick 5:ca8fe90d3ab5 240
pmallick 5:ca8fe90d3ab5 241 printf(" Enter external clock frequency in Hz ");
pmallick 5:ca8fe90d3ab5 242 scanf("%d", &input);
pmallick 5:ca8fe90d3ab5 243 if (isdigit(input) == 0 && input > 0 && input < 20000000)
pmallick 5:ca8fe90d3ab5 244 {
pmallick 5:ca8fe90d3ab5 245 printf(" External clk-source frequency set to %d \n", input);
pmallick 5:ca8fe90d3ab5 246 }
pmallick 5:ca8fe90d3ab5 247 else
pmallick 5:ca8fe90d3ab5 248 {
pmallick 5:ca8fe90d3ab5 249 printf("Invalid entry\n");
pmallick 5:ca8fe90d3ab5 250 mdelay(2000);
pmallick 5:ca8fe90d3ab5 251 return FAILURE;
pmallick 5:ca8fe90d3ab5 252 }
pmallick 5:ca8fe90d3ab5 253 }
pmallick 5:ca8fe90d3ab5 254
pmallick 5:ca8fe90d3ab5 255 ad5933_set_system_clk(device,
pmallick 5:ca8fe90d3ab5 256 input == 1 ? AD5933_CONTROL_INT_SYSCLK :
pmallick 5:ca8fe90d3ab5 257 AD5933_CONTROL_EXT_SYSCLK,
pmallick 5:ca8fe90d3ab5 258 input);
pmallick 5:ca8fe90d3ab5 259
pmallick 5:ca8fe90d3ab5 260 return 0;
pmallick 5:ca8fe90d3ab5 261 }
pmallick 5:ca8fe90d3ab5 262
pmallick 5:ca8fe90d3ab5 263 static uint8_t set_vrange_and_pga_gain()
pmallick 5:ca8fe90d3ab5 264 {
pmallick 5:ca8fe90d3ab5 265 int input;
pmallick 5:ca8fe90d3ab5 266 uint8_t v_range = AD5933_RANGE_1000mVpp;
pmallick 5:ca8fe90d3ab5 267
pmallick 5:ca8fe90d3ab5 268 printf(" Select output voltage range:\n");
pmallick 5:ca8fe90d3ab5 269 printf(" 0: 2Vpp typical:\n");
pmallick 5:ca8fe90d3ab5 270 printf(" 1: 200mVpp typical:\n");
pmallick 5:ca8fe90d3ab5 271 printf(" 2: 400mVpp typical:\n");
pmallick 5:ca8fe90d3ab5 272 printf(" 3: 1Vpp typical:\n");
pmallick 5:ca8fe90d3ab5 273
pmallick 5:ca8fe90d3ab5 274
pmallick 5:ca8fe90d3ab5 275 scanf("%d", &input);
pmallick 5:ca8fe90d3ab5 276 if (input >= 0 && input < 4)
pmallick 5:ca8fe90d3ab5 277 {
pmallick 5:ca8fe90d3ab5 278 switch (input)
pmallick 5:ca8fe90d3ab5 279 {
pmallick 5:ca8fe90d3ab5 280 case AD5933_RANGE_2000mVpp: {
pmallick 5:ca8fe90d3ab5 281 printf(" Selected 2V pp typical.\n");
pmallick 5:ca8fe90d3ab5 282 break;
pmallick 5:ca8fe90d3ab5 283 }
pmallick 5:ca8fe90d3ab5 284 case AD5933_RANGE_200mVpp: {
pmallick 5:ca8fe90d3ab5 285 printf(" Selected 200mV pp typical.\n");
pmallick 5:ca8fe90d3ab5 286 break;
pmallick 5:ca8fe90d3ab5 287 }
pmallick 5:ca8fe90d3ab5 288 case AD5933_RANGE_400mVpp: {
pmallick 5:ca8fe90d3ab5 289 printf(" Selected 400mV pp typical.\n");
pmallick 5:ca8fe90d3ab5 290 break;
pmallick 5:ca8fe90d3ab5 291 }
pmallick 5:ca8fe90d3ab5 292 case AD5933_RANGE_1000mVpp: {
pmallick 5:ca8fe90d3ab5 293 printf(" Selected 1V pp typical.\n");
pmallick 5:ca8fe90d3ab5 294 break;
pmallick 5:ca8fe90d3ab5 295 }
pmallick 5:ca8fe90d3ab5 296 }
pmallick 5:ca8fe90d3ab5 297 v_range = input;
pmallick 5:ca8fe90d3ab5 298 }
pmallick 5:ca8fe90d3ab5 299 else
pmallick 5:ca8fe90d3ab5 300 {
pmallick 5:ca8fe90d3ab5 301 printf("Invalid entry\n");
pmallick 5:ca8fe90d3ab5 302 mdelay(2000);
pmallick 5:ca8fe90d3ab5 303 return FAILURE;
pmallick 5:ca8fe90d3ab5 304 }
pmallick 5:ca8fe90d3ab5 305
pmallick 5:ca8fe90d3ab5 306 printf("\n Select PGA Gain (0=X5, 1=X1)\n");
pmallick 5:ca8fe90d3ab5 307 scanf("%d", &input);
pmallick 5:ca8fe90d3ab5 308 if (input >= 0 && input < 2)
pmallick 5:ca8fe90d3ab5 309 {
pmallick 5:ca8fe90d3ab5 310 config_data.pga_gain = input;
pmallick 5:ca8fe90d3ab5 311 config_data.output_voltage_range = v_range;
pmallick 5:ca8fe90d3ab5 312
pmallick 5:ca8fe90d3ab5 313 printf("PGA gain set to : ");
pmallick 5:ca8fe90d3ab5 314 input == AD5933_GAIN_X5 ? printf("X5\n\n") : printf("X1\n\n");
pmallick 5:ca8fe90d3ab5 315 ad5933_set_range_and_gain(device,
pmallick 5:ca8fe90d3ab5 316 config_data.output_voltage_range,
pmallick 5:ca8fe90d3ab5 317 config_data.pga_gain);
pmallick 5:ca8fe90d3ab5 318 }
pmallick 5:ca8fe90d3ab5 319 else
pmallick 5:ca8fe90d3ab5 320 {
pmallick 5:ca8fe90d3ab5 321 printf("Invalid entry: write aborted\n");
pmallick 5:ca8fe90d3ab5 322 mdelay(2000);
pmallick 5:ca8fe90d3ab5 323 return FAILURE;
pmallick 5:ca8fe90d3ab5 324 }
pmallick 5:ca8fe90d3ab5 325
pmallick 5:ca8fe90d3ab5 326
pmallick 5:ca8fe90d3ab5 327 return SUCCESS;
pmallick 5:ca8fe90d3ab5 328 }
pmallick 5:ca8fe90d3ab5 329
pmallick 5:ca8fe90d3ab5 330 static int32_t configure_system()
pmallick 5:ca8fe90d3ab5 331 {
pmallick 5:ca8fe90d3ab5 332
pmallick 5:ca8fe90d3ab5 333 printf("Configure the impedance meter\n\n");
pmallick 5:ca8fe90d3ab5 334 set_vrange_and_pga_gain();
pmallick 5:ca8fe90d3ab5 335 set_system_clock();
pmallick 5:ca8fe90d3ab5 336
pmallick 5:ca8fe90d3ab5 337 int start_freq;
pmallick 5:ca8fe90d3ab5 338 int freq_inc;
pmallick 5:ca8fe90d3ab5 339 int num_increments;
pmallick 5:ca8fe90d3ab5 340 int num_settling_cycles;
pmallick 5:ca8fe90d3ab5 341 int multiplier = AD5933_SETTLING_X1;
pmallick 5:ca8fe90d3ab5 342
pmallick 5:ca8fe90d3ab5 343 printf("\n Enter start-frequency as a decimal number: ");
pmallick 5:ca8fe90d3ab5 344 if (scanf("%d", &start_freq) == 1)
pmallick 5:ca8fe90d3ab5 345 {
pmallick 5:ca8fe90d3ab5 346 if (start_freq <= 0)
pmallick 5:ca8fe90d3ab5 347 {
pmallick 5:ca8fe90d3ab5 348 printf(" Invalid entry, write aborted: \n");
pmallick 5:ca8fe90d3ab5 349 return FAILURE;
pmallick 5:ca8fe90d3ab5 350 }
pmallick 5:ca8fe90d3ab5 351 }
pmallick 5:ca8fe90d3ab5 352
pmallick 5:ca8fe90d3ab5 353
pmallick 5:ca8fe90d3ab5 354 printf("\n Enter frequency-increment as a decimal number: ");
pmallick 5:ca8fe90d3ab5 355 scanf("%d", &freq_inc);
pmallick 5:ca8fe90d3ab5 356 if (isdigit(freq_inc) != 0 || freq_inc <= 0)
pmallick 5:ca8fe90d3ab5 357 {
pmallick 5:ca8fe90d3ab5 358 printf(" Invalid entry, write aborted: \n");
pmallick 5:ca8fe90d3ab5 359 return FAILURE;
pmallick 5:ca8fe90d3ab5 360 }
pmallick 5:ca8fe90d3ab5 361
pmallick 5:ca8fe90d3ab5 362 printf("\n Enter the number of increments as a decimal number: ");
pmallick 5:ca8fe90d3ab5 363 printf("\n Number of increments must be less than %d\n", MAX_FREQ_INCREMENTS);
pmallick 5:ca8fe90d3ab5 364 scanf("%d", &num_increments);
pmallick 5:ca8fe90d3ab5 365 if (isdigit(num_increments) != 0 || num_increments > MAX_FREQ_INCREMENTS)
pmallick 5:ca8fe90d3ab5 366 {
pmallick 5:ca8fe90d3ab5 367 printf(" Invalid entry, write aborted: \n");
pmallick 5:ca8fe90d3ab5 368 return FAILURE;
pmallick 5:ca8fe90d3ab5 369 }
pmallick 5:ca8fe90d3ab5 370
pmallick 5:ca8fe90d3ab5 371 printf("Enter the number of settling-time cycles before ADC is triggered.\n");
pmallick 5:ca8fe90d3ab5 372 scanf("%d", &num_settling_cycles);
pmallick 5:ca8fe90d3ab5 373 if (num_settling_cycles > MAX_SETTLING_CYCLES)
pmallick 5:ca8fe90d3ab5 374 {
pmallick 5:ca8fe90d3ab5 375 printf(" Invalid entry, write aborted: \n");
pmallick 5:ca8fe90d3ab5 376 return FAILURE;
pmallick 5:ca8fe90d3ab5 377 }
pmallick 5:ca8fe90d3ab5 378
pmallick 5:ca8fe90d3ab5 379 printf("Set the settling time multiplier (X1=0, X2=1, X4=2).\n");
pmallick 5:ca8fe90d3ab5 380 scanf("%d", &multiplier);
pmallick 5:ca8fe90d3ab5 381 if (multiplier > 2)
pmallick 5:ca8fe90d3ab5 382 {
pmallick 5:ca8fe90d3ab5 383 printf(" Invalid entry, write aborted: \n");
pmallick 5:ca8fe90d3ab5 384 return FAILURE;
pmallick 5:ca8fe90d3ab5 385 }
pmallick 5:ca8fe90d3ab5 386 else
pmallick 5:ca8fe90d3ab5 387 { //adjust X4 option to match memory map
pmallick 5:ca8fe90d3ab5 388 if (multiplier == 2)
pmallick 5:ca8fe90d3ab5 389 multiplier = AD5933_SETTLING_X4;
pmallick 5:ca8fe90d3ab5 390 }
pmallick 5:ca8fe90d3ab5 391
pmallick 5:ca8fe90d3ab5 392 printf("\n Setting start frequency to %d\n\r", (unsigned int)start_freq);
pmallick 5:ca8fe90d3ab5 393 printf(" Setting frequency increment to %d\n\r", (unsigned int)freq_inc);
pmallick 5:ca8fe90d3ab5 394 printf(" Setting the number of increments to %d\n\r", (unsigned int)num_increments);
pmallick 5:ca8fe90d3ab5 395 printf(" Setting the number of settling-cycles to %d\n\r", (unsigned int)num_settling_cycles);
pmallick 5:ca8fe90d3ab5 396 printf(" The multiplier for the settling-cycles %d\n\r", (unsigned int)multiplier+1);
pmallick 5:ca8fe90d3ab5 397
pmallick 5:ca8fe90d3ab5 398 //update device state
pmallick 5:ca8fe90d3ab5 399 config_data.start_freq = start_freq;
pmallick 5:ca8fe90d3ab5 400 config_data.frequency_increment = freq_inc;
pmallick 5:ca8fe90d3ab5 401 config_data.number_increments = num_increments;
pmallick 5:ca8fe90d3ab5 402 config_data.number_settling_cycles = num_settling_cycles;
pmallick 5:ca8fe90d3ab5 403
pmallick 5:ca8fe90d3ab5 404 ad5933_set_settling_time(device,multiplier,num_settling_cycles);
pmallick 5:ca8fe90d3ab5 405 ad5933_set_range_and_gain(device, device->current_range, device->current_gain);
pmallick 5:ca8fe90d3ab5 406 ad5933_config_sweep(device, start_freq, freq_inc, num_increments);
pmallick 5:ca8fe90d3ab5 407
pmallick 5:ca8fe90d3ab5 408 return SUCCESS;
pmallick 5:ca8fe90d3ab5 409
pmallick 5:ca8fe90d3ab5 410 }
pmallick 5:ca8fe90d3ab5 411
pmallick 5:ca8fe90d3ab5 412 static uint8_t calculate_gain_factor()
pmallick 5:ca8fe90d3ab5 413 {
pmallick 5:ca8fe90d3ab5 414
pmallick 5:ca8fe90d3ab5 415 double calibration_impedance;
pmallick 5:ca8fe90d3ab5 416
pmallick 5:ca8fe90d3ab5 417 printf("\n\nCalculate the gain-factor (see datasheet for information)\n");
pmallick 5:ca8fe90d3ab5 418 printf("Calcualted gain-factor will be stored for impedance measurements and\n");
pmallick 5:ca8fe90d3ab5 419 printf("displayed on the terminal screen.\n");
pmallick 5:ca8fe90d3ab5 420 printf("Ensure that the system has been configured before\n");
pmallick 5:ca8fe90d3ab5 421 printf("calculating the gain factor\n");
pmallick 5:ca8fe90d3ab5 422
pmallick 5:ca8fe90d3ab5 423 ad5933_config_sweep(device,
pmallick 5:ca8fe90d3ab5 424 config_data.start_freq,
pmallick 5:ca8fe90d3ab5 425 config_data.frequency_increment,
pmallick 5:ca8fe90d3ab5 426 config_data.number_increments);
pmallick 5:ca8fe90d3ab5 427
pmallick 5:ca8fe90d3ab5 428 // Do standby, init-start freq, start the sweep, and wait for valid data
pmallick 5:ca8fe90d3ab5 429 ad5933_start_sweep(device);
pmallick 5:ca8fe90d3ab5 430
pmallick 5:ca8fe90d3ab5 431 printf("\nEnter calibration resistance in Ohms: ");
pmallick 5:ca8fe90d3ab5 432 scanf("%le", &calibration_impedance);
pmallick 5:ca8fe90d3ab5 433
pmallick 5:ca8fe90d3ab5 434
pmallick 5:ca8fe90d3ab5 435 printf("Calculating gain factor\n\r");
pmallick 5:ca8fe90d3ab5 436
pmallick 5:ca8fe90d3ab5 437 gain_factor = ad5933_calculate_gain_factor(device,
pmallick 5:ca8fe90d3ab5 438 calibration_impedance,
pmallick 5:ca8fe90d3ab5 439 AD5933_FUNCTION_REPEAT_FREQ);
pmallick 5:ca8fe90d3ab5 440 printf("\n\r Calculated gain factor %e\n\r", gain_factor);
pmallick 5:ca8fe90d3ab5 441
pmallick 5:ca8fe90d3ab5 442
pmallick 5:ca8fe90d3ab5 443 return SUCCESS;
pmallick 5:ca8fe90d3ab5 444 }
pmallick 5:ca8fe90d3ab5 445
pmallick 5:ca8fe90d3ab5 446
pmallick 5:ca8fe90d3ab5 447
pmallick 5:ca8fe90d3ab5 448
pmallick 5:ca8fe90d3ab5 449 static uint8_t guide()
pmallick 5:ca8fe90d3ab5 450 {
pmallick 5:ca8fe90d3ab5 451
pmallick 5:ca8fe90d3ab5 452 printf("\n\rAD5933-Demo quick-start guide: \n\n");
pmallick 5:ca8fe90d3ab5 453 printf("This program can be used both as a demo of the AD5933 impedance \n");
pmallick 5:ca8fe90d3ab5 454 printf("measurement system and as a starting point for developing a \n");
pmallick 5:ca8fe90d3ab5 455 printf("more advanced program for prototyping. This program is not \n");
pmallick 5:ca8fe90d3ab5 456 printf("provided as production-quality code, but as a helpful starting point.\n\n");
pmallick 5:ca8fe90d3ab5 457
pmallick 5:ca8fe90d3ab5 458 printf("As a quick start, the following steps can be implemented to ensure\n");
pmallick 5:ca8fe90d3ab5 459 printf("firmware is communcating with the board and measurements taking place.\n\n");
pmallick 5:ca8fe90d3ab5 460
pmallick 5:ca8fe90d3ab5 461 printf("Firstly - use menu option 1 to read the on-chip temperature.\n");
pmallick 5:ca8fe90d3ab5 462 printf("If a realistic temperature comes back - you are good to go :)\n\n");
pmallick 5:ca8fe90d3ab5 463
pmallick 5:ca8fe90d3ab5 464 printf("Step 1\tConnect a 200k Resistor across the SMA terminals of the PMOD 1A\n");
pmallick 5:ca8fe90d3ab5 465 printf("Step 2\tSelect the 100k feedback resistor by pulling the SEL pin high\n");
pmallick 5:ca8fe90d3ab5 466 printf("Step 2\tConfigure the impedance system with Menu Option 2\n");
pmallick 5:ca8fe90d3ab5 467 printf("Step 3\tCalculate the gain factor with menu-item 3\n");
pmallick 5:ca8fe90d3ab5 468 printf("Step 3\tReplace the 200k impedance across the SMA terminals with a \n");
pmallick 5:ca8fe90d3ab5 469 printf("different 'unknown' impedance (300K perhaps)\n");
pmallick 5:ca8fe90d3ab5 470 printf("Step 4\tRun the impedance measurement with menu-item 4\n");
pmallick 5:ca8fe90d3ab5 471 printf("\tresults are dispayed on the terminal\n");
pmallick 5:ca8fe90d3ab5 472
pmallick 5:ca8fe90d3ab5 473 return SUCCESS;
pmallick 5:ca8fe90d3ab5 474 }
pmallick 5:ca8fe90d3ab5 475
pmallick 5:ca8fe90d3ab5 476
pmallick 5:ca8fe90d3ab5 477
pmallick 5:ca8fe90d3ab5 478 static uint8_t impedance_sweep()
pmallick 5:ca8fe90d3ab5 479 {
pmallick 5:ca8fe90d3ab5 480 printf("\nPerform a sweep to calculate an unknown impedance (see datasheet for information)\n");
pmallick 5:ca8fe90d3ab5 481 printf("System should have been previously configured (Menu Option 2)\n");
pmallick 5:ca8fe90d3ab5 482 printf("Impedance will be caculated and results shown.\n\r");
pmallick 5:ca8fe90d3ab5 483
pmallick 5:ca8fe90d3ab5 484 int32_t status = FAILURE;
pmallick 5:ca8fe90d3ab5 485 double impedance;
pmallick 5:ca8fe90d3ab5 486 float frequency = config_data.start_freq;
pmallick 5:ca8fe90d3ab5 487
pmallick 5:ca8fe90d3ab5 488
pmallick 5:ca8fe90d3ab5 489 ad5933_config_sweep(device,
pmallick 5:ca8fe90d3ab5 490 config_data.start_freq,
pmallick 5:ca8fe90d3ab5 491 config_data.frequency_increment,
pmallick 5:ca8fe90d3ab5 492 config_data.number_increments);
pmallick 5:ca8fe90d3ab5 493
pmallick 5:ca8fe90d3ab5 494 /*
pmallick 5:ca8fe90d3ab5 495 > program frequency sweep parameters into relevant registerS
pmallick 5:ca8fe90d3ab5 496 > place the ad5933 into standby mode.
pmallick 5:ca8fe90d3ab5 497 > start frequency register
pmallick 5:ca8fe90d3ab5 498 > number of increments register
pmallick 5:ca8fe90d3ab5 499 */
pmallick 5:ca8fe90d3ab5 500 ad5933_start_sweep(device);
pmallick 5:ca8fe90d3ab5 501 printf("\n FREQUENCY MAGNITUDE PHASE IMPEDANCE\n");
pmallick 5:ca8fe90d3ab5 502
pmallick 5:ca8fe90d3ab5 503 do {
pmallick 5:ca8fe90d3ab5 504
pmallick 5:ca8fe90d3ab5 505 //Fill up the results struct with data
pmallick 5:ca8fe90d3ab5 506 impedance = ad5933_calculate_impedance(device,
pmallick 5:ca8fe90d3ab5 507 gain_factor,
pmallick 5:ca8fe90d3ab5 508 AD5933_FUNCTION_INC_FREQ);
pmallick 5:ca8fe90d3ab5 509
pmallick 5:ca8fe90d3ab5 510 printf(" %.2f,", frequency);
pmallick 5:ca8fe90d3ab5 511 printf(" %.2f\n", impedance);
pmallick 5:ca8fe90d3ab5 512
pmallick 5:ca8fe90d3ab5 513 frequency += config_data.frequency_increment;
pmallick 5:ca8fe90d3ab5 514
pmallick 5:ca8fe90d3ab5 515 //poll the status register to check if frequency sweep is complete.
pmallick 5:ca8fe90d3ab5 516 status = ad5933_get_register_value(device, AD5933_REG_STATUS, 1);
pmallick 5:ca8fe90d3ab5 517
pmallick 5:ca8fe90d3ab5 518 } while ((status & AD5933_STAT_SWEEP_DONE) == 0);
pmallick 5:ca8fe90d3ab5 519
pmallick 5:ca8fe90d3ab5 520 return status;
pmallick 5:ca8fe90d3ab5 521 }
pmallick 5:ca8fe90d3ab5 522
pmallick 5:ca8fe90d3ab5 523
pmallick 5:ca8fe90d3ab5 524
pmallick 5:ca8fe90d3ab5 525