FreeFall Detection

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

FreeFall Detection

Jump to solution
1,978 Views
andrear__2810
Contributor I

Tengo problemas con mi código para el acelerómetro FXOS8700CQ, deseo generar una interrupción por FreeFall pero no se genera, no se si sea necesario configurar otro registro que no haya hecho, esta es la función para inicializar el sensor que he estado utilizando:

void FXOS8700CQ1_Init(void)
{
//Reset all registers to POR values
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG2, 0x40);
//delay
Pause(0x400);

// +/-2g range with 0.244mg/LSB
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, XYZ_DATA_CFG_REG, 0x00);
//1ms delay
Pause(0x100);

#if FREEFALL_DETECTION
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, FF_MT_CFG_REG, 0xB8); // Freefall detection for X and Y and Z axis
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, FT_MT_THS_REG, 0x03); // Threshold Setting Value for the Freefall detection of < 0.2g (0.2g/0.064g = 3.17 counts)
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, FF_MT_COUNT_REG, 0x0C); // Set the debounce counter to 100 ms timer (120ms/100Hz = 12 counts)
#endif

//Only accelerometer sensor is active
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, M_CTRL_REG1, 0x00);

//High Resolution mode
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG2, 0x02);

//Push-pull, active low interrupt
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG3, 0x00);

//Enable DRDY interrupt
//Enable Freefall interrupt
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG4, 0x05);

I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG5, 0x05);

//ODR= 3.125Hz Reduced noise, Active mode
I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG1, 0x35);
}

Labels (1)
1 Solution
1,001 Views
david_diaz
NXP Employee
NXP Employee

Hola Claudia,

Gracias por escribir.

En este caso te recomiendo usar la siguiente configuración en los registros correspondientes al Freefall Detection:

#if FREEFALL_DETECTION

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, FF_MT_CFG_REG, 0x38);                 // Freefall detection for X and Y and Z axis

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, FT_MT_THS_REG, 0x04);                 // Threshold Setting Value for the Freefall detection of  0.2g (4 * 0.063)

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, FF_MT_COUNT_REG, 0x04);            // Set the debounce counter to 80 ms timer (20ms * 4)

 

        reg_val = I2C_ReadRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG4);

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG4, reg_val|0x04);             // Enable Motion/Freefall Interrupt

        reg_val = I2C_ReadRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG5);

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG5, reg_val|0x04);             // Freefall interrupt routed to INT1 - PTC6

#endif

Toma en cuenta que al estar usando el modo acelerómetro, el ODR cambia para tu configuración.

En este caso te recomiendo modificar el registro A_FFMT_COUNT como se muestra en el código mostrado. Puedes encontrar mas información en la tabla 94 (Table 94) de la hoja de datos en:

http://www.nxp.com/files/sensors/doc/data_sheet/FXOS8700CQ.pdf 

El proyecto se encuentra adjunto a esta respuesta.

Espero que esta información sea útil para ti.

 

Saludos,

David

View solution in original post

2 Replies
1,002 Views
david_diaz
NXP Employee
NXP Employee

Hola Claudia,

Gracias por escribir.

En este caso te recomiendo usar la siguiente configuración en los registros correspondientes al Freefall Detection:

#if FREEFALL_DETECTION

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, FF_MT_CFG_REG, 0x38);                 // Freefall detection for X and Y and Z axis

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, FT_MT_THS_REG, 0x04);                 // Threshold Setting Value for the Freefall detection of  0.2g (4 * 0.063)

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, FF_MT_COUNT_REG, 0x04);            // Set the debounce counter to 80 ms timer (20ms * 4)

 

        reg_val = I2C_ReadRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG4);

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG4, reg_val|0x04);             // Enable Motion/Freefall Interrupt

        reg_val = I2C_ReadRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG5);

        I2C_WriteRegister(FXOS8700CQ_I2C_ADDRESS, CTRL_REG5, reg_val|0x04);             // Freefall interrupt routed to INT1 - PTC6

#endif

Toma en cuenta que al estar usando el modo acelerómetro, el ODR cambia para tu configuración.

En este caso te recomiendo modificar el registro A_FFMT_COUNT como se muestra en el código mostrado. Puedes encontrar mas información en la tabla 94 (Table 94) de la hoja de datos en:

http://www.nxp.com/files/sensors/doc/data_sheet/FXOS8700CQ.pdf 

El proyecto se encuentra adjunto a esta respuesta.

Espero que esta información sea útil para ti.

 

Saludos,

David

1,001 Views
andrear__2810
Contributor I

Muchísimas gracias, ya se generó la interrupción cambiando eso

0 Kudos
Reply