1 ////////////////////////////////////////////////////////////////////////////////////// 2 // The MIT License (MIT) 3 // 4 // Submit Date: 03/09/2015 5 // Author: Juan Jose Chong <juanjchong (at) gmail.com> 6 // Copyright (c) 2015 Juan Jose Chong 7 // 8 ////////////////////////////////////////////////////////////////////////////////////// 9 // adis16448.h 10 ////////////////////////////////////////////////////////////////////////////////////// 11 // 12 // This library runs on an Intel Edison and uses mraa to acquire data 13 // from an ADIS16448. This data is then scaled and printed onto the terminal. 14 // 15 // This software has been tested to connect to an ADIS16448 through a level shifter 16 // such as the TI TXB0104. The SPI lines (DIN, DOUT, SCLK, /CS) are all wired through 17 // the level shifter and the ADIS16448 is also being powered by the Intel Edison. 18 // 19 // Permission is hereby granted, free of charge, to any person obtaining 20 // a copy of this software and associated documentation files (the 21 // "Software"), to deal in the Software without restriction, including 22 // without limitation the rights to use, copy, modify, merge, publish, 23 // distribute, sublicense, and/or sell copies of the Software, and to 24 // permit persons to whom the Software is furnished to do so, subject to 25 // the following conditions: 26 // 27 // The above copyright notice and this permission notice shall be 28 // included in all copies or substantial portions of the Software. 29 // 30 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 31 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 32 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 33 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 34 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 35 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 36 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 37 // 38 ////////////////////////////////////////////////////////////////////////////////////// 39 #include <string> 40 #include <mraa/spi.h> 41 #include <mraa/gpio.h> 42 43 // User Register Memory Map from Table 6 of the Datasheet 44 #define FLASH_CNT 0x00 //Flash memory write count 45 #define XGYRO_OUT 0x04 //X-axis gyroscope output 46 #define YGYRO_OUT 0x06 //Y-axis gyroscope output 47 #define ZGYRO_OUT 0x08 //Z-axis gyroscope output 48 #define XACCL_OUT 0x0A //X-axis accelerometer output 49 #define YACCL_OUT 0x0C //Y-axis accelerometer output 50 #define ZACCL_OUT 0x0E //Z-axis accelerometer output 51 #define XMAGN_OUT 0X10 //X-axis magnetometer output 52 #define YMAGN_OUT 0x12 //Y-axis magnetometer output 53 #define ZMAGN_OUT 0x14 //Z-axis magnetometer output 54 #define BARO_OUT 0x16 //Barometer pressure measurement, high word 55 #define TEMP_OUT 0x18 //Temperature output 56 #define XGYRO_OFF 0x1A //X-axis gyroscope bias offset factor 57 #define YGYRO_OFF 0x1C //Y-axis gyroscope bias offset factor 58 #define ZGYRO_OFF 0x1E //Z-axis gyroscope bias offset factor 59 #define XACCL_OFF 0x20 //X-axis acceleration bias offset factor 60 #define YACCL_OFF 0x22 //Y-axis acceleration bias offset factor 61 #define ZACCL_OFF 0x24 //Z-axis acceleration bias offset factor 62 #define XMAGN_HIC 0x26 //X-axis magnetometer, hard iron factor 63 #define YMAGN_HIC 0x28 //Y-axis magnetometer, hard iron factor 64 #define ZMAGN_HIC 0x2A //Z-axis magnetometer, hard iron factor 65 #define XMAGN_SIC 0x2C //X-axis magnetometer, soft iron factor 66 #define YMAGN_SIC 0x2E //Y-axis magnetometer, soft iron factor 67 #define ZMAGN_SIC 0x30 //Z-axis magnetometer, soft iron factor 68 #define GPIO_CTRL 0x32 //GPIO control 69 #define MSC_CTRL 0x34 //Misc. control 70 #define SMPL_PRD 0x36 //Sample clock/Decimation filter control 71 #define SENS_AVG 0x38 //Digital filter control 72 #define SEQ_CNT 0x3A //xMAGN_OUT and BARO_OUT counter 73 #define DIAG_STAT 0x3C //System status 74 #define GLOB_CMD 0x3E //System command 75 #define ALM_MAG1 0x40 //Alarm 1 amplitude threshold 76 #define ALM_MAG2 0x42 //Alarm 2 amplitude threshold 77 #define ALM_SMPL1 0x44 //Alarm 1 sample size 78 #define ALM_SMPL2 0x46 //Alarm 2 sample size 79 #define ALM_CTRL 0x48 //Alarm control 80 #define LOT_ID1 0x52 //Lot identification number 81 #define LOT_ID2 0x54 //Lot identification number 82 #define PROD_ID 0x56 //Product identifier 83 #define SERIAL_NUM 0x58 //Lot-specific serial number 84 85 namespace upm { 86 /** 87 * @brief ADIS16448 Accelerometer library 88 * @defgroup adis16448 libupm-adis16448 89 * @ingroup generic spi accelerometer 90 */ 91 92 /** 93 * @library adis16448 94 * @sensor adis16448 95 * @comname ADIS16448 Accelerometer 96 * @type accelerometer 97 * @man generic 98 * @web http://www.analog.com/en/products/sensors/isensor-mems-inertial-measurement-units/adis16448.html 99 * @con spi 100 * 101 * @brief API for the Analog Devices ADIS16448 Accelerometer 102 * 103 * This is an industrial-grade accelerometer by Analog Devices. 104 * 105 * @snippet adis16448.cxx Interesting 106 */ 107 class ADIS16448{ 108 109 public: 110 111 /** 112 * Constructor with configurable HW Reset 113 */ 114 ADIS16448(int bus, int rst); 115 116 /** 117 * Destructor 118 */ 119 ~ADIS16448(); 120 121 /** 122 * Performs hardware reset by sending the specified pin low for 2 seconds 123 */ 124 void resetDUT(); 125 126 /** 127 * Sets SPI frequency, mode, and bits/word 128 */ 129 void configSPI(); 130 131 /** 132 * Reads a specified register and returns data 133 */ 134 int16_t regRead(uint8_t regAddr); 135 136 /** 137 * Writes to a specified register 138 */ 139 void regWrite(uint8_t regAddr, uint16_t regData); 140 141 /** 142 * Scales accelerometer data 143 */ 144 float accelScale(int16_t sensorData); 145 146 /** 147 * Scales gyro data 148 */ 149 float gyroScale(int16_t sensorData); 150 151 /** 152 * Scales temperature data 153 */ 154 float tempScale(int16_t sensorData); 155 156 /** 157 * Scales pressure data 158 */ 159 float pressureScale(int16_t sensorData); 160 161 /** 162 * Scales magnetometer data 163 */ 164 float magnetometerScale(int16_t sensorData); 165 166 private: 167 168 mraa_spi_context _spi; 169 mraa_gpio_context _rst; 170 171 }; 172 } 173 174