EVAL-AD593x Mbed Project.

Dependencies:   platform_drivers

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