cancel
Showing results for 
Search instead for 
Did you mean: 

Movement detection with LIS2DH

wilfried walezack
Associate III
Posted on January 02, 2018 at 15:59

HI everybody,

I'm working with the LIS2DH for a motion sensor, and I'm using the embbeded functions of motion detection for drive the state machine of my MCU.

The operation is simple, but I have some trouble with the sensor.

I want to detect a movement if the duration is min 5sec, and I want to detect End of movement if the duration is 5sec.  

So I use the IA1 funtion with INT1 output for detection movement.

And IA2 function with INT2 output for End of movement detection.

Both INT output are OK with the detection, but I have non stable operation. Sometimes the INT1 toggles witout reason, sometime it's INT2.....

So if you run with the sensor in your hand, the INT1 output is high after 5sec. And if you put the sensor on the floor, the INT2 output is high after 5sec.

Sample is 1Hz ,Range is 2G.

High filter is set.

INT1_CFG is set to High level detection on X, Y , Z.  OR condition

INT2_CFG is set to Low level

detection on X, Y , Z.  OR condition

INT1_duration & INT2_duration are set to 0x05 in order to have 5sec of time detection.

INT1_threshold & INT2_threshold are set to 0x02, in order to have high sensivity.

Below the setting of the LIS2DH:

status_t LIS2DH_Init(void)

{

SPI1_Initialize();

CS_LIS1_SetHigh();

CS_LIS2_SetHigh();

LIS2DH_WriteReg(LIS2DH1,LIS3DH_CTRL_REG1,0x1F);

LIS2DH_WriteReg(LIS2DH1,LIS3DH_CTRL_REG2,0x03);

LIS2DH_WriteReg(LIS2DH1,LIS3DH_CTRL_REG3,0x40);

LIS2DH_WriteReg(LIS2DH1,LIS3DH_CTRL_REG4,0x80);

LIS2DH_WriteReg(LIS2DH1,LIS3DH_CTRL_REG5,0x00);

LIS2DH_WriteReg(LIS2DH1,LIS3DH_CTRL_REG6,0x20);

//START detection

LIS2DH_WriteReg(LIS2DH1,LIS3DH_INT1_CFG,0x02);

LIS2DH_WriteReg(LIS2DH1,LIS3DH_INT1_THS,0x02);

LIS2DH_WriteReg(LIS2DH1,LIS3DH_INT1_DURATION,0x05);

//STOP detection

LIS2DH_WriteReg(LIS2DH1,LIS3DH_INT2_CFG,0x15);

LIS2DH_WriteReg(LIS2DH1,LIS3DH_INT2_THS,0x02);

LIS2DH_WriteReg(LIS2DH1,LIS3DH_INT2_DURATION,0x05);

return MEMS_SUCCESS;

}

Could you please help to understant and solve this problème?

Thanks a lot for your support.

wilfried

24 REPLIES 24
wilfried walezack
Associate III
Posted on February 23, 2018 at 14:37

HI,

Please find bellow scope capture of the SPI communication

Yellow curve -> clock

blue curve -> MOSI

1) Write 0x31 into 0x33 register (LIS3DH_INT1_DURATION) - > Write OK

and Read 0x33 register -> Read OK

2) Zoom on the Reading communication of the 0x33 register-> Read OK

3) Write 0x32 into 0x33 register (LIS3DH_INT1_DURATION) - > Write OK

and Read 0x33 register -> Read KO (you can see distorsion of the data ) 

4) Zoom on the Reading communication of the 0x33 register-> Read KO

On the picture 4, we can see that the LIS2DH pull down the bit7 of the data.

SPI frequency is 2Mhz.

I don't send START condition, just SPI communication to the LIS2DH sensor.

Could you pls help me to solve this issue?

Best regards

wilfried

0690X00000609kmQAA.png0690X00000609lBQAQ.png0690X00000609nQQAQ.png0690X00000609jFQAQ.png
wilfried walezack
Associate III
Posted on February 23, 2018 at 16:18

Yes, the SPI mode is set to Mode3.

I tried with reset CS after writing, and also to held high the CS signal between writng and reading, but the result is the same. bit 7 are already pull down.

see below

if I put 100ms between the writing and readin, same results...

0690X00000609jKQAQ.png0690X00000609lLQAQ.png
Posted on February 23, 2018 at 15:48

When the second LIS2DH pull down the bit7 of the data, it actually does acknowledge of his address 0x31.

Unfortunately I don't see the CS signal, but I suppose you don't reset and set CS signal between write and read operation and this cause the problem. Can you please check it?

The SPI mode should be mode 3, but I suppose you are using this mode.

Posted on February 23, 2018 at 16:34

I though the CS driven from the same pin with an invertor.

You should also toggle the CS signal on the second sensor, it should be break the unwanted I2C communication.

Anyway it is strange the second sensor accept the communication as I2C, it meas there must be a start bit (SDA high to low with clock high), but it should not be there.

wilfried walezack
Associate III
Posted on February 23, 2018 at 17:38

OK, 

if I toogle the CS of the second LIS2DH,  the SPI communication is OK, I can now write the value 0x32 into the register 0x33, and also I can read it.

Your 2nd proposal seems to be working. but I'm confuse with this solution. Normally with the SPI communication, we  do not have to toogle the CS of the other device.

Could you give me more information about your first solution (inverter). It's not clear for me.

Regards

Posted on February 24, 2018 at 11:35

'Your 2nd proposal seems to be working. but I'm confuse with this solution. Normally with the SPI communication, we  do not have to toogle the CS of the other device.' You are right, this is not common, but please be aware the the CS of the sneor is not only chip sellect but also switch between I2C and SPI bus. So the inactive sesnor with CS=1 is listening the communication and expect I2C data. When you send the data 0x32 it is actually I2C address of the sensor and the sensor make ACK which disturb your SPI coomunication. When you togggle the CS pint, you interrupt the I2C communication and the sensor cannot do the ACK.

The solution with the invertor would be usable if you want ot distinguish between two sensor with only one MCU pin, so one CS pin would connected directly to MCU and second through invertor.

wilfried walezack
Associate III
Posted on February 27, 2018 at 11:20

Hi Miroslav,

I'm validated your first proposal. So I toggle the CS of the opposite sensor after a writing or a reading on the first sensor. Just a last question, I put a delay à 50us for the toggle of the CS.:

CS_LIS2_SetLow();__delay_us(50);CS_LIS2_SetHigh();

This delay is working on my board. Do you think it's a good delay for get a stable working ?

Thanks a lot for your support.

wilfried

Miroslav BATEK
ST Employee
Posted on February 27, 2018 at 14:32

50us delay should work well.

wilfried walezack
Associate III
Posted on April 11, 2018 at 22:49

Hi Miroslav,

I'm looking now for use the FIFO mode of the LIS2DH.

I'm understand how the 3 different fifo modes according the application note, but I have one questions,

I have to analsye the XYZ datas when a shock is triggered from the sensor, so the best way is to use the Stream to fifo mode in order to  set the INT1 trigger when the shock is detected and to stop automatically the fill of the fifo when the fifo is full. But I want to be sure to get 15 or 20 samples before the INT1 in order to analyse the XYZ values after the shock.

How is it possible to be sure to get 15 or 20 samples after the interrup? 

Thanks for your support.

wilfried

Posted on April 12, 2018 at 09:55

I'm not sure if you need samples before or after the interrupt or both.

It is not a problem to get data before the interrupt. To get data after the interrupt you have to read them in the real time, or start FIFO mode from the MCU immediately when the trigger occurs.

Please read this thread

https://community.st.com/0D50X00009XkWbLSAV

It is also valid for LIS2DH.