BMI160 significant motion problem

Hi,

We are having problems with significant motion interrupt triggering. It behaves really flaky.

On some program run, interrupt behaves as it should, and sometimes, it cannot be triggered, no matter what motion you do . My opinion is that BMI isn't configured properly every time, altough  bmi160_set_int_config  function returns that is executed properly.

 

Flow in program is: 

  • Initialize sensor through bmi160_init
  • Configure sensor with these parameters: 

 

  _bmi160_sensor.accel_cfg.odr = BMI160_ACCEL_ODR_1600HZ;
  _bmi160_sensor.accel_cfg.range = BMI160_ACCEL_RANGE_2G;
  _bmi160_sensor.accel_cfg.bw = BMI160_ACCEL_BW_NORMAL_AVG4;

  _bmi160_sensor.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;

  _bmi160_sensor.gyro_cfg.odr = BMI160_GYRO_ODR_3200HZ;
  _bmi160_sensor.gyro_cfg.range = BMI160_GYRO_RANGE_2000_DPS;
  _bmi160_sensor.gyro_cfg.bw = BMI160_GYRO_BW_NORMAL_MODE;

  _bmi160_sensor.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE;
  • Configure sensor interrupt with these parameters: 
interrupt_config.int_channel = BMI160_INT_CHANNEL_1;
  interrupt_config.int_type = BMI160_ACC_SIG_MOTION_INT;
  interrupt_config.int_pin_settg.output_en = BMI160_ENABLE;
  interrupt_config.int_pin_settg.output_mode = BMI160_DISABLE;
  interrupt_config.int_pin_settg.output_type = BMI160_DISABLE;
  interrupt_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;
  interrupt_config.int_pin_settg.input_en = BMI160_DISABLE;
  interrupt_config.int_pin_settg.latch_dur = BMI160_LATCH_DUR_NONE;

  // Proof time of motion detection. 0=0.24s, 1=0.48s, 2=0.96s, 3=1.92s
  interrupt_config.int_type_cfg.acc_sig_motion_int.sig_mot_proof = sig_mot_proof;
  // Time to skip between two motion detect check. 0=1.28s, 1=2.56s, 2=5.12s,
  // 3=10.24s
  interrupt_config.int_type_cfg.acc_sig_motion_int.sig_mot_skip = sig_mot_skip;
  /* Threshold value. (2-g range) -> Threshold * 3.91 mg
  (4-g range) -> Threshold * 7.81 mg
  (8-g range) -> Threshold * 15.63 mg
  (16-g range) -> Threshold * 31.25 mg */
  interrupt_config.int_type_cfg.acc_sig_motion_int.sig_mot_thres = sig_mot_thres;

  int8_t result = bmi160_set_int_config(&interrupt_config, &_bmi160_sensor);
  • Reading data and interrupt data in separate thread

 

Data from accelerometer works fine no matter what, but interrupt isn't.

Do you have any clue what can be problem here? Do I need to change some values in configuration? Do I need to change an order of execution, so set interrupt configuration before sensor configuration?

Looking forward for your answer.

Best regards,

Josip

 

 

Best reply by sinya

Hi,

1. BMI160 supports significant motion  in low power mode.

2. it does not depend on the gyroscope status.

3. it seems you got the significant motion interrupt in acc normal mode.

4. based on step 3:

1)firstly write 0x12 to register 0x7e , set MSB bit acc_us of register 0x40 to 1 in order to set acc power mode to low power mode.

2) set bit [3:0] of register 0x40 to 7 for 50hz ODR

View original
8 replies
Resolved