Implementación de la interfaz CAN en STM32 para el control de accionamientos eléctricos: Guía técnica
El bus CAN sigue siendo el estándar de facto para la comunicación en sistemas embebidos con requisitos estrictos de tolerancia a fallos. A diferencia de las interfaces populares UART/I2C, CAN proporciona transmisión de datos diferencial con manejo de colisiones por hardware mediante arbitraje no destructivo. Para proyectos basados en STM32G431RB (como en el kit IHM03), es crítico considerar las especificidades de la capa física y la capa de enlace de datos al diseñar los drivers.
Parámetros técnicos clave que afectan la implementación:
- Velocidad de transmisión: De 125 kbit/s (Baja velocidad) a 1 Mbit/s (Alta velocidad)
- Topología de red: Lineal con terminadores de 120 Ohm en los extremos
- Formato de trama: Estándar (ID de 11 bits) o Extendido (29 bits)
- Inserción de bits: Inserción automática de bits después de una secuencia de 5 bits idénticos
Los controladores CAN integrados de STM32 (bxCAN) admiten todos los modos de operación, pero requieren una configuración precisa de los parámetros de temporización (SJW, BS1, BS2). Un error en el cálculo del preescalador de velocidad en baudios provocará pérdida de sincronización bajo alta carga del bus.
Diseño de la interfaz CAN para el control de motores en STM32
Modificando el proyecto de control PMSM
Para integrar CAN en un proyecto existente de control de accionamiento, se requirió lo siguiente:
- Agregar la biblioteca CAN de STM32CubeMX al proyecto
- Configurar el reloj del periférico CAN a través de RCC
- Implementar un búfer circular para recibir/enviar mensajes
- Sincronizar el procesamiento de tramas CAN con el bucle principal de control de motor
Un aspecto crítico es el reparto de tiempo entre el procesamiento PWM y CAN. Al usar FreeRTOS, se creó una tarea separada con prioridad superior a la tarea de control de motor pero inferior a las interrupciones de seguridad.
Estructura de la base de datos CAN
Se desarrolló una estructura similar a DBC para la gestión de mensajes:
typedef struct {
uint32_t id;
uint8_t dlc;
void (*handler)(uint8_t*);
} can_msg_t;
const can_msg_t can_db[] = {
{0x123, 8, handle_motor_status},
{0x246, 4, handle_control_cmd},
// ... other messages
};
Cada mensaje está ligado a una función manejadora específica mediante una tabla de despacho. Esto evitó un switch-case monolítico y simplificó la adición de nuevos tipos de tramas.
Implementación práctica y pruebas
Depuración de la capa física
Durante las pruebas iniciales, se observaron errores CRC debidos a:
- Colocación incorrecta de terminadores (instalados solo en un extremo)
- Longitud del bus que excedía los límites (más de 40 m a 1 Mbit/s)
- Uso de par trenzado sin apantallamiento
Solución:
- Instalar terminadores de 120 Ohm en ambos extremos de la línea
- Reducir la velocidad a 500 kbit/s para longitud de 60 m
- Usar cable apantallado con impedancia de 120 Ohm
El análisis con osciloscopio confirmó la corrección de las señales diferenciales (CAN_H=3.5V, CAN_L=1.5V en estado dominante).
Pruebas de carga
Se realizaron pruebas de estrés al 80% de carga del bus:
- Rendimiento máximo: 700 kbit/s (límite teórico para tramas de 8 bytes — 750 kbit/s)
- Latencia de procesamiento de tramas: < 100 µs
- Tasa de error: 0 para longitudes de bus hasta 30 m
Se produjo un error crítico durante la transmisión simultánea de 3 mensajes de alta prioridad (ID bajo). Se resolvió configurando los filtros CAN_RX, separando los mensajes por bancos de filtros.
Lecciones clave
- Temporización del bus: Los cálculos precisos de BS1/BS2 son críticos para una operación estable a alta velocidad
- Arbitraje de prioridad: Los ID bajos tienen precedencia — planifique la jerarquía de mensajes con antelación
- Manejo de errores: Implemente un mecanismo de reinicio del controlador CAN al alcanzar el estado de error pasivo
- EMC: El apantallamiento del cable y la conexión a tierra del blindaje en ambos extremos son obligatorios para entornos industriales
- Pruebas: Use analizadores CAN (p. ej., PCAN-USB) para verificación del protocolo
Integrar una interfaz CAN en un proyecto de control de accionamientos eléctricos con STM32 requiere un profundo entendimiento tanto de las características de hardware del periférico como de las especificidades del protocolo. Una implementación exitosa abre la puerta a sistemas de control distribuidos con potencial integración en plataformas IoT y análisis de IA.
— Editorial Team
Aún no hay comentarios.