Control
UltiBot implementa dos niveles de control:
- Control de alto nivel en la placa principal (STM32F4): estrategia PD de persecución basada en la posición estimada del rival
- Control de bajo nivel en la placa FOC (STM32F1): lazo PI de velocidad con conmutación sinusoidal (FOC)
Arquitectura de Control
flowchart TD
subgraph Main["STM32F401CC (Main)"]
SENSORS[Posición rival<br/>centroide ponderado]
PD[Control PD<br/>Kp=0.25 Kd=25]
CMD[Comandos velocidad<br/>Lnn / Rnn]
end
subgraph FOC["STM32F103C8 (FOC)"]
PI[Control PI velocidad<br/>Kp=8.0 Ki=0.1]
SINE[Conmutación sinusoidal<br/>LUT 360 entradas]
PWM[PWM trifásico<br/>TIM1 + TIM2]
ENC[Encoders cuadratura<br/>TIM3 + TIM4]
end
subgraph Planta["Planta física"]
M1[Motor izq. BLDC]
M2[Motor der. BLDC]
end
SENSORS --> PD
PD --> CMD
CMD -->|USART 115200| PI
PI --> SINE
SINE --> PWM
PWM --> M1
PWM --> M2
M1 -->|4096 CPR| ENC
M2 -->|4096 CPR| ENC
ENC -->|RPM| PI
Control PD de Persecución — Placa Principal
Ecuación de control
Donde: - \(error\) = posición estimada del rival (rango \(\sim[-250, 250]\)) - \(\Delta error = error - error_{anterior}\)
Parámetros
| Parámetro | Valor | Descripción |
|---|---|---|
| \(K_p\) | 0.25 | Ganancia proporcional |
| \(K_d\) | 25 | Ganancia derivativa |
BASE_SPEED |
30 | Velocidad base (sobre 80) |
TURN_SPEED |
60 | Velocidad de giro (sobre 80) |
| Frecuencia | ~10 Hz | Tasa de ejecución |
Nota: La ganancia derivativa (25) es 100× mayor que la proporcional (0.25). Esto produce una respuesta muy sensible a cambios rápidos en la posición del rival, priorizando la persecución sobre el centrado.
Código de control
int16_t error = get_sensors_position();
float correccion = error * STRAT_PID_KP
+ (error - strat_pid_last_error) * STRAT_PID_KD;
set_motors_speed(BASE_SPEED + correccion, BASE_SPEED - correccion);
Límites de velocidad
| Dirección | Velocidad min | Velocidad max |
|---|---|---|
| Motor izquierdo | BASE_SPEED - 50 ≈ -20 | BASE_SPEED + 50 ≈ 80 |
| Motor derecho | BASE_SPEED - 50 ≈ -20 | BASE_SPEED + 50 ≈ 80 |
La corrección máxima efectiva es ±50 (limitada por el clamp a ±80 en
set_motors_speed()).
Control PI de Velocidad + FOC — Placa FOC
Nota: Esta sección es un resumen. La documentación completa está en OPRcontrolFOC.
Lazo PI de velocidad
| Parámetro | Valor |
|---|---|
| \(K_p\) | 8.0 |
| \(K_i\) | 0.1 |
| \(K_d\) | 0.0 (deshabilitado) |
| Rango velocidad | -900 a +900 RPM |
| Frecuencia control | ~1 kHz |
Anti-windup
El integrador se detiene cuando speed_factor >= 100 y el error es positivo
(motor ya está al máximo y se le pide más).
Conmutación sinusoidal (FOC)
- Tabla de seno de 360 entradas precalculada
- 3 fases con 120° de separación por motor
- La posición del rotor (encoder) determina el ángulo eléctrico
- El
speed_factor(0-100%) modula la amplitud
Secuencia de fases
| Motor | Fase A | Fase B | Fase C |
|---|---|---|---|
| Izquierdo | TIM2 CH2 (PA1) | TIM2 CH1 (PA0) | TIM2 CH3 (PA2) |
| Derecho | TIM1 CH1 (PA8) | TIM1 CH3 (PA10) | TIM1 CH2 (PA9) |
Las fases no siguen el orden estándar A→B→C en ambos motores. El motor izquierdo usa orden C→B→A y el derecho A→C→B.
Saturación
Ambos niveles de control incluyen mecanismos de saturación:
| Nivel | Mecanismo | Indicador |
|---|---|---|
| Velocidad comando | Clamp a ±80 | — |
| PI velocidad | Anti-windup integral | PC13 (der.), PC14 (izq.) |
| PWM | Clamp a ±PWM_PERIOD/2 | — |
Documento generado el 2026-06-30. Ver también Movimiento, Sensores, Encoders.