cancel
Showing results for 
Search instead for 
Did you mean: 

IIS2MDC makes false detection after some time on the road

francsicosousa
Associate

I am developing a wireless sensor to detect vehicles using the IIS2MDC. My main logic is:

BOOT -> Init sensor -> Measure environment -> Set detection thresholds and offsets based on environment -> Set interrupts -> Wait for interrupt

 

On interrupt -> Acquire vehicle heading -> Send RF signal to gateway


After some hours working properly the sensor starts sending continuous signals without a vehicle or other metalic object nearby. How can i correct this behaviour? Any help is welcomed.

 

Below i'll leave the application code for the IIS2MDC initialization:

 

CFG_REG_A is always 0x90

CFG_REG_B is always 0x09

CFG_REG_C is always 0x50

INT_CTRL_REG is 0x00 on startup and 0x45 on work mode

 

#define IIS2MDC_STARTUP_CFG 		{0x90, 0x09, 0x50, 0x00}
#define IIS2MDC_WORK_CFG    		{0x90, 0x09, 0x50, 0x45}

bool iis2mdc_startup_mode() {
  uint8_t dev_id = 0;
  bool error = iis2mdc_i2c_read(WHO_AM_I, &dev_id, 1);

  if (dev_id != DEVICE_ID || error) return false;

  uint8_t cfg_reg_a = (1<<5); // soft reset
  if (iis2mdc_i2c_write(CFG_REG_A, &cfg_reg_a, 1)) return false;

  Task_sleep(5);

  cfg_reg_a = (1<<6); // reboot
  if (iis2mdc_i2c_write(CFG_REG_A, &cfg_reg_a, 1)) return false;

  Task_sleep(MS_TO_TICKS(20));

  uint8_t config[4] = IIS2MDC_STARTUP_CFG;
  if (iis2mdc_i2c_write(CFG_REG_A, config, 4)) return false;

  return true;
}

bool iis2mdc_work_mode() {
	uint8_t config[4] = IIS2MDC_WORK_CFG;
	if (iis2mdc_i2c_write(CFG_REG_A, config, 4)) return false;

	return true;
}

bool iis2mdc_learn() {
	uint8_t i = 0;
	int64_t x = 0;
	int64_t y = 0;
	int64_t z = 0;

	while (i < REF_SAMPLES) {
		uint8_t status = 0;
		if (iis2mdc_i2c_read(STATUS_REG, &status, 1)) return false;

		if (status & 0x08) {
			MagneticRawData_t raw_data = {0,0,0};
			if (iis2mdc_i2c_read(OUTPUT_REG, (uint8_t*)&raw_data, OUTPUT_REG_LEN)) return false;

			x += raw_data.x;
			y += raw_data.y;
			z += raw_data.z;

			i++;
		}
	}

	x = x / REF_SAMPLES;
	y = y / REF_SAMPLES;
	z = z / REF_SAMPLES;

	int16_t offsets[3] = {x,y,z};
	iis2mdc_i2c_write(OFFSET_REGISTER, (uint8_t*)offsets, OFFSET_REG_LEN);

	uint16_t mag = 4 * sqrt(y*y + z*z) / REF_SAMPLES;
	if (iis2mdc_i2c_write(INT_THRESH_REG, (uint8_t*)&mag, 2)) return false;


	return true;
}

void main() {
    // Abstracted main
    iis2mdc_startup_mode();
    iis2mdc_learn();
    iis2mdc_work_mode();
    
    // Start a task that is released on interrupt
    // and send the RF signal
}

 

0 REPLIES 0