cancel
Showing results for 
Search instead for 
Did you mean: 

Problems with temperature affecting the readings from LSM6DS3TR.

RConw
Associate II

I'm developing a product using the LSM6DS3TR. As per the data sheet the data from the device should not be influenced by temperature more than 1.5% between -40 and +85 degrees. I see wild swings in the data for the Y-Axis Accelerometer when the temperature changes. I can actually just breath on the device and see the data skew. When placed in the sun the data really swings, but only for the Y-Axis. Any help would be greatly appreciated. Rob

5 REPLIES 5
Eleon BORLINI
ST Employee

Hi Rob, you are right, the device should not show strange behavior (after environmental disturbance, temperature, UV or wind), especially on a single axis (because MEMS axis are almost symmetrical). Is it possible for you to share the raw data of your acquisition? Did you test the gyro part of the module and, If so, does the Y-axis (Roll) data also show bad behavior? Which are your operation conditions (Vdd/VddIO)? Regards

RConw
Associate II

Hi Eleon, thanks for getting back to me... Vdd and VddIO are both at 1.8 volts. That voltage level is a requirement for the device. The issue however is the same even if I supply 3.3 volts. I'm working to get you some terminal output tomorrow. Here are my register settings for the accelerometers. I will have to verify if the Gyro data is also getting skewed.

myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL7_G, 0x80); // CTRL7_G Register - Gyro High-Performance Mode Disabled, HPF Disabled, HP Cutoff Frequency .0081 Hz, gyro digital HP filter reset OFF, Source register rounding function Disabled.

myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL2_G, 0x10); // CTRL2_G Register - Enable Gyro, Low Power Mode, 13Hz Sample Rate, Max 245 Degrees/sec

myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL6_C, 0x10); // CTRL6_C Register - Accelerometer High-Performance Mode Disabled, Edge Trigger Disabled, Data-Level Trigger Disabled, Level Sensitive Latch Disabled.

myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL1_XL, 0x10); // CTRL1_XL Register - Enable Accelerometer, Low Power Mode, 13Hz Sample Rate, 2g Range, 400Hz Anti-Aliasing Filter enabled

All other control registers are left as default.

Robert

Ozone
Lead

Is the supply voltage stable over the temperature range ?

Did you perhaps damage the sensor (overheating while soldering) ?

RConw
Associate II

Supply voltage is absolutely stable and filtered.

The sensors are soldering using proper SMD reflow techniques, so, no.

I have written some debug code and started testing the accelerometer one axis at a time.

vdd and the vddIO are both set to 2.5v for this test, but I get the same results with 1.7, 2.5, and 3.3v

Registers are as stated in my last message. All other registers are untouched.

I have added a file attachment which contains the terminal output.

At timestamp 10 I added heat from a hair dryer approximately 1 foot away from the board.

At timestamp 20 I removed the heat.

Code:

if (Debug == 1) // send raw and kalman filtered Accelerometer values to the serial uart

{

Now = millis();

if ((Now - Last_Debug_Update) > 125)

{

Serial.print("Timestamp: ");

Serial.println(millis()/125);

Last_Debug_Update = millis();

}

Est_X_Acc_Value = 0;

Est_Y_Acc_Value = 0;

Est_Z_Acc_Value = 0;

for (int i = 0; i < READ_IMU_ACC_SAMPLES; i++)

{

//Value1 = myIMU.readRawAccelX();

Value1 = myIMU.readFloatAccelX();

Est_X_Acc_Value = (Est_X_Acc_Value + KalmanFilterAccX.updateEstimate(Value1));

//Value2 = myIMU.readRawAccelY();

Value2 = myIMU.readFloatAccelY();

Est_Y_Acc_Value = (Est_Y_Acc_Value + KalmanFilterAccY.updateEstimate(Value2));

//Value3 = myIMU.readRawAccelZ();

Value3 = myIMU.readFloatAccelZ();

Est_Z_Acc_Value = (Est_Z_Acc_Value + KalmanFilterAccZ.updateEstimate(Value3));

delay(1);

}

Est_X_Acc_Value = Est_X_Acc_Value/READ_IMU_ACC_SAMPLES;

Est_Y_Acc_Value = Est_Y_Acc_Value/READ_IMU_ACC_SAMPLES;

Est_Z_Acc_Value = Est_Z_Acc_Value/READ_IMU_ACC_SAMPLES;

Serial.print("Raw X= ");

Serial.print(Value1);

Serial.print(" ");

Serial.print("Kalman X= ");

Serial.print(Est_X_Acc_Value);

Serial.print("   ");

Serial.print("Raw Y= ");

Serial.print(Value2);

Serial.print(" ");

Serial.print("Kalman Y= ");

Serial.print(Est_Y_Acc_Value);

Serial.print("   ");

Serial.print("Raw Z= ");

Serial.print(Value3);

Serial.print(" ");

Serial.print("Kalman Z= ");

Serial.println(Est_Z_Acc_Value);

return;

} // End Debug = 1

dbgarasiya
Senior II

same problem i have.

if you find solutins ?