cómo programar la unidad de medición inercial BMI160 para bloquear indicadores de detección

0

¿Cómo se deben configurar los registros de BMI160 para permitir que se establezcan los indicadores de detección en INT_STATUS?

Por ejemplo, ¿cómo obtener TAP_STATUS byte-0 bit-5 s_tap_int para establecer si se toca XDK110?

No necesito una interrupción real, solo quiero un bucle de sondeo para leer periódicamente las banderas en INT_STATUS para verificar la detección de los diversos eventos de movimiento (toque, descarga, etc.)

    
pregunta Doug Null

1 respuesta

0



He habilitado esto en 2 sistemas embebidos. Para habilitar la interrupción del toque (o cualquier otra interrupción), simplemente debe establecer el bit de habilitación en 1. Si desea asignarlo a una salida de interrupción ... diga INT1 ... entonces debe asignar al pin INT1:

#define BMI160_REG_INT_EN_0    0x50
#define INT_S_TAP_EN           (1<<5)

#define BMI160_REG_INT_MAP_0   0x55
#define INT1_S_TAP             (1<<5)

bmi_write(BMI160_REG_INT_EN_0, INT_S_TAP_EN);
bmi_write(BMI160_REG_INT_MAP_0, INT1_S_TAP);

Además, si desea que esta interrupción realmente se enganche (permanezca verdadera para siempre), puede habilitar el enganche configurando el registro 0x54 = 0x0F. Creo que las interrupciones se pueden borrar estableciendo este registro en 0, luego volviendo a 0x0F. También puede ser preferible establecer el tiempo de retención en 2 veces su tasa de sondeo para que pueda capturarlo. La ecuación parece ser:

t = 312.5us x 2 ^ ([bits 3: 0] - 1)

Por lo tanto, establecer los bits 3: 0 = 0x4 le da: 312.5us x 2 (4-1) = 312.5us * 8 = 2.5ms

Algunas de las trampas en las que he caído con el IMC implican no establecer los modos de alimentación correctos antes de tiempo y no agregar un retraso entre las escrituras (450us para el sistema totalmente suspendido, 3us para los modos normal y de baja potencia).

Para referencia, tengo mi acelerómetro configurado de la siguiente manera: modo de bajo consumo, ODR de 25Hz, con el muestreo habilitado, BWP configurado en normal.

#define BMI160_REG_CMD          0x7E
#define CMD_PMU_ACC_LPW         (0x12)

#define BMI160_REG_ACC_RANGE    0x41
#define ACC_RANGE_4G            (5<<0)

#define BMI160_REG_ACC_CONF     0x40
#define ACC_US                  (1<<7)
#define ACC_BWP_NORM            (2<<4)
#define ACC_ODR_25              (6<<0)

bmi_write(BMI160_REG_CMD, CMD_PMU_ACC_LPW);
bmi_write(BMI160_REG_ACC_RANGE, ACC_RANGE_4G);
bmi_write(BMI160_REG_ACC_CONF, ACC_US | ACC_BWP_NORM | ACC_ODR_25 );
    
respondido por el Phy51x

Lea otras preguntas en las etiquetas