Arquitectura Software
Visión general
El firmware de FujitoraBot2 corre sobre STM32F405RGT6 con LibOpenCM3. Sigue un modelo baremetal con interrupciones jerarquizadas: el SysTick a 1 kHz orquesta las lecturas de sensores y encoders, mientras que un timer de alta prioridad (TIM5) ejecuta el lazo de control a 1 kHz.
Flujo principal
flowchart TD
A[main] --> B[setup]
B --> C[show_battery_level]
C --> D[eeprom_load]
D --> E[sensors_calibration]
E --> F{race_started?}
F -->|No| G[menu_handler]
G --> H{check_start_run?}
H -->|Sí| I[Configurar cinemática]
I --> J[Cuenta atrás + fade RGB]
J --> K[Arrancar motores]
K --> F
H -->|No| F
F -->|Sí| L{IR start off?}
L -->|Sí| M[emergency_stop]
L -->|No| F
Mapa de interrupciones
| IRQ | Prioridad | Handler | Función |
|---|---|---|---|
| SysTick | 0 (máx) | sys_tick_handler |
Clock tick, encoders, ESC init, botones, sensores, giro, batería |
| DMA2 Stream0 | 1 | dma2_stream0_isr |
Lectura DMA de ADC1 → actualización multiplexor |
| TIM2 | 2 | — | Captura encoder derecho |
| TIM5 | 3 | tim5_isr |
Lazo de control PID @ 1 kHz |
| USART3 | 4 | — | Recepción UART (no crítica) |
Las prioridades están definidas en setup.c:52-63.
La prioridad 0 es la más alta en el esquema NVIC de Cortex-M4 (16 grupos).
SysTick (1 kHz)
El sys_tick_handler en main.c:19-27 ejecuta
cada milisegundo:
clock_tick()— incrementa el contador de tiempo del sistemaupdate_encoder_readings()— lee encoders en cuadratura y calcula odometríainit_esc()— secuencia de inicialización de los ESCs (5 s de pulso neutro)check_buttons()— lee los botones físicossensors_update_line_position()— calcula la posición de la líneaupdate_gyro_readings()— lee el giroscopio y actualiza el ángulo integradoupdate_battery_voltage()— lee y filtra la tensión de batería
Lazo de control (TIM5, ~1 kHz)
El tim5_isr en setup.c:247-251 invoca
control_loop() que implementa el control PID en cascada:
flowchart TD
A[control_loop] --> B{race_started?}
B -->|No| C[Parar motores + fan]
B -->|Sí| D[update_ideal_linear_speed]
D --> E[update_fan_speed]
E --> F{control_strategy}
F -->|ENCODERS| G[PID velocidad lineal]
F -->|PWM| H[% PWM directo]
G --> I[Cálculo corrección angular]
H --> I
I --> J[PID angular + sensores línea]
J --> K[Conversión voltaje → PWM]
K --> L[set_motors_pwm + set_fan_speed]
L --> M[macroarray_store]
(ver Control PID)
ADC y DMA
El ADC1 lee 3 canales en modo scan continuo con DMA circular (DMA2 Stream0):
- Canal 10 (PC0): multiplexor 8:1, sensores 0–7
- Canal 11 (PC1): multiplexor 8:1, sensores 8–15
- Canal 12 (PC2): multiplexor 8:1, sensores 16–23
Cada vez que el DMA completa una transferencia (3 lecturas), la ISR
sensors_update_mux_readings() asigna las lecturas al slot correcto del array
de 24 sensores y avanza el multiplexor.
Máquina de estados del menú
stateDiagram-v2
[*] --> MenuRun
MenuRun --> MenuConfig : pulsación larga mode
MenuConfig --> MenuRun : pulsación larga mode
state MenuRun {
[*] --> SpeedSelect
SpeedSelect --> RaceMode : mode btn
RaceMode --> Adaptative : mode btn
Adaptative --> BiggerFilter : mode btn
BiggerFilter --> DigitalSensors : mode btn
DigitalSensors --> Encoders : mode btn
Encoders --> SpeedSelect : mode btn
}
state MenuConfig {
[*] --> Calibration
Calibration --> Debug : mode btn
Debug --> Calibration : mode btn
}
(ver Menú)
Módulos del proyecto
| Módulo | Archivos | Descripción |
|---|---|---|
| setup | setup.c/h |
Configuración de relojes, GPIO, timers, ADC, SPI, DMA |
| control | control.c/h |
Lazo PID, arranque/parada, gestión de carrera |
| sensors | sensors.c/h |
Lectura y calibración de 24 sensores de línea |
| motors | motors.c/h |
Control PWM de motores y ventilador |
| encoders | encoders.c/h |
Odometría y velocidades |
| mpu | mpu.c/h |
Giroscopio MPU-6500 vía SPI |
| menu | menu.c/h |
Sistema de menú principal |
| menu_run | menu_run.c/h |
Menú de selección de modos de carrera |
| menu_configs | menu_configs.c/h |
Menú de calibración y debug |
| kinematics | kinematics.c/h |
Perfiles de velocidad predefinidos |
| battery | battery.c/h |
Medición de batería |
| leds | leds.c/h |
Control de LEDs (estado, RGB, info) |
| eeprom | eeprom.c/h |
EEPROM emulada en flash |
| debug | debug.c/h |
Sistema de debug y telemetría |
| macroarray | macroarray.c/h |
Buffer de logging para análisis post-carrera |
| delay | delay.c/h |
Utilidades de tiempo (ms, us, DWT) |
| utils | utils.c/h |
map() y constrain() |
| buttons | buttons.c/h |
Lectura de botones e IR start |
| usart | usart.c/h |
Redirección de printf a USART3 |
Documento generado el 2026-06-25. Ver también Hardware, Control PID.