2017-09-03 01:27 AM
Hello sir,
HELLO EVERYBODY,
I have a question about LIS3MDL. Expecially, interrupt problem.I am using LIS3MDL below sequence.=================================================================================
1. In normal circumstance, I get a basic data for reference threshold of Interrupt.
Normally, 0.4 ~0.5 gauss. And plus 0.1 gause for offset value.
2. I put in the data for Threshold value. And I enable the interrupt. 3. Wait the interrupt (basic data[0.4 ~0.5 gauss] + offset[0.1 gauss])4. If interrupt is happened, the interrupt signal wake main CPU(stm32f103rct6)problemI checked how many times interrupt is happened, in normal circumstance(0.4 ~0.5gauss)
In our office, interrupt is not happened. ( It is good because our office does not have the change of geomagnetic)
Outside, interrupt is happend eventhough there are nothing to change geomagnetic.
==>I wonder why the interrupt is happened outside?I hope you give me the solution.
================================================================================
The function,
void LIS3MDL_Init(void)
{
LIS3MDL_REGISTER_write_SET(LIS3MDL_ADDRESS1,CTRL_REG1,LIS3MDL_REG1_ULTRA_HIGH_XY | LIS3MDL_REG1_DR_80_HZ); // ODR
LIS3MDL_REGISTER_write_SET(LIS3MDL_ADDRESS1,CTRL_REG2,LIS3MDL_SCALE_4_GAUSS); // scale LIS3MDL_REGISTER_write_SET(LIS3MDL_ADDRESS1,CTRL_REG3,LIS3MDL_REG3_CONTINUOUS); LIS3MDL_REGISTER_write_SET(LIS3MDL_ADDRESS1,CTRL_REG4,LIS3MDL_REG4_ULTRA_HIGH_Z); // z-mode LIS3MDL_REGISTER_write_SET(LIS3MDL_ADDRESS1,CTRL_REG5,LIS3MDL_REG5_BDU);}
void LIS3MDL_Reinit(uint16_t reference_data)
{ uint8_t low_dataz=0, high_dataz =0;low_dataz = reference_data & 0x00ff;
high_dataz = (reference_data>>8) & 0x00ff; LIS3MDL_REGISTER_write_SET(LIS3MDL_ADDRESS1,INT_THS_L,low_dataz); LIS3MDL_REGISTER_write_SET(LIS3MDL_ADDRESS1,INT_THS_H,high_dataz); LIS3MDL_REGISTER_write_SET(LIS3MDL_ADDRESS1,INT_CFG,(LIS3MDL_INT_CFG_YIEN|LIS3MDL_INT_CFG_ZIEN|LIS3MDL_INT_CFG_IEA|LIS3MDL_INT_CFG_IEN));}================================================================================The Code Sequence,
uint16_t Geo_reference_offset = 250;
LIS3MDL_Init();
for(int i =0;i<Geo_Average;i++)
{ do{ geo_status = LIS3MDL_STATUS_READ(); geo_status = geo_status & geo_shift; }while(!geo_status); Geo_Ref[i] = Check_Geomagnetic_Value(OUT_Z_L,OUT_Z_H); if(Geo_Ref[i]>=32767) { if(i==0)Geo_max_value = Geo_Ref[i]; else { if(Geo_Ref[i]<Geo_max_value)Geo_max_value = Geo_Ref[i]; } } else { if(Geo_Ref[i]>Geo_max_value)Geo_max_value = Geo_Ref[i]; } HAL_Delay(10);}Geo_data = Geo_max_value;
if(Geo_data>=Geo_Positive_MAX)geo_reference = (65535 - Geo_data)+Geo_reference_offset;else geo_reference = Geo_data + Geo_reference_offset;LIS3MDL_Reinit(geo_reference);
while(1){ // wait interrupt of LIS3MDL }===============================================================================I've been tryied this problem to solve it however, I can not solve it.
Please, help me.
2017-09-04 02:59 AM
What does you system should actually do? What is the purpose?
Did you try to increase the offset? It is very difficult to advice. Are you sure that outside are no magnetic disturbances?
2017-09-04 07:54 PM
Hello sir,
​
Project : Check the magnetic of Car
​
I tried to increase the offset 0.04 gauss or more for 4-Gauss system.
And I am sure about the outside does not have Magnetic. I just put the sensor on the ground with Battery in empty space.
​
As a result of careful observation, this phenomenon which is making interrupt is happened night time expecially 19 ~ 21, 02, 45.
Thanks for your co-operation.
​
​
​