Saltar a contenido
← Volver a OPRobots.org

Sensores

Acelerómetro H3LIS331DL

El H3LIS331DL es un acelerómetro digital de alta g fabricado por STMicroelectronics, diseñado para aplicaciones de impacto y alta aceleración. Soporta fondos de escala de ±100 g, ±200 g y ±400 g con salida digital SPI/I²C de 16 bits.

Característica Detalle
Modelo H3LIS331DL
Fondo de escala ±400 g
Resolución 16 bits (12 bits efectivos)
Sensibilidad 400/32768 ≈ 0.0122 g/LSB
ODR 1000 Hz (modo normal)
Interfaz SPI 4 hilos, Modo 0
Frecuencia SPI 5.25 MHz
WHO_AM_I esperado 0x33 (definido en h3lis.h:23)

Driver SPI

Capa física

La comunicación SPI se configura en setup.c:83-94:

Parámetro Valor
Periférico SPI1
Modo Master, full-duplex
CPOL 0 (reloj bajo en idle)
CPHA 0 (muestreo en flanco de subida)
Formato 8 bits, MSB first
Velocidad APB2 84 MHz ÷ 16 = 5.25 MHz
NSS Software (PA0)

Nota: El H3LIS331DL soporta hasta 10 MHz en SPI. La frecuencia de 5.25 MHz proporciona un margen de seguridad para el cableado en protoboard.

Capa de registro

El driver implementa tres primitivas de acceso SPI en h3lis.c:24-58:

Función Operación SPI
h3lis_read_reg(reg) CS↓ → enviar 0x80 | reg → leer 1 byte → CS↑
h3lis_write_reg(reg, val) CS↓ → enviar reg → enviar val → CS↑
h3lis_read_burst(start, buf, len) CS↓ → enviar 0xC0 | start → leer len bytes → CS↑

Formato de dirección SPI: - Bit 7: 1 = lectura, 0 = escritura - Bit 6: 1 = burst (auto-incremento de dirección) - Bits [5:0]: dirección del registro

Mapa de registros

Se documentan solo los registros utilizados por el firmware. Para el mapa completo, consultar el datasheet del H3LIS331DL.

Registro Dirección Descripción
WHO_AM_I 0x0F Identificación del dispositivo
CTRL_REG1 0x20 ODR, modo de potencia, habilitación de ejes
CTRL_REG2 0x21 Filtro paso alto
CTRL_REG3 0x22 Configuración de interrupciones
CTRL_REG4 0x23 BDU, full-scale, endianness, modo SPI
CTRL_REG5 0x24 Sleep-to-wake, FIFO
STATUS_REG 0x27 Flags de datos disponibles
OUT_X_L/H 0x28-0x29 Aceleración eje X
OUT_Y_L/H 0x2A-0x2B Aceleración eje Y
OUT_Z_L/H 0x2C-0x2D Aceleración eje Z

Configuración del sensor

La inicialización se realiza en h3lis_init():

// Verificar presencia del sensor
if (h3lis_who_am_i() != H3LIS_DEVICE_ID) return false;

// Configurar registro CTRL_REG1
h3lis_write_reg(H3LIS_CTRL_REG1, H3LIS_CR1_NORMAL_1000HZ_XYZ);  // 0x3F

// Configurar registro CTRL_REG4
h3lis_write_reg(H3LIS_CTRL_REG4, H3LIS_CR4_BDU_FS400G);         // 0xB0

CTRL_REG1 (0x20) = 0x3F

Bit Campo Valor Significado
[7:6] ODR2:1 11 1000 Hz
[5:4] PM2:1 11 Modo normal
3 1
2 Zen 1 Eje Z habilitado
1 Yen 1 Eje Y habilitado
0 Xen 1 Eje X habilitado

CTRL_REG4 (0x23) = 0xB0

Bit Campo Valor Significado
7 BDU 1 Block Data Update — evita lectura de bytes inconsistentes
6 BLE 0 Little-endian
[5:4] FS1:0 11 ±400 g
3 0
2 0
1 0
0 SIM 0 Modo SPI 4 hilos

Lectura de datos

La lectura de aceleración se realiza en h3lis_update() mediante ráfaga SPI de 6 bytes:

sequenceDiagram
    participant MCU as STM32F401
    participant CS as PA0 (CS)
    participant SPI as SPI1
    participant SENSOR as H3LIS331DL

    MCU->>CS: LOW
    MCU->>SPI: 0xC0 | 0x28 (read burst desde OUT_X_L)
    MCU->>SPI: 0x00 (dummy)
    SPI->>SENSOR: CLK
    SENSOR->>MCU: OUT_X_L
    MCU->>SPI: 0x00 (dummy)
    SENSOR->>MCU: OUT_X_H
    MCU->>SPI: 0x00 (dummy)
    SENSOR->>MCU: OUT_Y_L
    MCU->>SPI: 0x00 (dummy)
    SENSOR->>MCU: OUT_Y_H
    MCU->>SPI: 0x00 (dummy)
    SENSOR->>MCU: OUT_Z_L
    MCU->>SPI: 0x00 (dummy)
    SENSOR->>MCU: OUT_Z_H
    MCU->>CS: HIGH

Formato de datos raw

La salida del sensor es un entero de 16 bits en complemento a dos, justificado a la izquierda:

Bits: [15 ... 4] → 12 bits significativos
Bits: [3 ... 0]  → siempre 0 (justificación izquierda)

Reconstrucción en h3lis.c:99-105:

out->x = (int16_t)((uint16_t)buf[1] << 8 | buf[0]);  // OUT_X_H << 8 | OUT_X_L
out->y = (int16_t)((uint16_t)buf[3] << 8 | buf[2]);
out->z = (int16_t)((uint16_t)buf[5] << 8 | buf[4]);

Conversión raw → aceleración [g]

float H3LIS_SENS_400G = 400.0f / 32768.0f;  // ≈ 0.012207 g/LSB

h3lis_data.ax = (float)raw.x * H3LIS_SENS_400G;

Dado que la salida está justificada a la izquierda (12 bits en [15:4]), el LSB efectivo es 16× mayor de lo que sería con 16 bits completos. La fórmula raw × 400/32768 es correcta porque el numerador y denominador escalan coherentemente con el rango de 16 bits.

Constantes del sensor

Definidas en h3lis.h:33-39:

Constante Valor Descripción
H3LIS_SENS_100G 100.0f / 32768.0f Sensibilidad para ±100 g
H3LIS_SENS_200G 200.0f / 32768.0f Sensibilidad para ±200 g
H3LIS_SENS_400G 400.0f / 32768.0f Sensibilidad para ±400 g (usada)
H3LIS_DEVICE_ID 0x33 WHO_AM_I esperado
H3LIS_SPI_READ 0x80 Bit de lectura SPI
H3LIS_SPI_MULTI 0x40 Bit de burst SPI

Documento generado el 2026-06-27. Ver también Hardware, Cinemática.