2023-10-19 02:37 AM - edited 2023-10-19 02:48 AM
I use the lis3dh sensor to communicate through SPI, and the sensor settings are as follows:
lis3dh_gvWriteReg(LIS3DH_CTRL_REG0,0x90);
lis3dh_gvWriteReg(LIS3DH_CTRL_REG1,0x37);
lis3dh_gvWriteReg(LIS3DH_CTRL_REG2,0x00);
lis3dh_gvWriteReg(LIS3DH_CTRL_REG3,0x40);
lis3dh_gvWriteReg(LIS3DH_CTRL_REG4,0x30);
lis3dh_gvWriteReg(LIS3DH_CTRL_REG5,0x00);
lis3dh_gvWriteReg(LIS3DH_CTRL_REG6,0x00);
lis3dh_gvWriteReg(LIS3DH_INT1_THS,30);
lis3dh_gvWriteReg(LIS3DH_INT1_DURATION,0);
lis3dh_gvWriteReg(LIS3DH_INT1_CFG,0x2a);
Question 1:
The read acceleration value is less than the set threshold, and an interrupt occurs when it exceeds the threshold。why?
Question 2:
Why can a slight tap on the sensor detect an acceleration of 12 grams?
Question 3:
Is the conversion to acceleration values correct?
lis3dh_gvReadReg(LIS3DH_OUT_X_L, &val[0]); //28
lis3dh_gvReadReg(LIS3DH_OUT_X_H, &val[1]);
*p_x = val[0] | (val[1] << 8);
*p_x >>= 6;
*p_x *= 48;
2023-10-19 07:11 AM
Hi @Andy Zh ,
If my reply answered your question, please click on Accept as Solution at the bottom of this post. This will help other users with the same issue to find the answer faster :)
2023-10-19 07:16 PM - edited 2023-10-20 02:42 AM
1. LIS3DH full scale is 16g, And it works in normal mode. The trigger threshold is set to 30, and the actual acceleration trigger value is 30*186mg = 5580mg. But when the trigger interrupt occurs, the output register is read and the output acceleration value is less than 5580mg. I think it should be greater than 5580mg. When the threshold trigger occurs, will enter the data processing function (void DealAccData(void)) ,the debug log is shown in the following figure:
void lis3dh_gvGetAccData(int16_t *p_x, int16_t *p_y, int16_t *p_z)
{
uint8_t st;
uint8_t val[6];
lis3dh_gvReadReg(LIS3DH_STATUS_REG2, &st); //27
if(st & 0x01)
{
lis3dh_gvReadReg(LIS3DH_OUT_X_L, &val[0]); //28
lis3dh_gvReadReg(LIS3DH_OUT_X_H, &val[1]);
}
else
{
val[0] = 0;
val[1] = 0;
}
if(st & 0x02)
{
lis3dh_gvReadReg(LIS3DH_OUT_Y_L, &val[2]); //2A
lis3dh_gvReadReg(LIS3DH_OUT_Y_H, &val[3]);
}
else
{
val[2] = 0;
val[3] = 0;
}
if(st & 0x04)
{
lis3dh_gvReadReg(LIS3DH_OUT_Z_L, &val[4]); //2c
lis3dh_gvReadReg(LIS3DH_OUT_Z_H, &val[5]);
}
else
{
val[4] = 0;
val[5] = 0;
}
*p_x = val[0] | (val[1] << 8);
*p_x >>= 6;
// convert to mg
*p_x *= 48;
*p_y = val[2] | (val[3] << 8);
*p_y >>= 6;
*p_y *= 48;
*p_z = val[4] | (val[5] << 8);
*p_z >>= 6;
*p_z *= 48;
DEBUG_PRINT("LIS3DH_STATUS_REG2 = %x\r\n",st);
}
void DealAccData(void)
{
uint8_t reg2;
lis3dh_gvReadReg(LIS3DH_INT1_SRC,®2);
lis3dh_gvGetAccData((int16_t *)&Var_giXMaxAcc,(int16_t *)&Var_giYMaxAcc,(int16_t *)&Var_giZMaxAcc);
DEBUG_PRINT("@X=%d mg,Y=%d mg,Z=%d mg,LIS3DH_INT1_SRC =
%x\r\n",Var_giXMaxAcc,Var_giYMaxAcc,Var_giZMaxAcc,reg2);
}
2. I think the conversion is correct because the test gravity acceleration is around 1g when the sensor is not moving.
This is the captured SPI bus data and the data printed by the device