Example test suite for my ADIS16467 driver.

Dependencies:   ADIS16467

ADIS16467 Driver Example Tests

These examples show how to use some of the functionality in my ADIS16467 driver. To get started with MBed CLI:

Build Instructions

$ hg clone https://yhnrita@os.mbed.com/users/yhnrita/code/ADIS16467-Tests/
$ cd ADIS16467-Tests
$ mbed deploy
$ mbed compile
Committer:
Rita Yang
Date:
Fri Feb 21 00:36:41 2020 -0800
Revision:
0:38da6269ed5c
Adding source files.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rita Yang 0:38da6269ed5c 1 /*
Rita Yang 0:38da6269ed5c 2 USC RPL ADIS16467 Test Suite
Rita Yang 0:38da6269ed5c 3 Contributors: Rita Yang
Rita Yang 0:38da6269ed5c 4 */
Rita Yang 0:38da6269ed5c 5
Rita Yang 0:38da6269ed5c 6 #include "ADIS16467TestSuite.h"
Rita Yang 0:38da6269ed5c 7
Rita Yang 0:38da6269ed5c 8 #include <cinttypes>
Rita Yang 0:38da6269ed5c 9
Rita Yang 0:38da6269ed5c 10 const char* statusToString(bool status)
Rita Yang 0:38da6269ed5c 11 {
Rita Yang 0:38da6269ed5c 12 if(status)
Rita Yang 0:38da6269ed5c 13 {
Rita Yang 0:38da6269ed5c 14 return "Yes";
Rita Yang 0:38da6269ed5c 15 }
Rita Yang 0:38da6269ed5c 16 else
Rita Yang 0:38da6269ed5c 17 {
Rita Yang 0:38da6269ed5c 18 return "No";
Rita Yang 0:38da6269ed5c 19 }
Rita Yang 0:38da6269ed5c 20 }
Rita Yang 0:38da6269ed5c 21
Rita Yang 0:38da6269ed5c 22 void ADIS16467TestSuite::test_readData() {
Rita Yang 0:38da6269ed5c 23 while(1) {
Rita Yang 0:38da6269ed5c 24 wait_ms(600);
Rita Yang 0:38da6269ed5c 25
Rita Yang 0:38da6269ed5c 26 float gyroX = (float)(imu->readGyroX()) * imu->GYRO_CONV;
Rita Yang 0:38da6269ed5c 27 float gyroY = (float)(imu->readGyroY()) * imu->GYRO_CONV;
Rita Yang 0:38da6269ed5c 28 float gyroZ = (float)(imu->readGyroZ()) * imu->GYRO_CONV;
Rita Yang 0:38da6269ed5c 29 float accelX = (float)(imu->readAccelX()) * imu->ACCEL_CONV;
Rita Yang 0:38da6269ed5c 30 float accelY = (float)(imu->readAccelY()) * imu->ACCEL_CONV;
Rita Yang 0:38da6269ed5c 31 float accelZ = (float)(imu->readAccelZ()) * imu->ACCEL_CONV;
Rita Yang 0:38da6269ed5c 32 float intTemp = (float)(imu->readInternalTemp()) * imu->TEMP_CONV;
Rita Yang 0:38da6269ed5c 33 uint16_t dataCount = imu->readDataCounter();
Rita Yang 0:38da6269ed5c 34
Rita Yang 0:38da6269ed5c 35 pc.printf("Gyro X : %.2f degree/sec\r\n", gyroX);
Rita Yang 0:38da6269ed5c 36 pc.printf("Gyro Y : %.2f degree/sec\r\n", gyroY);
Rita Yang 0:38da6269ed5c 37 pc.printf("Gyro Z : %.2f degree/sec\r\n", gyroZ);
Rita Yang 0:38da6269ed5c 38 pc.printf("Accel X : %.2f mg\r\n", accelX);
Rita Yang 0:38da6269ed5c 39 pc.printf("Accel Y : %.2f mg\r\n", accelY);
Rita Yang 0:38da6269ed5c 40 pc.printf("Accel Z : %.2f mg\r\n", accelZ);
Rita Yang 0:38da6269ed5c 41 pc.printf("Internal Temperature : %.2f C\r\n", intTemp);
Rita Yang 0:38da6269ed5c 42 pc.printf("Data Counter : %5d\r\n", dataCount);
Rita Yang 0:38da6269ed5c 43 pc.printf("\r\n");
Rita Yang 0:38da6269ed5c 44 }
Rita Yang 0:38da6269ed5c 45 }
Rita Yang 0:38da6269ed5c 46
Rita Yang 0:38da6269ed5c 47 void ADIS16467TestSuite::test_printFlags() {
Rita Yang 0:38da6269ed5c 48 pc.printf("-----Error Flags-----\r\n");
Rita Yang 0:38da6269ed5c 49 pc.printf("Clock Error : %s\r\n", statusToString(imu->getClockError()));
Rita Yang 0:38da6269ed5c 50 pc.printf("Memory Failure : %s\r\n", statusToString(imu->getMemFailure()));
Rita Yang 0:38da6269ed5c 51 pc.printf("Sensor Failure : %s\r\n", statusToString(imu->getSensorFailure()));
Rita Yang 0:38da6269ed5c 52 pc.printf("Standby Mode : %s\r\n", statusToString(imu->getStandbyMode()));
Rita Yang 0:38da6269ed5c 53 pc.printf("SPI Communication Error : %s\r\n", statusToString(imu->getSPIError()));
Rita Yang 0:38da6269ed5c 54 pc.printf("Flash Memory Update Failure : %s\r\n", statusToString(imu->getFlashUpFail()));
Rita Yang 0:38da6269ed5c 55 pc.printf("Datapath Overrun : %s\r\n", statusToString(imu->getDatapathOverrun()));
Rita Yang 0:38da6269ed5c 56 }
Rita Yang 0:38da6269ed5c 57
Rita Yang 0:38da6269ed5c 58 void ADIS16467TestSuite::test_burstRead() {
Rita Yang 0:38da6269ed5c 59 struct ADIS16467::BurstReadResult result;
Rita Yang 0:38da6269ed5c 60 imu->burstRead(result);
Rita Yang 0:38da6269ed5c 61
Rita Yang 0:38da6269ed5c 62 pc.printf("Gyro X : %.2f degree/sec\r\n", ((float)result.gyroX * imu->GYRO_CONV));
Rita Yang 0:38da6269ed5c 63 pc.printf("Gyro Y : %.2f degree/sec\r\n", ((float)result.gyroY * imu->GYRO_CONV));
Rita Yang 0:38da6269ed5c 64 pc.printf("Gyro Z : %.2f degree/sec\r\n", ((float)result.gyroZ * imu->GYRO_CONV));
Rita Yang 0:38da6269ed5c 65 pc.printf("Accel X : %.2f mg\r\n", ((float)result.accelX * imu->ACCEL_CONV));
Rita Yang 0:38da6269ed5c 66 pc.printf("Accel Y : %.2f mg\r\n", ((float)result.accelY * imu->ACCEL_CONV));
Rita Yang 0:38da6269ed5c 67 pc.printf("Accel Z : %.2f mg\r\n", ((float)result.accelZ * imu->ACCEL_CONV));
Rita Yang 0:38da6269ed5c 68 pc.printf("Internal Temperature : %.2f C\r\n", ((float)result.internalTemp * imu->TEMP_CONV));
Rita Yang 0:38da6269ed5c 69 pc.printf("Data Counter : %5d\r\n", result.dataCounter);
Rita Yang 0:38da6269ed5c 70 pc.printf("Checksum Value : %5d\r\n", result.checkSum);
Rita Yang 0:38da6269ed5c 71
Rita Yang 0:38da6269ed5c 72 imu->setErrorFlags(result.statusDiag);
Rita Yang 0:38da6269ed5c 73 test_printFlags();
Rita Yang 0:38da6269ed5c 74 imu->resetAllFlags();
Rita Yang 0:38da6269ed5c 75 }
Rita Yang 0:38da6269ed5c 76
Rita Yang 0:38da6269ed5c 77 void ADIS16467TestSuite::test_readFlags() {
Rita Yang 0:38da6269ed5c 78 imu->setErrorFlags(imu->readStatDiag());
Rita Yang 0:38da6269ed5c 79 test_printFlags();
Rita Yang 0:38da6269ed5c 80 imu->resetAllFlags();
Rita Yang 0:38da6269ed5c 81 }
Rita Yang 0:38da6269ed5c 82
Rita Yang 0:38da6269ed5c 83 void ADIS16467TestSuite::test_sensorSelfTest() {
Rita Yang 0:38da6269ed5c 84 imu->sensorSelfTest();
Rita Yang 0:38da6269ed5c 85 test_printFlags();
Rita Yang 0:38da6269ed5c 86 imu->resetAllFlags();
Rita Yang 0:38da6269ed5c 87 }
Rita Yang 0:38da6269ed5c 88
Rita Yang 0:38da6269ed5c 89 void ADIS16467TestSuite::test_setPoll(uint16_t pollRate)
Rita Yang 0:38da6269ed5c 90 {
Rita Yang 0:38da6269ed5c 91 const float print_time = 1.0f;
Rita Yang 0:38da6269ed5c 92
Rita Yang 0:38da6269ed5c 93 imu->setPollRate(pollRate);
Rita Yang 0:38da6269ed5c 94 imu->resetDeltaAngle();
Rita Yang 0:38da6269ed5c 95
Rita Yang 0:38da6269ed5c 96 Timer printTimer;
Rita Yang 0:38da6269ed5c 97 printTimer.start();
Rita Yang 0:38da6269ed5c 98
Rita Yang 0:38da6269ed5c 99 while(1)
Rita Yang 0:38da6269ed5c 100 {
Rita Yang 0:38da6269ed5c 101
Rita Yang 0:38da6269ed5c 102 wait(1/ static_cast<float>(pollRate * 2));
Rita Yang 0:38da6269ed5c 103
Rita Yang 0:38da6269ed5c 104 imu->updateDeltaAngles();
Rita Yang 0:38da6269ed5c 105
Rita Yang 0:38da6269ed5c 106 if(printTimer.read() > print_time)
Rita Yang 0:38da6269ed5c 107 {
Rita Yang 0:38da6269ed5c 108 printTimer.reset();
Rita Yang 0:38da6269ed5c 109
Rita Yang 0:38da6269ed5c 110 float gyroX = (float)(imu->readGyroX()) * imu->GYRO_CONV;
Rita Yang 0:38da6269ed5c 111 float gyroY = (float)(imu->readGyroY()) * imu->GYRO_CONV;
Rita Yang 0:38da6269ed5c 112 float gyroZ = (float)(imu->readGyroZ()) * imu->GYRO_CONV;
Rita Yang 0:38da6269ed5c 113 float accelX = (float)(imu->readAccelX()) * imu->ACCEL_CONV;
Rita Yang 0:38da6269ed5c 114 float accelY = (float)(imu->readAccelY()) * imu->ACCEL_CONV;
Rita Yang 0:38da6269ed5c 115 float accelZ = (float)(imu->readAccelZ()) * imu->ACCEL_CONV;
Rita Yang 0:38da6269ed5c 116 float intTemp = (float)(imu->readInternalTemp()) * imu->TEMP_CONV;
Rita Yang 0:38da6269ed5c 117 float timeStamp = (float)(imu->readTimeStamp()) * imu->TIME_CONV;
Rita Yang 0:38da6269ed5c 118 uint16_t dataCount = imu->readDataCounter();
Rita Yang 0:38da6269ed5c 119 float deltaAngXSum = (float)(imu->getDeltaAngleXSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 0:38da6269ed5c 120 float deltaAngYSum = (float)(imu->getDeltaAngleYSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 0:38da6269ed5c 121 float deltaAngZSum = (float)(imu->getDeltaAngleZSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 0:38da6269ed5c 122
Rita Yang 0:38da6269ed5c 123 pc.printf("Gyro X : %.2f degree/sec\r\n", gyroX);
Rita Yang 0:38da6269ed5c 124 pc.printf("Gyro Y : %.2f degree/sec\r\n", gyroY);
Rita Yang 0:38da6269ed5c 125 pc.printf("Gyro Z : %.2f degree/sec\r\n", gyroZ);
Rita Yang 0:38da6269ed5c 126 pc.printf("Accel X : %.2f mg\r\n", accelX);
Rita Yang 0:38da6269ed5c 127 pc.printf("Accel Y : %.2f mg\r\n", accelY);
Rita Yang 0:38da6269ed5c 128 pc.printf("Accel Z : %.2f mg\r\n", accelZ);
Rita Yang 0:38da6269ed5c 129 pc.printf("Delta Angle X Sum: %.2f degree\r\n", deltaAngXSum);
Rita Yang 0:38da6269ed5c 130 pc.printf("Delta Angle Y Sum: %.2f degree\r\n", deltaAngYSum);
Rita Yang 0:38da6269ed5c 131 pc.printf("Delta Angle Z Sum: %.2f degree\r\n", deltaAngZSum);
Rita Yang 0:38da6269ed5c 132 pc.printf("Internal Temperature : %.2f C\r\n", intTemp);
Rita Yang 0:38da6269ed5c 133 pc.printf("Time Stamp : %.2f us\r\n", timeStamp);
Rita Yang 0:38da6269ed5c 134 pc.printf("Data Counter : %5d\r\n", dataCount);
Rita Yang 0:38da6269ed5c 135 pc.printf("\r\n");
Rita Yang 0:38da6269ed5c 136 }
Rita Yang 0:38da6269ed5c 137
Rita Yang 0:38da6269ed5c 138 }
Rita Yang 0:38da6269ed5c 139 }
Rita Yang 0:38da6269ed5c 140
Rita Yang 0:38da6269ed5c 141 void ADIS16467TestSuite::test_calibrateBias()
Rita Yang 0:38da6269ed5c 142 {
Rita Yang 0:38da6269ed5c 143 const uint16_t pollRate = 10; // Hz
Rita Yang 0:38da6269ed5c 144 const float testDuration = 60; // s
Rita Yang 0:38da6269ed5c 145
Rita Yang 0:38da6269ed5c 146 imu->setPollRate(pollRate);
Rita Yang 0:38da6269ed5c 147 imu->resetDeltaAngle();
Rita Yang 0:38da6269ed5c 148
Rita Yang 0:38da6269ed5c 149 pc.printf("Place the IMU on a flat surface and keep it still. Orientation is not important.\r\n");
Rita Yang 0:38da6269ed5c 150
Rita Yang 0:38da6269ed5c 151 wait(5);
Rita Yang 0:38da6269ed5c 152
Rita Yang 0:38da6269ed5c 153
Rita Yang 0:38da6269ed5c 154 Timer testTimer;
Rita Yang 0:38da6269ed5c 155 testTimer.start();
Rita Yang 0:38da6269ed5c 156
Rita Yang 0:38da6269ed5c 157 while(testTimer.read() < testDuration)
Rita Yang 0:38da6269ed5c 158 {
Rita Yang 0:38da6269ed5c 159
Rita Yang 0:38da6269ed5c 160 wait(1/ static_cast<float>(pollRate * 2));
Rita Yang 0:38da6269ed5c 161 imu->updateDeltaAngles();
Rita Yang 0:38da6269ed5c 162
Rita Yang 0:38da6269ed5c 163 float deltaAngXSum = (float)(imu->getDeltaAngleXSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 0:38da6269ed5c 164 float deltaAngYSum = (float)(imu->getDeltaAngleYSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 0:38da6269ed5c 165 float deltaAngZSum = (float)(imu->getDeltaAngleZSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 0:38da6269ed5c 166
Rita Yang 0:38da6269ed5c 167 pc.printf("X Drift: %.2f degree\r\n", deltaAngXSum);
Rita Yang 0:38da6269ed5c 168 pc.printf("Y Drift: %.2f degree\r\n", deltaAngYSum);
Rita Yang 0:38da6269ed5c 169 pc.printf("Z Drift: %.2f degree\r\n", deltaAngZSum);
Rita Yang 0:38da6269ed5c 170 }
Rita Yang 0:38da6269ed5c 171
Rita Yang 0:38da6269ed5c 172 float timeElapsed = testTimer.read();
Rita Yang 0:38da6269ed5c 173
Rita Yang 0:38da6269ed5c 174 float driftRateX = (float)(imu->getDeltaAngleXSum()) * imu->DELTA_ANGLE_CONV / timeElapsed;
Rita Yang 0:38da6269ed5c 175 float driftRateY = (float)(imu->getDeltaAngleYSum()) * imu->DELTA_ANGLE_CONV / timeElapsed;
Rita Yang 0:38da6269ed5c 176 float driftRateZ = (float)(imu->getDeltaAngleZSum()) * imu->DELTA_ANGLE_CONV / timeElapsed;
Rita Yang 0:38da6269ed5c 177
Rita Yang 0:38da6269ed5c 178 pc.printf("To zero X gyro, set bias to: %f degrees/sec\r\n", -1 * driftRateX);
Rita Yang 0:38da6269ed5c 179 pc.printf("To zero Y gyro, set bias to: %f degrees/sec\r\n", -1 * driftRateY);
Rita Yang 0:38da6269ed5c 180 pc.printf("To zero Z gyro, set bias to: %f degrees/sec\r\n", -1 * driftRateZ);
Rita Yang 0:38da6269ed5c 181
Rita Yang 0:38da6269ed5c 182 }
Rita Yang 0:38da6269ed5c 183
Rita Yang 0:38da6269ed5c 184 void ADIS16467TestSuite::test_existence()
Rita Yang 0:38da6269ed5c 185 {
Rita Yang 0:38da6269ed5c 186 pc.printf("The IMU is connected and working: %s\r\n", imu->checkExistence() ? "True" : "False");
Rita Yang 0:38da6269ed5c 187 }
Rita Yang 0:38da6269ed5c 188
Rita Yang 0:38da6269ed5c 189 void ADIS16467TestSuite::test_firmInfo() {
Rita Yang 0:38da6269ed5c 190 struct ADIS16467::FirmwareInfo data;
Rita Yang 0:38da6269ed5c 191 imu->getFirmwareInformation(data);
Rita Yang 0:38da6269ed5c 192
Rita Yang 0:38da6269ed5c 193 pc.printf("Firmware Revision: %" PRIu8 ".%" PRIu8"\r\n", data.firmRevMajor, data.firmRevMinor);
Rita Yang 0:38da6269ed5c 194 pc.printf("Firmware Revision Date: %" PRIu8 "/%" PRIu8 "/%" PRIu16 "\r\n", data.firmwareMonth, data.firmwareDay, data.firmwareYear);
Rita Yang 0:38da6269ed5c 195 pc.printf("Serial Number: 0x%" PRIx16 "\r\n", data.serialNum);
Rita Yang 0:38da6269ed5c 196 }
Rita Yang 0:38da6269ed5c 197
Rita Yang 0:38da6269ed5c 198
Rita Yang 0:38da6269ed5c 199 int main() {
Rita Yang 0:38da6269ed5c 200
Rita Yang 0:38da6269ed5c 201 while(true)
Rita Yang 0:38da6269ed5c 202 {
Rita Yang 0:38da6269ed5c 203 pc.printf("\r\nADIS16467 IMU Test Suite:\r\n");
Rita Yang 0:38da6269ed5c 204
Rita Yang 0:38da6269ed5c 205 ADIS16467::ADIS16467 imuModule = ADIS16467::ADIS16467(&pc, PIN_SPI_MOSI, PIN_SPI_MISO, PIN_SPI_SCK,
Rita Yang 0:38da6269ed5c 206 PIN_ADIS_CS, PIN_ADIS_RST);
Rita Yang 0:38da6269ed5c 207
Rita Yang 0:38da6269ed5c 208 ADIS16467TestSuite harness;
Rita Yang 0:38da6269ed5c 209 harness.imu = &imuModule;
Rita Yang 0:38da6269ed5c 210
Rita Yang 0:38da6269ed5c 211 harness.imu->initADIS();
Rita Yang 0:38da6269ed5c 212
Rita Yang 0:38da6269ed5c 213 int test = -1;
Rita Yang 0:38da6269ed5c 214
Rita Yang 0:38da6269ed5c 215 //Menu
Rita Yang 0:38da6269ed5c 216 pc.printf("Select a test: \n\r");
Rita Yang 0:38da6269ed5c 217 pc.printf("1. Read Data\r\n");
Rita Yang 0:38da6269ed5c 218 pc.printf("2. Read Error Flags\r\n");
Rita Yang 0:38da6269ed5c 219 pc.printf("3. Burst Read\r\n");
Rita Yang 0:38da6269ed5c 220 pc.printf("4. Sensor Self Test\r\n");
Rita Yang 0:38da6269ed5c 221 pc.printf("5. Set Poll Rate\r\n");
Rita Yang 0:38da6269ed5c 222 pc.printf("6. Calibrate Bias\r\n");
Rita Yang 0:38da6269ed5c 223 pc.printf("7. Existence Test\r\n");
Rita Yang 0:38da6269ed5c 224 pc.printf("8. Get Firmware Information\r\n");
Rita Yang 0:38da6269ed5c 225 pc.printf("9. Exit Test Suite\r\n");
Rita Yang 0:38da6269ed5c 226
Rita Yang 0:38da6269ed5c 227 pc.scanf("%d", &test);
Rita Yang 0:38da6269ed5c 228 pc.printf("Running test %d:\r\n\n", test);
Rita Yang 0:38da6269ed5c 229
Rita Yang 0:38da6269ed5c 230 harness.imu->setGyroBiases(-0.11594f, 0.258192f, 0.272063f);
Rita Yang 0:38da6269ed5c 231
Rita Yang 0:38da6269ed5c 232 //Run Tests
Rita Yang 0:38da6269ed5c 233 switch(test) {
Rita Yang 0:38da6269ed5c 234 case 1 : harness.test_readData(); break;
Rita Yang 0:38da6269ed5c 235 case 2 : harness.test_readFlags(); break;
Rita Yang 0:38da6269ed5c 236 case 3 : harness.test_burstRead(); break;
Rita Yang 0:38da6269ed5c 237 case 4 : harness.test_sensorSelfTest(); break;
Rita Yang 0:38da6269ed5c 238 case 5 :
Rita Yang 0:38da6269ed5c 239 {
Rita Yang 0:38da6269ed5c 240 int rate = -1;
Rita Yang 0:38da6269ed5c 241 pc.printf("Input poll rate: ");
Rita Yang 0:38da6269ed5c 242 pc.scanf("%d", &rate);
Rita Yang 0:38da6269ed5c 243 harness.test_setPoll(rate);
Rita Yang 0:38da6269ed5c 244 }
Rita Yang 0:38da6269ed5c 245 case 6 : harness.test_calibrateBias(); break;
Rita Yang 0:38da6269ed5c 246 case 7 : harness.test_existence(); break;
Rita Yang 0:38da6269ed5c 247 case 8 : harness.test_firmInfo(); break;
Rita Yang 0:38da6269ed5c 248 case 9 : printf("Exiting Test Suite.\r\n"); return 0;
Rita Yang 0:38da6269ed5c 249 default : printf("Invalid Test Number Selection. Please Run Again.\r\n"); return 1;
Rita Yang 0:38da6269ed5c 250 }
Rita Yang 0:38da6269ed5c 251
Rita Yang 0:38da6269ed5c 252 pc.printf("Done.\r\n");
Rita Yang 0:38da6269ed5c 253
Rita Yang 0:38da6269ed5c 254 }
Rita Yang 0:38da6269ed5c 255
Rita Yang 0:38da6269ed5c 256 }
Rita Yang 0:38da6269ed5c 257
Rita Yang 0:38da6269ed5c 258
Rita Yang 0:38da6269ed5c 259
Rita Yang 0:38da6269ed5c 260