2021-07-27 11:28 AM
Dear support,
I need a very low noise Z-axis accelerometer for our application.
I've done some R&D experiments with LSM6DS3 Z-axis accelerometer with satisfactory results.
I'm now trying to replicate the success with smaller & cheaper LIS2DW12 that supposedly has the same 90ug/SQRT(hz) as the LSM6DS3, however trying my best to configure for low noise, high performance, limit the bandwidth etc. and the best RMS noise I get is still 4x that of the LSM's Z-axis and around 2.5x higher then the LIS's own X & Y axes.
The LSM is configured for 833sps , LPF=16Hz while the the LIS is configured for 200sps, LPF=10Hz due to its LPF ODR/20 limitation- this is the lowest noise configuration I found even though I actually prefer a higher BW.
FFT consistently shows about +20db higher noise across the low frequency spectrum in the LIS vs. the LSM (except at 20Hz, see footnote)
The (DC removed) RMS noise of the LSM z-axis is 1mg while the LIS z-axis gives 3.7mg.
For comparison, the LIS x-axis has 1.3mg RMS noise (in high performance, low noise mode).
why do the datasheets show the same noise performance while real world noise is so different? Am I doing everything right?
Can you recommend the quietest z-axis accelerometer for our application?
My setup is either two LSM6DS3 connected via arduino to Matlab, or one LSM and one LIS2DW12 . I'm sampling every 2mS asynchronously from the accelerometer with BDU bit enabled.
The arduino sketch is below. I apologize to any SW engineer reading my code, I invite you to beat me at hand soldering a LIS2DW12 to a prefboard :)
#include "Wire.h"
#include "SPI.h"
const int LSMaddrA=0x6A;
const int LIS2addrB=0x19;
void setup() {
Serial.begin(115200);
delay(1000); //relax...
Serial.println("Processor came out of reset.\n");
Wire.begin();
Wire.beginTransmission(LSMaddrA); // transmit to device
Wire.write(0x18); // sends value byte
Wire.write(0x20); // z xl enable (only)
Wire.endTransmission(); // stop transmitting
Wire.beginTransmission(LSMaddrA); // transmit to device
Wire.write(0x10); // sends value byte
Wire.write(0x73); // 833Hz ODR, 2g range, 50hz bw
Wire.endTransmission(); // stop transmitting
Wire.beginTransmission(LSMaddrA); // transmit to device
Wire.write(0x13); // sends value byte
Wire.write(0x80); // set xl_bw_scal (50hz from 0x10)
Wire.endTransmission(); // stop transmitting
Wire.beginTransmission(LSMaddrA); // transmit to device
Wire.write(0x19); // sends value byte
Wire.write(0x04); // disable gyros, enable LPF2
Wire.endTransmission(); // stop transmitting
Wire.beginTransmission(LSMaddrA); // transmit to device
Wire.write(0x11); // sends value byte
Wire.write(0x00); // power down gyros
Wire.endTransmission(); // stop transmitting
Wire.beginTransmission(LSMaddrA); // transmit to device
Wire.write(0x17); // sends value byte
Wire.write(0x80); // LPF2_en at ODM/50 (16hz)
Wire.endTransmission(); // stop transmitting
Wire.beginTransmission(LSMaddrA); // transmit to device
Wire.write(0x12); // sends value byte
Wire.write(0x44); // Block data update (no update until both LSB and MSB are readout)
Wire.endTransmission(); // stop transmitting
// initialize LIS2DW12
Wire.beginTransmission(LIS2addrB); // transmit to device
Wire.write(0x20); // ctrl1
//Wire.write(0x87); //odr=800, hp mode
//Wire.write(0x77); //odr=400, hp mode
Wire.write(0x67); //odr=200, hp mode
//Wire.write(0x63); //odr=200, lp4 mode
Wire.endTransmission(); // stop transmitting
Wire.beginTransmission(LIS2addrB); // transmit to device
Wire.write(0x21); // ctrl2
Wire.write(0x0C); //Block data update (no update until both LSB and MSB are readout)
Wire.endTransmission(); // stop transmitting
Wire.beginTransmission(LIS2addrB); // transmit to device
Wire.write(0x25); // ctrl6
Wire.write(0xC4); //BW=ODR/20, FS=+-2g, LPF, low noise en
Wire.endTransmission(); // stop transmitting
}
int AZ;
int BZ;
unsigned long tsmp=millis();
void loop()
{
if (millis()>=tsmp)
{
tsmp=tsmp+2;
//read Z from LSM6 A
Wire.beginTransmission(LSMaddrA); // transmit to device
Wire.write(0x2C); // Z readout register
Wire.endTransmission(); // stop transmitting
Wire.requestFrom(LSMaddrA, 2); // request 2 bytes from slave device
AZ = Wire.read() | (Wire.read() <<8);
///read Z from LIS2 B
Wire.beginTransmission(LIS2addrB); // transmit to device
Wire.write(0x2C); // Z readout register
Wire.endTransmission(); // stop transmitting
Wire.requestFrom(LIS2addrB, 2); // request 2 bytes from slave device
BZ = Wire.read() | (Wire.read() <<8);
Serial.write((char *) &AZ, 2);
Serial.write((char *) &BZ, 2);
Serial.write('\r');
Serial.write('\n');
}
}
P.S. not the subject of this ticket, but the LSM6DS3 is actually MUCH quieter than the measured 1mg RMS. It has an unexplained 20Hz tone that if notched out makes the noise floor much lower than that. It could be a test setup resonance but I doubt it.
2021-08-11 03:22 AM
Hi, did you try testing other LIS2DW12s? This can exclude a specific device-related issue.
The device might have been a bit damaged in the soldering procedure.
You can check if it is ok running the self test --> lis2dw12_self_test.c
-Eleon
2021-08-23 10:07 AM
I wanted to follow up on this topic, given that I as well am attempting to use the LSM6D33 in a project. You mentioned how the accelerometer noise is about expected given your sampling rate and the device's noise density. Have you ever experimented with the gyroscope's function/noise levels? Mine shows considerably higher LSB-fluctuations than as-marked on the datasheet, even at exceptionally low frequencies (for reference, I'm seeing about a 50-LSB swing at 52 ODR (should be about 11-LSB).
2021-08-23 11:33 AM