Skip to main content
Visitor II
May 25, 2023
Question

LIS2DTW12 SENSOR IC

  • May 25, 2023
  • 12 replies
  • 2561 views

Dear Sir/Madam,

I am trying to configure x axis, y axis and z axis in LIS2DTW12 SENSOR IC interfacing with NUCLEO-L476RG microcontroller when board is towards sky direction. These are the values in z axis1.26 in (+-2g configuration), 2.046 in (+-4g configuration) ,4.125 in (+-8g configuration) and8.254 in (+-16g configuration). Can you conform if the above values are correct?

Find the code below for your reference.

lis2dtw12_device_id_get(&dev_ctx, &whoamI);

   if (whoamI != LIS2DTW12_ID)

    while (1) {

     /* manage here device not found */

    }

  /* Configure power mode */

    lis2dtw12_power_mode_set(&dev_ctx, LIS2DTW12_HIGH_PERFORMANCE);

  /* Set Output Data Rate */

    lis2dtw12_data_rate_set(&dev_ctx, LIS2DTW12_XL_ODR_1k6Hz);

   /* Set full scale */

    lis2dtw12_full_scale_set(&dev_ctx, LIS2DTW12_4g);

   /* Configure FIFO continous mode */

   lis2dtw12_fifo_mode_set(&dev_ctx, LIS2DTW12_BYPASS_MODE);

   /* Configure FIFO continous mode */

    lis2dtw12_fifo_watermark_set(&dev_ctx, 10);

    lis2dtw12_fifo_mode_set(&dev_ctx, LIS2DTW12_STREAM_MODE);

 /* USER CODE END 2 */

 /* Infinite loop */

 /* USER CODE BEGIN WHILE */

 while (1)

 {

 uint8_t val,i,val_1;

 lis2dtw12_fifo_wtm_flag_get(&dev_ctx, &val);

if(val)

{

lis2dtw12_fifo_data_level_get(&dev_ctx, &val);

gl_Sample_Count = val+gl_Sample_index;

for (i = gl_Sample_index; i < gl_Sample_Count; i++) {

  /* Read acceleration data */

memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));

lis2dtw12_acceleration_raw_get(&dev_ctx, data_raw_acceleration);

acceleration_mg_x[gl_Sample_index] = lis2dtw12_from_fs4_to_mg(data_raw_acceleration[0]);

acceleration_mg_y[gl_Sample_index] = lis2dtw12_from_fs4_to_mg(data_raw_acceleration[1]);

acceleration_mg_z[gl_Sample_index] = lis2dtw12_from_fs4_to_mg(data_raw_acceleration[2]);

gl_Sample_index++;

if(gl_Sample_index >= 1023)

{

gl_Sample_index = 0;

//lis2dtw12_fifo_data_level_get(&dev_ctx, &val);

}

//lis2dtw12_fifo_data_level_get(&dev_ctx, &val);

  }

  }

lis2dtw12_fifo_ovr_flag_get(&dev_ctx, &val_1);

if(val_1)

{

lis2dtw12_fifo_mode_set(&dev_ctx, LIS2DTW12_BYPASS_MODE);

lis2dtw12_fifo_mode_set(&dev_ctx, LIS2DTW12_STREAM_MODE);

}

    This topic has been closed for replies.

    12 replies

    Technical Moderator
    May 26, 2023

    Hi @ggowd.1​ ,

    Could you write me the values (in hex or binary) of the registers from 28h to 2Dh?

    Thanks

    Federica

    ggowd.1Author
    Visitor II
    May 26, 2023

    Hi Federica Bossi,

    28h = 0X34

    29h = 0X00

    2Ah= 0X6C

    2Bh = 0XFB

    2Ch= 0X0C

    2Dh = 0X41

    these is the value when the controller is pointed towards the sky.

    can u confirm if the values are correct???

    Technical Moderator
    May 26, 2023

    Hi @ggowd.1​ ,

    Register 2Ch is certainly not correct since from datasheet the last two bits of the register should be '0':


    _legacyfs_online_stmicro_images_0693W00000bkwnQQAQ.pngI also have some doubts about the outputs of the OUT_Y registers, how did you do the conversion from LSB to mg?

    Thanks

    ggowd.1Author
    Visitor II
    May 26, 2023

    Hi Federica Bossi,

    Thank you for the reply. Can you let me know how to correct register 2Ch

    Below is the code for OUT_Y register conversion from LSB to mg.

    y =(int16_t)(out_t_y_h_data << 8) | out_t_y_l_data;

    y_g[gl_Sample_index] = y * (4.0 / 32768.0 );

    Technical Moderator
    May 26, 2023

    Hi @ggowd.1​ ,

    Initially I was seeing different values of the registers, the answer had not updated after your change.

    Can you confirm that you set FS=4g? Your data seems correct but if you set FS=2g and HP mode.

    Also, your calculation is wrong, you should multiply the LSB value by the sensitivity value. If the sensor is in static position on the Z axis you should read about 1000mg.

    If this solves your problem, please mark my answer as "Best Answer" by clicking on the "Select as Best" button, this can be helpful for Community users to find this solution faster :)

    ggowd.1Author
    Visitor II
    May 27, 2023

    Hi Federica Bossi,

    Thank you for the reply. I have set for +-4g configuration and high performance mode and the calculation

    z_g[gl_Sample_index] = z * (4.0 / 32768.0 ); instead of this i need use this formula

    z_g[gl_Sample_index] = z / 4.0 *(32768.0 );

    if i use this formula z_g[gl_Sample_index] = z / 4.0 *(32768.0 ); output will be in z axis 0.1241g

    ggowd.1Author
    Visitor II
    May 30, 2023

    Hi Federica Bossi,

    Please treat the above message as urgent and reply asap.

    Thank you

    Technical Moderator
    May 30, 2023

    Hi @ggowd.1​,

    Where did you find this sensitivity value (32768.0)?

    Technical Moderator
    May 30, 2023

    To obtain a value about 1000mg on Z axis when the sensor is in a steady state you should multiply your output in LSB by sensitivity reported in Datasheet corresponding to your full scale and power mode:
    _legacyfs_online_stmicro_images_0693W00000bl8NPQAY.pngLet me know if you read something near 1000mg.

    ggowd.1Author
    Visitor II
    May 31, 2023

    z =(int16_t)(out_t_z_h_data << 8) | out_t_z_l_data;

    z_g[gl_Sample_index] =( z / 4.0) * 0.488 ;

    As told by you on 26th May, I have divided the data in LSB by 4 and then multiply by the sensitivity value. But I am reading 2000mg in z-axis but the actual value should be 1000mg.

    Thanks