Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed-dev
Fork of Adafruit9-DOf_AHRS_Regler_Discrete by
Diff: Source/Adafruit_LSM303_U.cpp
- Revision:
- 1:8c4f93e10af3
- Parent:
- 0:772bf4786416
--- a/Source/Adafruit_LSM303_U.cpp Sat Mar 21 12:33:05 2015 +0000 +++ b/Source/Adafruit_LSM303_U.cpp Thu Oct 19 11:50:04 2017 +0000 @@ -21,6 +21,8 @@ static float _lsm303Mag_Gauss_LSB_XY = 1100.0F; // Varies with gain static float _lsm303Mag_Gauss_LSB_Z = 980.0F; // Varies with gain +Serial serial( USBTX, USBRX); + /*************************************************************************** ACCELEROMETER ***************************************************************************/ @@ -62,15 +64,21 @@ void Adafruit_LSM303_Accel_Unified::read() { // Read the accelerometer + // OUT_X_L_A: X-axis acceleration data. The value is expressed in 2’s complement i2c->writeByte(LSM303_ADDRESS_ACCEL, LSM303_REGISTER_ACCEL_OUT_X_L_A | 0x80); byte data[6]; i2c->read(LSM303_ADDRESS_ACCEL, data, 6); // Shift values to create properly formed integer (low byte first) - _accelData.x = (int16_t)(data[0] | (data[1] << 8)) >> 4; - _accelData.y = (int16_t)(data[2] | (data[3] << 8)) >> 4; - _accelData.z = (int16_t)(data[4] | (data[5] << 8)) >> 4; + _accelData.x = (int16_t)((uint16_t)data[0] | ((uint16_t)data[1] << 8)) >> 4; + raw.x = (int16_t)((uint16_t)data[0] | ((uint16_t)data[1] << 8)) >> 4; + + _accelData.y = (int16_t)((uint16_t)data[2] | ((uint16_t)data[3] << 8)) >> 4; + raw.y = (int16_t)((uint16_t)data[2] | ((uint16_t)data[3] << 8)) >> 4; + + _accelData.z = (int16_t)((uint16_t)data[4] | ((uint16_t)data[5] << 8)) >> 4; + raw.z = (int16_t)((uint16_t)data[4] | ((uint16_t)data[5] << 8)) >> 4; } /*************************************************************************** @@ -98,16 +106,20 @@ bool Adafruit_LSM303_Accel_Unified::begin() { // Enable I2C - // Enable the accelerometer (100Hz) - write8(LSM303_ADDRESS_ACCEL, LSM303_REGISTER_ACCEL_CTRL_REG1_A, 0x57); + // Enable the accelerometer (200Hz) + write8(LSM303_ADDRESS_ACCEL, LSM303_REGISTER_ACCEL_CTRL_REG1_A, 0x67); // LSM303DLHC has no WHOAMI register so read CTRL_REG1_A back to check // if we are connected or not uint8_t reg1_a = read8(LSM303_ADDRESS_ACCEL, LSM303_REGISTER_ACCEL_CTRL_REG1_A); - if (reg1_a != 0x57) + serial.printf("LSM303_REGISTER_ACCEL_CTRL_REG1_A %d \r\n", reg1_a); + if (reg1_a != 0x67) { return false; - } + } + + //400 Hz; normal power mode; X/Y/Z enabled + write8(LSM303_ADDRESS_ACCEL, LSM303_REGISTER_ACCEL_CTRL_REG1_A, 0b01110111); return true; } @@ -198,13 +210,34 @@ byte data[6]; i2c->read(LSM303_ADDRESS_MAG, data, 6); - + // Shift values to create properly formed integer (low byte first) - _magData.x = (int16_t)(data[0] | ((int16_t)data[1] << 8)); - _magData.y = (int16_t)(data[2] | ((int16_t)data[3] << 8)); - _magData.z = (int16_t)(data[4] | ((int16_t)data[5] << 8)); + // *0.5 da _magData.z in Sättigung geht + _magData.x = (int16_t)((uint16_t)data[1] | ((uint16_t)data[0] << 8)); + raw.x = (int16_t)((uint16_t)data[1] | ((uint16_t)data[0] << 8)); + + _magData.z = (int16_t)((uint16_t)data[3] | ((uint16_t)data[2] << 8)); + raw.z = (int16_t)((uint16_t)data[3] | ((uint16_t)data[2] << 8)); + +// uint32_t magZOverflow = ((uint16_t)data[4] | ((uint16_t)data[5] << 8)); +// if( (magZOverflow > 30000) && (magZOverflow < 32767) ) +// { +// _magData.z = (int16_t)33023; +// raw.z = (int16_t)33023; +// } +// else +// { +// _magData.z = (int16_t)((uint16_t)data[4] | ((uint16_t)data[5] << 8)); +// raw.z = (int16_t)((uint16_t)data[4] | ((uint16_t)data[5] << 8)); +// } + + _magData.y = (int16_t)((uint16_t)data[5] | ((uint16_t)data[4] << 8)); + raw.y = (int16_t)((uint16_t)data[5] | ((uint16_t)data[4] << 8)); + + //serial.printf("%i\r\n", magZOverflow ); + // ToDo: Calculate orientation _magData.orientation = 0.0; } @@ -234,6 +267,7 @@ /**************************************************************************/ bool Adafruit_LSM303_Mag_Unified::begin() { + // Enable I2C @@ -241,15 +275,36 @@ write8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_MR_REG_M, 0x00); // LSM303DLHC has no WHOAMI register so read CRA_REG_M to check - // the default value (0b00010000/0x10) + write8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRA_REG_M, 0x10); uint8_t reg1_a = read8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRA_REG_M); + serial.printf("LSM303_REGISTER_MAG_CRA_REG_M %d \r\n", reg1_a); if (reg1_a != 0x10) { return false; } - // Set the gain to a known level - setMagGain(LSM303_MAGGAIN_1_3); + + + //Temp measurement off; 220 Hz data outputrate + this->write8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRA_REG_M, 0b00011100); + // Set the gain to +/- 1.9 Gauss; + this->write8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRB_REG_M, 0b01000000); + _magGain = LSM303_MAGGAIN_1_9; + //Continuous-conversion mode + this->write8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_MR_REG_M, 0b00000000); + + + + + + uint8_t reg = read8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRA_REG_M); + serial.printf("CRA_REG_M register %u \r\n", reg); + + reg = read8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRB_REG_M); + serial.printf("CRB_REG_M register %u \r\n", reg); + + reg = read8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_MR_REG_M); + serial.printf("MR_REG_M register %u \r\n", reg); return true; } @@ -331,9 +386,9 @@ } else { - s_com->print(_magData.x); s_com->print(" "); - s_com->print(_magData.y); s_com->print(" "); - s_com->print(_magData.z); s_com->println(" "); + serial.printf("%f \r\n",_magData.x); + serial.printf("%f \r\n",_magData.y); + serial.printf("%f \r\n",_magData.z); /* Check if the sensor is saturating or not */ if ( (_magData.x >= 2040) | (_magData.x <= -2040) | (_magData.y >= 2040) | (_magData.y <= -2040) | @@ -345,32 +400,32 @@ case LSM303_MAGGAIN_5_6: setMagGain(LSM303_MAGGAIN_8_1); readingValid = false; - s_com->println("Changing range to +/- 8.1"); + serial.printf("Changing range to +/- 8.1 Gauss"); break; case LSM303_MAGGAIN_4_7: setMagGain(LSM303_MAGGAIN_5_6); readingValid = false; - s_com->println("Changing range to +/- 5.6"); + serial.printf("Changing range to +/- 5.6 Gauss"); break; case LSM303_MAGGAIN_4_0: setMagGain(LSM303_MAGGAIN_4_7); readingValid = false; - s_com->println("Changing range to +/- 4.7"); + serial.printf("Changing range to +/- 4.7 Gauss"); break; case LSM303_MAGGAIN_2_5: setMagGain(LSM303_MAGGAIN_4_0); readingValid = false; - s_com->println("Changing range to +/- 4.0"); + serial.printf("Changing range to +/- 4.0 Gauss"); break; case LSM303_MAGGAIN_1_9: setMagGain(LSM303_MAGGAIN_2_5); readingValid = false; - s_com->println("Changing range to +/- 2.5"); + serial.printf("Changing range to +/- 2.5 Gauss"); break; case LSM303_MAGGAIN_1_3: setMagGain(LSM303_MAGGAIN_1_9); readingValid = false; - s_com->println("Changing range to +/- 1.9"); + serial.printf("Changing range to +/- 1.9"); break; default: readingValid = true;