FreeFall Detection

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

FreeFall Detection

跳至解决方案
1,641 次查看
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);
}

标签 (1)
1 解答
664 次查看
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

在原帖中查看解决方案

2 回复数
665 次查看
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

664 次查看
andrear__2810
Contributor I

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

0 项奖励