cancel
Showing results for 
Search instead for 
Did you mean: 

LIS2DW12 Z-axis noisier than X,Y axes and much noisier than LSM6DS3 Z-axis

OElya.1
Associate

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.

3 REPLIES 3
TBomb.1
Senior II

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

WSmit.4
Associate

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).

Thank you for chiming in.
No, I haven't tested the gyros in the same manner. I actually don't need them for my application at all.
ST support suggested to me that I may have mounted the LIS2DW12 accelerometer with some mechanical or thermal stress that knocked it off typical performance.
This could be the case indeed as it was hand soldered to a prefboard and a drop of epoxy applied after.
I need to retest but it will take a while to get back to retesting (insert red sweaty stressed-out emoji here).
I'll update if i discover anything!