SRK Version of mDot LoRa_Sensormode_SRK
Dependencies: libmDot mbed-rtos mbed
Fork of mDot_LoRa_Sensornode by
app/MPU9250.cpp@0:f2815503561f, 2016-07-06 (annotated)
- Committer:
- mitea1
- Date:
- Wed Jul 06 20:40:36 2016 +0000
- Revision:
- 0:f2815503561f
initial commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mitea1 | 0:f2815503561f | 1 | /* |
mitea1 | 0:f2815503561f | 2 | * MPU9250.cpp |
mitea1 | 0:f2815503561f | 3 | * |
mitea1 | 0:f2815503561f | 4 | * Created on: 19.05.2016 |
mitea1 | 0:f2815503561f | 5 | * Author: Adrian |
mitea1 | 0:f2815503561f | 6 | */ |
mitea1 | 0:f2815503561f | 7 | |
mitea1 | 0:f2815503561f | 8 | #include "MPU9250.h" |
mitea1 | 0:f2815503561f | 9 | |
mitea1 | 0:f2815503561f | 10 | MPU9250::MPU9250(I2C_RT* i2c){ |
mitea1 | 0:f2815503561f | 11 | setI2c(i2c); |
mitea1 | 0:f2815503561f | 12 | this->config = new MPU9250Config(); |
mitea1 | 0:f2815503561f | 13 | } |
mitea1 | 0:f2815503561f | 14 | |
mitea1 | 0:f2815503561f | 15 | MPU9250::~MPU9250() { |
mitea1 | 0:f2815503561f | 16 | // TODO Auto-generated destructor stub |
mitea1 | 0:f2815503561f | 17 | } |
mitea1 | 0:f2815503561f | 18 | |
mitea1 | 0:f2815503561f | 19 | void MPU9250::setI2c(I2C_RT* i2c){ |
mitea1 | 0:f2815503561f | 20 | this->i2c = i2c; |
mitea1 | 0:f2815503561f | 21 | } |
mitea1 | 0:f2815503561f | 22 | |
mitea1 | 0:f2815503561f | 23 | void MPU9250::init(MPU9250_MODE desiredMode){ |
mitea1 | 0:f2815503561f | 24 | config->build(desiredMode); |
mitea1 | 0:f2815503561f | 25 | enableAxisAccelerationMeasurement(); |
mitea1 | 0:f2815503561f | 26 | enableAxisGyroscopeMeasurement(); |
mitea1 | 0:f2815503561f | 27 | enableAxisTeslaMeasurement(); |
mitea1 | 0:f2815503561f | 28 | configureInterrupts(); |
mitea1 | 0:f2815503561f | 29 | setWakeOnReceiveThreshold(); |
mitea1 | 0:f2815503561f | 30 | } |
mitea1 | 0:f2815503561f | 31 | |
mitea1 | 0:f2815503561f | 32 | float MPU9250::getXAxisAcceleration(){ |
mitea1 | 0:f2815503561f | 33 | uint8_t xAccelarationHighByte; |
mitea1 | 0:f2815503561f | 34 | uint8_t xAccelarationLowByte; |
mitea1 | 0:f2815503561f | 35 | |
mitea1 | 0:f2815503561f | 36 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_XOUT_H,false, |
mitea1 | 0:f2815503561f | 37 | &xAccelarationHighByte,1); |
mitea1 | 0:f2815503561f | 38 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_XOUT_L,false, |
mitea1 | 0:f2815503561f | 39 | &xAccelarationLowByte,1); |
mitea1 | 0:f2815503561f | 40 | |
mitea1 | 0:f2815503561f | 41 | int16_t acceleration = ((int16_t)xAccelarationHighByte<<8)|((int16_t)xAccelarationLowByte); |
mitea1 | 0:f2815503561f | 42 | |
mitea1 | 0:f2815503561f | 43 | return ((float) acceleration)/config->getAccelerationDivider(); |
mitea1 | 0:f2815503561f | 44 | |
mitea1 | 0:f2815503561f | 45 | } |
mitea1 | 0:f2815503561f | 46 | |
mitea1 | 0:f2815503561f | 47 | float MPU9250::getYAxisAcceleration(){ |
mitea1 | 0:f2815503561f | 48 | uint8_t yAccelarationHighByte; |
mitea1 | 0:f2815503561f | 49 | uint8_t yAccelarationLowByte; |
mitea1 | 0:f2815503561f | 50 | |
mitea1 | 0:f2815503561f | 51 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_YOUT_H,false, |
mitea1 | 0:f2815503561f | 52 | &yAccelarationHighByte,1); |
mitea1 | 0:f2815503561f | 53 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_YOUT_L,false, |
mitea1 | 0:f2815503561f | 54 | &yAccelarationLowByte,1); |
mitea1 | 0:f2815503561f | 55 | |
mitea1 | 0:f2815503561f | 56 | int16_t acceleration = yAccelarationHighByte<<8|yAccelarationLowByte; |
mitea1 | 0:f2815503561f | 57 | |
mitea1 | 0:f2815503561f | 58 | return ((float) acceleration)/config->getAccelerationDivider(); |
mitea1 | 0:f2815503561f | 59 | |
mitea1 | 0:f2815503561f | 60 | } |
mitea1 | 0:f2815503561f | 61 | |
mitea1 | 0:f2815503561f | 62 | float MPU9250::getZAxisAcceleration(){ |
mitea1 | 0:f2815503561f | 63 | uint8_t zAccelarationHighByte; |
mitea1 | 0:f2815503561f | 64 | uint8_t zAccelarationLowByte; |
mitea1 | 0:f2815503561f | 65 | |
mitea1 | 0:f2815503561f | 66 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_ZOUT_H,false, |
mitea1 | 0:f2815503561f | 67 | &zAccelarationHighByte,1); |
mitea1 | 0:f2815503561f | 68 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_ZOUT_L,false, |
mitea1 | 0:f2815503561f | 69 | &zAccelarationLowByte,1); |
mitea1 | 0:f2815503561f | 70 | |
mitea1 | 0:f2815503561f | 71 | int16_t acceleration = zAccelarationHighByte<<8|zAccelarationLowByte; |
mitea1 | 0:f2815503561f | 72 | |
mitea1 | 0:f2815503561f | 73 | return ((float) acceleration)/config->getAccelerationDivider(); |
mitea1 | 0:f2815503561f | 74 | |
mitea1 | 0:f2815503561f | 75 | } |
mitea1 | 0:f2815503561f | 76 | |
mitea1 | 0:f2815503561f | 77 | float MPU9250::getXAxisGyro(){ |
mitea1 | 0:f2815503561f | 78 | uint8_t xGyroscopeHighByte; |
mitea1 | 0:f2815503561f | 79 | uint8_t xGyroscopeLowByte; |
mitea1 | 0:f2815503561f | 80 | |
mitea1 | 0:f2815503561f | 81 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_XOUT_H,false, |
mitea1 | 0:f2815503561f | 82 | &xGyroscopeHighByte,1); |
mitea1 | 0:f2815503561f | 83 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_XOUT_L,false, |
mitea1 | 0:f2815503561f | 84 | &xGyroscopeLowByte,1); |
mitea1 | 0:f2815503561f | 85 | |
mitea1 | 0:f2815503561f | 86 | int16_t gyroscope = xGyroscopeHighByte<<8|xGyroscopeLowByte; |
mitea1 | 0:f2815503561f | 87 | |
mitea1 | 0:f2815503561f | 88 | return ((float) gyroscope)/config->getGyroDivider(); |
mitea1 | 0:f2815503561f | 89 | } |
mitea1 | 0:f2815503561f | 90 | |
mitea1 | 0:f2815503561f | 91 | float MPU9250::getYAxisGyro(){ |
mitea1 | 0:f2815503561f | 92 | uint8_t yGyroscopeHighByte; |
mitea1 | 0:f2815503561f | 93 | uint8_t yGyroscopeLowByte; |
mitea1 | 0:f2815503561f | 94 | |
mitea1 | 0:f2815503561f | 95 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_YOUT_H,false, |
mitea1 | 0:f2815503561f | 96 | &yGyroscopeHighByte,1); |
mitea1 | 0:f2815503561f | 97 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_YOUT_L,false, |
mitea1 | 0:f2815503561f | 98 | &yGyroscopeLowByte,1); |
mitea1 | 0:f2815503561f | 99 | |
mitea1 | 0:f2815503561f | 100 | int16_t gyroscope = yGyroscopeHighByte<<8|yGyroscopeLowByte; |
mitea1 | 0:f2815503561f | 101 | |
mitea1 | 0:f2815503561f | 102 | return ((float) gyroscope)/config->getGyroDivider(); |
mitea1 | 0:f2815503561f | 103 | } |
mitea1 | 0:f2815503561f | 104 | |
mitea1 | 0:f2815503561f | 105 | float MPU9250::getZAxisGyro(){ |
mitea1 | 0:f2815503561f | 106 | uint8_t zGyroscopeHighByte; |
mitea1 | 0:f2815503561f | 107 | uint8_t zGyroscopeLowByte; |
mitea1 | 0:f2815503561f | 108 | |
mitea1 | 0:f2815503561f | 109 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_ZOUT_H,0, |
mitea1 | 0:f2815503561f | 110 | &zGyroscopeHighByte,1); |
mitea1 | 0:f2815503561f | 111 | i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_ZOUT_L,0, |
mitea1 | 0:f2815503561f | 112 | &zGyroscopeLowByte,1); |
mitea1 | 0:f2815503561f | 113 | |
mitea1 | 0:f2815503561f | 114 | int16_t gyroscope = zGyroscopeHighByte<<8|zGyroscopeLowByte; |
mitea1 | 0:f2815503561f | 115 | |
mitea1 | 0:f2815503561f | 116 | return ((float) gyroscope)/config->getGyroDivider(); |
mitea1 | 0:f2815503561f | 117 | } |
mitea1 | 0:f2815503561f | 118 | |
mitea1 | 0:f2815503561f | 119 | float MPU9250::getXAxisTesla(){ |
mitea1 | 0:f2815503561f | 120 | uint8_t xTelsaHighByte; |
mitea1 | 0:f2815503561f | 121 | uint8_t xTelsaLowByte; |
mitea1 | 0:f2815503561f | 122 | |
mitea1 | 0:f2815503561f | 123 | i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_XOUT_H,false, |
mitea1 | 0:f2815503561f | 124 | &xTelsaHighByte,1); |
mitea1 | 0:f2815503561f | 125 | i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_XOUT_L,false, |
mitea1 | 0:f2815503561f | 126 | &xTelsaLowByte,1); |
mitea1 | 0:f2815503561f | 127 | |
mitea1 | 0:f2815503561f | 128 | uint8_t status; |
mitea1 | 0:f2815503561f | 129 | |
mitea1 | 0:f2815503561f | 130 | i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ST2,false, |
mitea1 | 0:f2815503561f | 131 | &status,1); |
mitea1 | 0:f2815503561f | 132 | |
mitea1 | 0:f2815503561f | 133 | int16_t tesla = xTelsaHighByte<<8|xTelsaLowByte; |
mitea1 | 0:f2815503561f | 134 | |
mitea1 | 0:f2815503561f | 135 | return (float) (tesla) / config->getTeslaDivider(); |
mitea1 | 0:f2815503561f | 136 | } |
mitea1 | 0:f2815503561f | 137 | |
mitea1 | 0:f2815503561f | 138 | float MPU9250::getYAxisTesla(){ |
mitea1 | 0:f2815503561f | 139 | uint8_t yTelsaHighByte; |
mitea1 | 0:f2815503561f | 140 | uint8_t yTelsaLowByte; |
mitea1 | 0:f2815503561f | 141 | |
mitea1 | 0:f2815503561f | 142 | i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_YOUT_H,false, |
mitea1 | 0:f2815503561f | 143 | &yTelsaHighByte,1); |
mitea1 | 0:f2815503561f | 144 | i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_YOUT_L,false, |
mitea1 | 0:f2815503561f | 145 | &yTelsaLowByte,1); |
mitea1 | 0:f2815503561f | 146 | |
mitea1 | 0:f2815503561f | 147 | uint8_t status; |
mitea1 | 0:f2815503561f | 148 | |
mitea1 | 0:f2815503561f | 149 | i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ST2,false, |
mitea1 | 0:f2815503561f | 150 | &status,1); |
mitea1 | 0:f2815503561f | 151 | |
mitea1 | 0:f2815503561f | 152 | int16_t tesla = yTelsaHighByte<<8|yTelsaLowByte; |
mitea1 | 0:f2815503561f | 153 | |
mitea1 | 0:f2815503561f | 154 | return (float) (tesla) / config->getTeslaDivider(); |
mitea1 | 0:f2815503561f | 155 | } |
mitea1 | 0:f2815503561f | 156 | |
mitea1 | 0:f2815503561f | 157 | float MPU9250::getZAxisTesla(){ |
mitea1 | 0:f2815503561f | 158 | uint8_t zTelsaHighByte; |
mitea1 | 0:f2815503561f | 159 | uint8_t zTelsaLowByte; |
mitea1 | 0:f2815503561f | 160 | |
mitea1 | 0:f2815503561f | 161 | i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ZOUT_H,false, |
mitea1 | 0:f2815503561f | 162 | &zTelsaHighByte,1); |
mitea1 | 0:f2815503561f | 163 | i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ZOUT_L,false, |
mitea1 | 0:f2815503561f | 164 | &zTelsaLowByte,1); |
mitea1 | 0:f2815503561f | 165 | |
mitea1 | 0:f2815503561f | 166 | uint8_t status; |
mitea1 | 0:f2815503561f | 167 | |
mitea1 | 0:f2815503561f | 168 | i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ST2,false, |
mitea1 | 0:f2815503561f | 169 | &status,1); |
mitea1 | 0:f2815503561f | 170 | |
mitea1 | 0:f2815503561f | 171 | int16_t tesla = zTelsaHighByte<<8|zTelsaLowByte; |
mitea1 | 0:f2815503561f | 172 | |
mitea1 | 0:f2815503561f | 173 | return (float) (tesla) / config->getTeslaDivider(); |
mitea1 | 0:f2815503561f | 174 | } |
mitea1 | 0:f2815503561f | 175 | |
mitea1 | 0:f2815503561f | 176 | void MPU9250::enableAxisAccelerationMeasurement(){ |
mitea1 | 0:f2815503561f | 177 | uint8_t configValueAcceleration=config->getAccelerometerScale()<<3; |
mitea1 | 0:f2815503561f | 178 | |
mitea1 | 0:f2815503561f | 179 | i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_CONFIG,false, |
mitea1 | 0:f2815503561f | 180 | &configValueAcceleration,1); |
mitea1 | 0:f2815503561f | 181 | } |
mitea1 | 0:f2815503561f | 182 | |
mitea1 | 0:f2815503561f | 183 | void MPU9250::enableAxisGyroscopeMeasurement(){ |
mitea1 | 0:f2815503561f | 184 | uint8_t configValueGyroscope = config->getGyroscopeScale()<<3; |
mitea1 | 0:f2815503561f | 185 | |
mitea1 | 0:f2815503561f | 186 | i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_CONFIG,false, |
mitea1 | 0:f2815503561f | 187 | &configValueGyroscope,1); |
mitea1 | 0:f2815503561f | 188 | } |
mitea1 | 0:f2815503561f | 189 | |
mitea1 | 0:f2815503561f | 190 | void MPU9250::enableAxisTeslaMeasurement(){ |
mitea1 | 0:f2815503561f | 191 | uint8_t configValueMagnetometer = 0x02; |
mitea1 | 0:f2815503561f | 192 | |
mitea1 | 0:f2815503561f | 193 | i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_INT_PIN_CFG,false, |
mitea1 | 0:f2815503561f | 194 | &configValueMagnetometer,1); |
mitea1 | 0:f2815503561f | 195 | |
mitea1 | 0:f2815503561f | 196 | configValueMagnetometer = 0; |
mitea1 | 0:f2815503561f | 197 | i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_USER_CTRL,false, |
mitea1 | 0:f2815503561f | 198 | &configValueMagnetometer,1); |
mitea1 | 0:f2815503561f | 199 | |
mitea1 | 0:f2815503561f | 200 | configValueMagnetometer = 0; |
mitea1 | 0:f2815503561f | 201 | i2c->write_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_CNTL1,false, |
mitea1 | 0:f2815503561f | 202 | &configValueMagnetometer,1); |
mitea1 | 0:f2815503561f | 203 | |
mitea1 | 0:f2815503561f | 204 | configValueMagnetometer = config->getMagnetometerBitResolution()<<4| |
mitea1 | 0:f2815503561f | 205 | config->getMagnetometerMeasureMode(); |
mitea1 | 0:f2815503561f | 206 | i2c->write_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_CNTL1,false, |
mitea1 | 0:f2815503561f | 207 | &configValueMagnetometer,1); |
mitea1 | 0:f2815503561f | 208 | |
mitea1 | 0:f2815503561f | 209 | } |
mitea1 | 0:f2815503561f | 210 | |
mitea1 | 0:f2815503561f | 211 | void MPU9250::configureInterrupts(){ |
mitea1 | 0:f2815503561f | 212 | uint8_t configValueInterruptPin = config->getInterruptPinConfiguration()|0x02; |
mitea1 | 0:f2815503561f | 213 | |
mitea1 | 0:f2815503561f | 214 | i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_INT_PIN_CFG,false, |
mitea1 | 0:f2815503561f | 215 | &configValueInterruptPin,1); |
mitea1 | 0:f2815503561f | 216 | |
mitea1 | 0:f2815503561f | 217 | uint8_t configValueInterruptEnable = config->getInterruptEnableConfiguration(); |
mitea1 | 0:f2815503561f | 218 | |
mitea1 | 0:f2815503561f | 219 | i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_INT_ENABLE,false, |
mitea1 | 0:f2815503561f | 220 | &configValueInterruptEnable,1); |
mitea1 | 0:f2815503561f | 221 | } |
mitea1 | 0:f2815503561f | 222 | |
mitea1 | 0:f2815503561f | 223 | void MPU9250::setWakeOnReceiveThreshold(){ |
mitea1 | 0:f2815503561f | 224 | uint8_t wakeOnReceiveThreshold = config->getWakeOnMotionThreshold(); |
mitea1 | 0:f2815503561f | 225 | |
mitea1 | 0:f2815503561f | 226 | i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_WOM_THR,false, |
mitea1 | 0:f2815503561f | 227 | &wakeOnReceiveThreshold,1); |
mitea1 | 0:f2815503561f | 228 | } |
mitea1 | 0:f2815503561f | 229 | |
mitea1 | 0:f2815503561f | 230 |