¿Cómo configuro el LIS3DH como un podómetro que genera interrupciones al caminar?

1

Encontré muchos algoritmos para podómetros que asumen una CPU rápida con una ALU decente y altas tasas de muestreo, que no tengo. (Z80) Sin embargo, el LIS3DH tiene varias opciones para generar interrupciones cuando ocurre alguna condición.

¿Cómo puedo configurarlo para que genere interrupciones cuando estoy caminando? No se necesita alta precisión, solo necesito saber si el usuario se está moviendo o no.

Revisé la hoja de datos, pero hay más opciones de las que puedo entender. La detección de clics parecía prometedora, pero dio resultados inútiles y semi-aleatorios, tal vez porque solo detecta clics rápidos y no velocidades de caminata. También hay opciones para interrupción de caída libre, interrupción inercial, detección de orientación, filtro de paso alto, FIFO y más.

Dormiré en él y trabajaré mañana, pero cualquier palabra sabia es muy apreciada.

Hoja de datos
Application note

    
pregunta Pepijn

1 respuesta

1

Las secciones 6.3.2 y 6.3.3 de la nota de aplicación explican cómo provocar una interrupción cuando un eje excede un determinado valor. Combinado con una interrupción de paso alto para deshacerme del vector de gravedad, me permitió establecer un umbral muy bajo que se dispara a 64 mg.

  call DelayFrame ; raise CS

  ld a, LIS3DH_REG_WHOAMI
  ld b, a
  call ReadRegister
  ld a, c
  ldh [hWhoAmI], a

  call DelayFrame ; raise CS

; based on application note section 6.3.2-3
  ld a, LIS3DH_REG_CTRL1
  ld b, a
  ld a, $77 ; CTRL1: enable all axes, 400HZ
  ld c, a
  call WriteRegister
  ld a, $0F ; CTRL2: high-pass filter on everything
  call SPITransfer
  ld a, $00 ; CTRL3: not used
  call SPITransfer
  ld a, $88 ; CTRL4: BDU, high resolution, 2g
  call SPITransfer
  ld a, $08 ; CTRL5: latch interrupt on INT1_SRC 
  call SPITransfer

  call DelayFrame ; raise CS

  ld a, LIS3DH_REG_INT1CFG
  ld b, a
  ld a, %00101010 ; int1 config: enable high int on all axes
  ld c, a
  call WriteRegister
  ld a, 0 ; src
  call SPITransfer
  ld a, 4 ; threshold
  call SPITransfer
  ld a, 0 ; minimum duration
  call SPITransfer
    
respondido por el Pepijn

Lea otras preguntas en las etiquetas