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.