lib

Committer:
peterswanson87
Date:
Tue Nov 18 18:49:19 2014 +0000
Revision:
0:ecac7a6076f0
yup

Who changed what in which revision?

UserRevisionLine numberNew contents of line
peterswanson87 0:ecac7a6076f0 1 /**
peterswanson87 0:ecac7a6076f0 2 * Includes
peterswanson87 0:ecac7a6076f0 3 */
peterswanson87 0:ecac7a6076f0 4
peterswanson87 0:ecac7a6076f0 5 #include "H3LIS331.h"
peterswanson87 0:ecac7a6076f0 6
peterswanson87 0:ecac7a6076f0 7 H3LIS331::H3LIS331(PinName sda, PinName scl) : i2c_(sda, scl) {
peterswanson87 0:ecac7a6076f0 8 // set default scaling factor
peterswanson87 0:ecac7a6076f0 9 scaling_factor = 5140.0;
peterswanson87 0:ecac7a6076f0 10
peterswanson87 0:ecac7a6076f0 11 //set default range to zero.
peterswanson87 0:ecac7a6076f0 12 //current_range = 0;
peterswanson87 0:ecac7a6076f0 13
peterswanson87 0:ecac7a6076f0 14 //400kHz, fast mode.
peterswanson87 0:ecac7a6076f0 15 i2c_.frequency(400000);
peterswanson87 0:ecac7a6076f0 16
peterswanson87 0:ecac7a6076f0 17
peterswanson87 0:ecac7a6076f0 18 //Power Up Device, Set Output data rate, Enable All 3 Axis
peterswanson87 0:ecac7a6076f0 19 //See datasheet for details.
peterswanson87 0:ecac7a6076f0 20 char tx[2];
peterswanson87 0:ecac7a6076f0 21 //char tx2[2];
peterswanson87 0:ecac7a6076f0 22 //char rx[1];
peterswanson87 0:ecac7a6076f0 23 tx[0] = CTRL_REG_1;
peterswanson87 0:ecac7a6076f0 24 //CTRL_REG_1 [00111111] / [0x3F] to power up, set output rate to 1000Hz, and enable all 3 axis.
peterswanson87 0:ecac7a6076f0 25 //CTRL_REG_1 [00101111] / [0x2F] to power up, set output rate to 100Hz, and enable all 3 axis.
peterswanson87 0:ecac7a6076f0 26 //CTRL_REG_1 [ABCDEFGH] ABC=PowerMode, DE=OutputDataRate, F=Zenable, G=Yenable, H=XEnable
peterswanson87 0:ecac7a6076f0 27 tx[1] = 0x2F;
peterswanson87 0:ecac7a6076f0 28 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
peterswanson87 0:ecac7a6076f0 29
peterswanson87 0:ecac7a6076f0 30
peterswanson87 0:ecac7a6076f0 31
peterswanson87 0:ecac7a6076f0 32 //set default scale of 4g's
peterswanson87 0:ecac7a6076f0 33 //scaling_factor = 8192.0;
peterswanson87 0:ecac7a6076f0 34 //current_range = 24;
peterswanson87 0:ecac7a6076f0 35
peterswanson87 0:ecac7a6076f0 36 tx[0] = CTRL_REG_4;
peterswanson87 0:ecac7a6076f0 37 tx[1] = 0x00;
peterswanson87 0:ecac7a6076f0 38
peterswanson87 0:ecac7a6076f0 39 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
peterswanson87 0:ecac7a6076f0 40
peterswanson87 0:ecac7a6076f0 41
peterswanson87 0:ecac7a6076f0 42
peterswanson87 0:ecac7a6076f0 43 }
peterswanson87 0:ecac7a6076f0 44
peterswanson87 0:ecac7a6076f0 45 char H3LIS331::getWhoAmI(void){
peterswanson87 0:ecac7a6076f0 46
peterswanson87 0:ecac7a6076f0 47 //WhoAmI Register address.
peterswanson87 0:ecac7a6076f0 48 char tx = WHO_AM_I_REG_H3LIS331;
peterswanson87 0:ecac7a6076f0 49 char rx;
peterswanson87 0:ecac7a6076f0 50
peterswanson87 0:ecac7a6076f0 51 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
peterswanson87 0:ecac7a6076f0 52
peterswanson87 0:ecac7a6076f0 53 i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
peterswanson87 0:ecac7a6076f0 54
peterswanson87 0:ecac7a6076f0 55 return rx;
peterswanson87 0:ecac7a6076f0 56
peterswanson87 0:ecac7a6076f0 57 }
peterswanson87 0:ecac7a6076f0 58
peterswanson87 0:ecac7a6076f0 59
peterswanson87 0:ecac7a6076f0 60
peterswanson87 0:ecac7a6076f0 61
peterswanson87 0:ecac7a6076f0 62 void H3LIS331::setPowerMode(char power_mode){
peterswanson87 0:ecac7a6076f0 63 // Currently sets all 3 axis to enabled. Will be set to preserve existing status in future
peterswanson87 0:ecac7a6076f0 64 char tx[2];
peterswanson87 0:ecac7a6076f0 65 tx[0] = CTRL_REG_1;
peterswanson87 0:ecac7a6076f0 66 tx[1] = power_mode;
peterswanson87 0:ecac7a6076f0 67
peterswanson87 0:ecac7a6076f0 68 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
peterswanson87 0:ecac7a6076f0 69
peterswanson87 0:ecac7a6076f0 70 }
peterswanson87 0:ecac7a6076f0 71
peterswanson87 0:ecac7a6076f0 72 char H3LIS331::getPowerMode(void){
peterswanson87 0:ecac7a6076f0 73
peterswanson87 0:ecac7a6076f0 74 char tx = CTRL_REG_1;
peterswanson87 0:ecac7a6076f0 75 char rx;
peterswanson87 0:ecac7a6076f0 76
peterswanson87 0:ecac7a6076f0 77 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
peterswanson87 0:ecac7a6076f0 78
peterswanson87 0:ecac7a6076f0 79 i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
peterswanson87 0:ecac7a6076f0 80
peterswanson87 0:ecac7a6076f0 81
peterswanson87 0:ecac7a6076f0 82 return rx;
peterswanson87 0:ecac7a6076f0 83
peterswanson87 0:ecac7a6076f0 84 }
peterswanson87 0:ecac7a6076f0 85
peterswanson87 0:ecac7a6076f0 86
peterswanson87 0:ecac7a6076f0 87
peterswanson87 0:ecac7a6076f0 88 char H3LIS331::getInterruptConfiguration(void){
peterswanson87 0:ecac7a6076f0 89
peterswanson87 0:ecac7a6076f0 90 char tx = CTRL_REG_3;
peterswanson87 0:ecac7a6076f0 91 char rx;
peterswanson87 0:ecac7a6076f0 92
peterswanson87 0:ecac7a6076f0 93 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
peterswanson87 0:ecac7a6076f0 94
peterswanson87 0:ecac7a6076f0 95 i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
peterswanson87 0:ecac7a6076f0 96
peterswanson87 0:ecac7a6076f0 97 return rx;
peterswanson87 0:ecac7a6076f0 98
peterswanson87 0:ecac7a6076f0 99 }
peterswanson87 0:ecac7a6076f0 100
peterswanson87 0:ecac7a6076f0 101
peterswanson87 0:ecac7a6076f0 102 void H3LIS331::setFullScaleRange400g(void){ // Does not preserve rest of CTRL_REG_4!
peterswanson87 0:ecac7a6076f0 103 scaling_factor = 81.92;
peterswanson87 0:ecac7a6076f0 104 current_range = 400;
peterswanson87 0:ecac7a6076f0 105
peterswanson87 0:ecac7a6076f0 106 char tx[2];
peterswanson87 0:ecac7a6076f0 107 tx[0] = CTRL_REG_4;
peterswanson87 0:ecac7a6076f0 108 tx[1] = 0x30;
peterswanson87 0:ecac7a6076f0 109
peterswanson87 0:ecac7a6076f0 110 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
peterswanson87 0:ecac7a6076f0 111
peterswanson87 0:ecac7a6076f0 112 }
peterswanson87 0:ecac7a6076f0 113
peterswanson87 0:ecac7a6076f0 114 void H3LIS331::setFullScaleRange200g(void){ // Does not preserve rest of CTRL_REG_4!
peterswanson87 0:ecac7a6076f0 115 scaling_factor = 163.84;
peterswanson87 0:ecac7a6076f0 116 current_range = 200;
peterswanson87 0:ecac7a6076f0 117
peterswanson87 0:ecac7a6076f0 118 char tx[2];
peterswanson87 0:ecac7a6076f0 119 tx[0] = CTRL_REG_4;
peterswanson87 0:ecac7a6076f0 120 tx[1] = 0x10;
peterswanson87 0:ecac7a6076f0 121
peterswanson87 0:ecac7a6076f0 122 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
peterswanson87 0:ecac7a6076f0 123
peterswanson87 0:ecac7a6076f0 124 }
peterswanson87 0:ecac7a6076f0 125
peterswanson87 0:ecac7a6076f0 126
peterswanson87 0:ecac7a6076f0 127 void H3LIS331::setFullScaleRange100g(void){ // Does not preserve rest of CTRL_REG_4!
peterswanson87 0:ecac7a6076f0 128 scaling_factor = 327.68;
peterswanson87 0:ecac7a6076f0 129 current_range = 100;
peterswanson87 0:ecac7a6076f0 130
peterswanson87 0:ecac7a6076f0 131 char tx[2];
peterswanson87 0:ecac7a6076f0 132 tx[0] = CTRL_REG_4;
peterswanson87 0:ecac7a6076f0 133 tx[1] = 0x00;
peterswanson87 0:ecac7a6076f0 134
peterswanson87 0:ecac7a6076f0 135 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
peterswanson87 0:ecac7a6076f0 136
peterswanson87 0:ecac7a6076f0 137 }
peterswanson87 0:ecac7a6076f0 138
peterswanson87 0:ecac7a6076f0 139
peterswanson87 0:ecac7a6076f0 140 char H3LIS331::getAccelStatus(void){
peterswanson87 0:ecac7a6076f0 141
peterswanson87 0:ecac7a6076f0 142 char tx = STATUS_REG;
peterswanson87 0:ecac7a6076f0 143 char rx;
peterswanson87 0:ecac7a6076f0 144
peterswanson87 0:ecac7a6076f0 145 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
peterswanson87 0:ecac7a6076f0 146
peterswanson87 0:ecac7a6076f0 147 i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
peterswanson87 0:ecac7a6076f0 148
peterswanson87 0:ecac7a6076f0 149 return rx;
peterswanson87 0:ecac7a6076f0 150 }
peterswanson87 0:ecac7a6076f0 151
peterswanson87 0:ecac7a6076f0 152
peterswanson87 0:ecac7a6076f0 153
peterswanson87 0:ecac7a6076f0 154 float H3LIS331::getAccelX(void){
peterswanson87 0:ecac7a6076f0 155
peterswanson87 0:ecac7a6076f0 156 char tx = ACCEL_XOUT_H_REG;
peterswanson87 0:ecac7a6076f0 157 char rx[2];
peterswanson87 0:ecac7a6076f0 158
peterswanson87 0:ecac7a6076f0 159 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
peterswanson87 0:ecac7a6076f0 160
peterswanson87 0:ecac7a6076f0 161 i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
peterswanson87 0:ecac7a6076f0 162
peterswanson87 0:ecac7a6076f0 163 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
peterswanson87 0:ecac7a6076f0 164
peterswanson87 0:ecac7a6076f0 165 return output/scaling_factor;
peterswanson87 0:ecac7a6076f0 166 //return output;
peterswanson87 0:ecac7a6076f0 167
peterswanson87 0:ecac7a6076f0 168 }
peterswanson87 0:ecac7a6076f0 169
peterswanson87 0:ecac7a6076f0 170 float H3LIS331::getAccelY(void){
peterswanson87 0:ecac7a6076f0 171
peterswanson87 0:ecac7a6076f0 172 char tx = ACCEL_YOUT_H_REG;
peterswanson87 0:ecac7a6076f0 173 char rx[2];
peterswanson87 0:ecac7a6076f0 174
peterswanson87 0:ecac7a6076f0 175 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
peterswanson87 0:ecac7a6076f0 176
peterswanson87 0:ecac7a6076f0 177 i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
peterswanson87 0:ecac7a6076f0 178
peterswanson87 0:ecac7a6076f0 179 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
peterswanson87 0:ecac7a6076f0 180
peterswanson87 0:ecac7a6076f0 181 return output/scaling_factor;
peterswanson87 0:ecac7a6076f0 182
peterswanson87 0:ecac7a6076f0 183 }
peterswanson87 0:ecac7a6076f0 184
peterswanson87 0:ecac7a6076f0 185 float H3LIS331::getAccelZ(void){
peterswanson87 0:ecac7a6076f0 186
peterswanson87 0:ecac7a6076f0 187 char tx = ACCEL_ZOUT_H_REG;
peterswanson87 0:ecac7a6076f0 188 char rx[2];
peterswanson87 0:ecac7a6076f0 189
peterswanson87 0:ecac7a6076f0 190 i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
peterswanson87 0:ecac7a6076f0 191
peterswanson87 0:ecac7a6076f0 192 i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
peterswanson87 0:ecac7a6076f0 193
peterswanson87 0:ecac7a6076f0 194 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
peterswanson87 0:ecac7a6076f0 195
peterswanson87 0:ecac7a6076f0 196 return output/scaling_factor;
peterswanson87 0:ecac7a6076f0 197 }