Example program for EVAL-ADMX2001
Dependencies: ADMX2001
measure.cpp@5:746e78113d7d, 2021-10-27 (annotated)
- Committer:
- nsheth
- Date:
- Wed Oct 27 06:58:57 2021 +0000
- Revision:
- 5:746e78113d7d
- Child:
- 8:bd0b93e35392
Changes for measurement and calibration using different test loads
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nsheth | 5:746e78113d7d | 1 | /* Copyright (c) 2021 Analog Devices, Inc. All rights reserved. |
nsheth | 5:746e78113d7d | 2 | |
nsheth | 5:746e78113d7d | 3 | Redistribution and use in source and binary forms, with or without modification, |
nsheth | 5:746e78113d7d | 4 | are permitted provided that the following conditions are met: |
nsheth | 5:746e78113d7d | 5 | - Redistributions of source code must retain the above copyright notice, |
nsheth | 5:746e78113d7d | 6 | this list of conditions and the following disclaimer. |
nsheth | 5:746e78113d7d | 7 | - Redistributions in binary form must reproduce the above copyright notice, |
nsheth | 5:746e78113d7d | 8 | this list of conditions and the following disclaimer in the documentation |
nsheth | 5:746e78113d7d | 9 | and/or other materials provided with the distribution. |
nsheth | 5:746e78113d7d | 10 | - Modified versions of the software must be conspicuously marked as such. |
nsheth | 5:746e78113d7d | 11 | - This software is licensed solely and exclusively for use with processors/products |
nsheth | 5:746e78113d7d | 12 | manufactured by or for Analog Devices, Inc. |
nsheth | 5:746e78113d7d | 13 | - This software may not be combined or merged with other code in any manner |
nsheth | 5:746e78113d7d | 14 | that would cause the software to become subject to terms and conditions which |
nsheth | 5:746e78113d7d | 15 | differ from those listed here. |
nsheth | 5:746e78113d7d | 16 | - Neither the name of Analog Devices, Inc. nor the names of its contributors |
nsheth | 5:746e78113d7d | 17 | may be used to endorse or promote products derived from this software without |
nsheth | 5:746e78113d7d | 18 | specific prior written permission. |
nsheth | 5:746e78113d7d | 19 | - The use of this software may or may not infringe the patent rights of one or |
nsheth | 5:746e78113d7d | 20 | more patent holders. This license does not release you from the requirement |
nsheth | 5:746e78113d7d | 21 | that you obtain separate licenses from these patent holders to use this software. |
nsheth | 5:746e78113d7d | 22 | |
nsheth | 5:746e78113d7d | 23 | THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND |
nsheth | 5:746e78113d7d | 24 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, |
nsheth | 5:746e78113d7d | 25 | TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN |
nsheth | 5:746e78113d7d | 26 | NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
nsheth | 5:746e78113d7d | 27 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES |
nsheth | 5:746e78113d7d | 28 | (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL |
nsheth | 5:746e78113d7d | 29 | PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
nsheth | 5:746e78113d7d | 30 | OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
nsheth | 5:746e78113d7d | 31 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
nsheth | 5:746e78113d7d | 32 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
nsheth | 5:746e78113d7d | 33 | EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
nsheth | 5:746e78113d7d | 34 | |
nsheth | 5:746e78113d7d | 35 | 2021-01-10-7CBSD SLA |
nsheth | 5:746e78113d7d | 36 | */ |
nsheth | 5:746e78113d7d | 37 | |
nsheth | 5:746e78113d7d | 38 | /*============= I N C L U D E S =============*/ |
nsheth | 5:746e78113d7d | 39 | #include "ADMX2001.h" |
nsheth | 5:746e78113d7d | 40 | #include "ADMX2001_commands.h" |
nsheth | 5:746e78113d7d | 41 | #include "message.h" |
nsheth | 5:746e78113d7d | 42 | #include "measure.h" |
nsheth | 5:746e78113d7d | 43 | #include <stdint.h> |
nsheth | 5:746e78113d7d | 44 | #include <stdio.h> |
nsheth | 5:746e78113d7d | 45 | #include <stdlib.h> |
nsheth | 5:746e78113d7d | 46 | |
nsheth | 5:746e78113d7d | 47 | /** maximum length for buffer for string operation */ |
nsheth | 5:746e78113d7d | 48 | #define MAX_DISPLAY_LENGTH 128 |
nsheth | 5:746e78113d7d | 49 | /** maximum length for buffer for storing measurement values */ |
nsheth | 5:746e78113d7d | 50 | #define MAX_MEASUREMENT_BUFFER 512 |
nsheth | 5:746e78113d7d | 51 | /** buffer for string operation */ |
nsheth | 5:746e78113d7d | 52 | char displayString[MAX_DISPLAY_LENGTH]; |
nsheth | 5:746e78113d7d | 53 | /** Array to store measurement values*/ |
nsheth | 5:746e78113d7d | 54 | double measurementBuffer[MAX_MEASUREMENT_BUFFER]; |
nsheth | 5:746e78113d7d | 55 | /** Array to store sweep points*/ |
nsheth | 5:746e78113d7d | 56 | double sweepPoints[MAX_MEASUREMENT_BUFFER]; |
nsheth | 5:746e78113d7d | 57 | |
nsheth | 5:746e78113d7d | 58 | extern Admx200xDev admx200xDev; |
nsheth | 5:746e78113d7d | 59 | |
nsheth | 5:746e78113d7d | 60 | static int32_t GetAttributeInt32(uint32_t attributeID, int32_t *pValue); |
nsheth | 5:746e78113d7d | 61 | |
nsheth | 5:746e78113d7d | 62 | static int32_t ReadAndDisplay(SWEEP_TYPE sweepType); |
nsheth | 5:746e78113d7d | 63 | |
nsheth | 5:746e78113d7d | 64 | static void DisplayMeasuredValue(double displayVal1, double displayVal2, |
nsheth | 5:746e78113d7d | 65 | double sweepVar); |
nsheth | 5:746e78113d7d | 66 | |
nsheth | 5:746e78113d7d | 67 | int32_t GetAttributeInt32(uint32_t attributeID, int32_t *pValue) |
nsheth | 5:746e78113d7d | 68 | { |
nsheth | 5:746e78113d7d | 69 | int32_t status = ADMX_STATUS_SUCCESS; |
nsheth | 5:746e78113d7d | 70 | uint8_t cmdID; |
nsheth | 5:746e78113d7d | 71 | uint16_t addr = 0; |
nsheth | 5:746e78113d7d | 72 | |
nsheth | 5:746e78113d7d | 73 | uint32_t statReg; |
nsheth | 5:746e78113d7d | 74 | uint32_t data; |
nsheth | 5:746e78113d7d | 75 | cmdID = attributeID; |
nsheth | 5:746e78113d7d | 76 | cmdID |= CMD_READ_BITM; |
nsheth | 5:746e78113d7d | 77 | status = Admx200xSendCmd(&admx200xDev, &cmdID, &addr, &data, &statReg); |
nsheth | 5:746e78113d7d | 78 | if (status == ADMX_STATUS_SUCCESS) |
nsheth | 5:746e78113d7d | 79 | { |
nsheth | 5:746e78113d7d | 80 | status = (int32_t)(statReg & ADMX200X_STATUS_CODE_BITM); |
nsheth | 5:746e78113d7d | 81 | cmdID = CMD_RESULT_READ; |
nsheth | 5:746e78113d7d | 82 | status = Admx200xReadData(&admx200xDev, cmdID, (uint32_t *)pValue); |
nsheth | 5:746e78113d7d | 83 | } |
nsheth | 5:746e78113d7d | 84 | |
nsheth | 5:746e78113d7d | 85 | return status; |
nsheth | 5:746e78113d7d | 86 | } |
nsheth | 5:746e78113d7d | 87 | |
nsheth | 5:746e78113d7d | 88 | /** |
nsheth | 5:746e78113d7d | 89 | * @brief Dsiplays the output value |
nsheth | 5:746e78113d7d | 90 | * \ref DisplayMeasuredValue |
nsheth | 5:746e78113d7d | 91 | */ |
nsheth | 5:746e78113d7d | 92 | void DisplayMeasuredValue(double displayVal1, double displayVal2, |
nsheth | 5:746e78113d7d | 93 | double sweepVar) |
nsheth | 5:746e78113d7d | 94 | { |
nsheth | 5:746e78113d7d | 95 | snprintf(&displayString[0], MAX_DISPLAY_LENGTH, |
nsheth | 5:746e78113d7d | 96 | "%d,%0.6e,%0.6e\n\r", (int32_t)sweepVar, displayVal1, |
nsheth | 5:746e78113d7d | 97 | displayVal2); |
nsheth | 5:746e78113d7d | 98 | printf("%s", &displayString[0]); |
nsheth | 5:746e78113d7d | 99 | } |
nsheth | 5:746e78113d7d | 100 | |
nsheth | 5:746e78113d7d | 101 | /** |
nsheth | 5:746e78113d7d | 102 | * @brief Function to read and display measured values |
nsheth | 5:746e78113d7d | 103 | */ |
nsheth | 5:746e78113d7d | 104 | int32_t ReadAndDisplay(SWEEP_TYPE sweepType) |
nsheth | 5:746e78113d7d | 105 | { |
nsheth | 5:746e78113d7d | 106 | int32_t i; |
nsheth | 5:746e78113d7d | 107 | int32_t status = ADMX_STATUS_SUCCESS; |
nsheth | 5:746e78113d7d | 108 | |
nsheth | 5:746e78113d7d | 109 | Admx200xDev *pAdmx200x = &admx200xDev; |
nsheth | 5:746e78113d7d | 110 | uint8_t cmdId = 0; |
nsheth | 5:746e78113d7d | 111 | uint16_t addr = 0; |
nsheth | 5:746e78113d7d | 112 | uint32_t statReg; |
nsheth | 5:746e78113d7d | 113 | |
nsheth | 5:746e78113d7d | 114 | int32_t numValues = |
nsheth | 5:746e78113d7d | 115 | sizeof(measurementBuffer) / sizeof(measurementBuffer[0]); |
nsheth | 5:746e78113d7d | 116 | |
nsheth | 5:746e78113d7d | 117 | if (status == 0) |
nsheth | 5:746e78113d7d | 118 | { |
nsheth | 5:746e78113d7d | 119 | status = Admx200xReadFifo(pAdmx200x, &measurementBuffer[0], &numValues); |
nsheth | 5:746e78113d7d | 120 | } |
nsheth | 5:746e78113d7d | 121 | // Read sweep points |
nsheth | 5:746e78113d7d | 122 | if (status == 0) |
nsheth | 5:746e78113d7d | 123 | { |
nsheth | 5:746e78113d7d | 124 | cmdId = CMD_READ_SWEEP_POINTS; |
nsheth | 5:746e78113d7d | 125 | numValues /= 2; |
nsheth | 5:746e78113d7d | 126 | status = Admx200xSendCmd(pAdmx200x, &cmdId, &addr, |
nsheth | 5:746e78113d7d | 127 | (uint32_t *)&numValues, &statReg); |
nsheth | 5:746e78113d7d | 128 | } |
nsheth | 5:746e78113d7d | 129 | // Read sweep points |
nsheth | 5:746e78113d7d | 130 | if (status == 0) |
nsheth | 5:746e78113d7d | 131 | { |
nsheth | 5:746e78113d7d | 132 | status = Admx200xReadFifo(pAdmx200x, &sweepPoints[0], &numValues); |
nsheth | 5:746e78113d7d | 133 | } |
nsheth | 5:746e78113d7d | 134 | |
nsheth | 5:746e78113d7d | 135 | if (status == 0) |
nsheth | 5:746e78113d7d | 136 | { |
nsheth | 5:746e78113d7d | 137 | for (i = 0; i < numValues; i++) |
nsheth | 5:746e78113d7d | 138 | { |
nsheth | 5:746e78113d7d | 139 | DisplayMeasuredValue(measurementBuffer[2 * i], |
nsheth | 5:746e78113d7d | 140 | measurementBuffer[2 * i + 1], sweepPoints[i]); |
nsheth | 5:746e78113d7d | 141 | } |
nsheth | 5:746e78113d7d | 142 | } |
nsheth | 5:746e78113d7d | 143 | |
nsheth | 5:746e78113d7d | 144 | return status; |
nsheth | 5:746e78113d7d | 145 | } |
nsheth | 5:746e78113d7d | 146 | |
nsheth | 5:746e78113d7d | 147 | int32_t TriggerAndMeasure() |
nsheth | 5:746e78113d7d | 148 | { |
nsheth | 5:746e78113d7d | 149 | int32_t status = 0; |
nsheth | 5:746e78113d7d | 150 | int32_t warningStatus = 0; |
nsheth | 5:746e78113d7d | 151 | uint8_t cmdId; |
nsheth | 5:746e78113d7d | 152 | uint16_t addr; |
nsheth | 5:746e78113d7d | 153 | uint32_t data; |
nsheth | 5:746e78113d7d | 154 | uint32_t statReg; |
nsheth | 5:746e78113d7d | 155 | Admx200xDev *pAdmx200x = &admx200xDev; |
nsheth | 5:746e78113d7d | 156 | uint32_t measureStatus; |
nsheth | 5:746e78113d7d | 157 | int32_t sweepType; |
nsheth | 5:746e78113d7d | 158 | addr = 0; |
nsheth | 5:746e78113d7d | 159 | data = 0; |
nsheth | 5:746e78113d7d | 160 | |
nsheth | 5:746e78113d7d | 161 | /** These are required to display the output **/ |
nsheth | 5:746e78113d7d | 162 | |
nsheth | 5:746e78113d7d | 163 | /* |
nsheth | 5:746e78113d7d | 164 | if (status == ADMX_STATUS_SUCCESS) |
nsheth | 5:746e78113d7d | 165 | { |
nsheth | 5:746e78113d7d | 166 | status = GetAttributeInt32((0x20 + 37), &resistanceMode); |
nsheth | 5:746e78113d7d | 167 | } |
nsheth | 5:746e78113d7d | 168 | */ |
nsheth | 5:746e78113d7d | 169 | |
nsheth | 5:746e78113d7d | 170 | if (status == ADMX_STATUS_SUCCESS) |
nsheth | 5:746e78113d7d | 171 | { |
nsheth | 5:746e78113d7d | 172 | cmdId = CMD_Z; |
nsheth | 5:746e78113d7d | 173 | warningStatus = |
nsheth | 5:746e78113d7d | 174 | Admx200xSendCmd(pAdmx200x, &cmdId, &addr, &data, &statReg); |
nsheth | 5:746e78113d7d | 175 | if (warningStatus == ADMX_STATUS_INVALID_CURRENT_GAIN || |
nsheth | 5:746e78113d7d | 176 | warningStatus == ADMX_STATUS_INVALID_DISPLAY_MODE || |
nsheth | 5:746e78113d7d | 177 | warningStatus == ADMX_STATUS_UNCOMMITED_CAL || |
nsheth | 5:746e78113d7d | 178 | warningStatus == ADMX_STATUS_SUCCESS) |
nsheth | 5:746e78113d7d | 179 | { |
nsheth | 5:746e78113d7d | 180 | warningStatus = Admx200xWaitForStatus( |
nsheth | 5:746e78113d7d | 181 | pAdmx200x, SPI_TIMEOUT, ADMX200X_STATUS_MEASURE_DONE_BITM, |
nsheth | 5:746e78113d7d | 182 | &measureStatus); |
nsheth | 5:746e78113d7d | 183 | } |
nsheth | 5:746e78113d7d | 184 | else |
nsheth | 5:746e78113d7d | 185 | { |
nsheth | 5:746e78113d7d | 186 | status = warningStatus; |
nsheth | 5:746e78113d7d | 187 | } |
nsheth | 5:746e78113d7d | 188 | //PrintWarningMessages(); |
nsheth | 5:746e78113d7d | 189 | } |
nsheth | 5:746e78113d7d | 190 | |
nsheth | 5:746e78113d7d | 191 | if (warningStatus == ADMX_STATUS_INVALID_CURRENT_GAIN || |
nsheth | 5:746e78113d7d | 192 | warningStatus == ADMX_STATUS_INVALID_DISPLAY_MODE || |
nsheth | 5:746e78113d7d | 193 | warningStatus == ADMX_STATUS_UNCOMMITED_CAL || |
nsheth | 5:746e78113d7d | 194 | warningStatus == ADMX_STATUS_SUCCESS) |
nsheth | 5:746e78113d7d | 195 | { |
nsheth | 5:746e78113d7d | 196 | status = ReadAndDisplay((SWEEP_TYPE)sweepType); |
nsheth | 5:746e78113d7d | 197 | } |
nsheth | 5:746e78113d7d | 198 | else |
nsheth | 5:746e78113d7d | 199 | { |
nsheth | 5:746e78113d7d | 200 | // Clear the error |
nsheth | 5:746e78113d7d | 201 | Admx200xClearSPI(pAdmx200x); |
nsheth | 5:746e78113d7d | 202 | // Send abort command to bring state machine to IDLE if it got stuck |
nsheth | 5:746e78113d7d | 203 | cmdId = CMD_ABORT; |
nsheth | 5:746e78113d7d | 204 | Admx200xSendCmd(pAdmx200x, &cmdId, &addr, &data, &statReg); |
nsheth | 5:746e78113d7d | 205 | } |
nsheth | 5:746e78113d7d | 206 | |
nsheth | 5:746e78113d7d | 207 | if (status == ADMX_STATUS_SUCCESS) |
nsheth | 5:746e78113d7d | 208 | { |
nsheth | 5:746e78113d7d | 209 | status = warningStatus; |
nsheth | 5:746e78113d7d | 210 | } |
nsheth | 5:746e78113d7d | 211 | |
nsheth | 5:746e78113d7d | 212 | return status; |
nsheth | 5:746e78113d7d | 213 | } |
nsheth | 5:746e78113d7d | 214 | |
nsheth | 5:746e78113d7d | 215 | void PrintMeasureStatusMessage(int32_t status) |
nsheth | 5:746e78113d7d | 216 | { |
nsheth | 5:746e78113d7d | 217 | switch (status) |
nsheth | 5:746e78113d7d | 218 | { |
nsheth | 5:746e78113d7d | 219 | case ADMX_STATUS_SUCCESS: |
nsheth | 5:746e78113d7d | 220 | break; |
nsheth | 5:746e78113d7d | 221 | case ADMX_STATUS_INVALID_CURRENT_GAIN: |
nsheth | 5:746e78113d7d | 222 | WARN_MSG("DC Resistance Mode: invalid current gain"); |
nsheth | 5:746e78113d7d | 223 | break; |
nsheth | 5:746e78113d7d | 224 | case ADMX_STATUS_INVALID_DISPLAY_MODE: |
nsheth | 5:746e78113d7d | 225 | /** Admittance mode is not supported.Only impedance*/ |
nsheth | 5:746e78113d7d | 226 | WARN_MSG("DC Resistance Mode: invalid display type"); |
nsheth | 5:746e78113d7d | 227 | break; |
nsheth | 5:746e78113d7d | 228 | case ADMX_STATUS_UNCOMMITED_CAL: |
nsheth | 5:746e78113d7d | 229 | WARN_MSG("Uncommitted calibration coefficients found for (vg, ig)"); |
nsheth | 5:746e78113d7d | 230 | INFO_MSG("Use cal commit to save this to flash"); |
nsheth | 5:746e78113d7d | 231 | break; |
nsheth | 5:746e78113d7d | 232 | default: |
nsheth | 5:746e78113d7d | 233 | ERROR_MSG("Measurement failed"); |
nsheth | 5:746e78113d7d | 234 | break; |
nsheth | 5:746e78113d7d | 235 | } |
nsheth | 5:746e78113d7d | 236 | } |
nsheth | 5:746e78113d7d | 237 | |
nsheth | 5:746e78113d7d | 238 |