DÍA 249 DE 365

Fase 5: Diseño Industrial y Proyecto Final

📖 Teoría a Estudiar

La Anatomía de una Falla de Comunicación

Cuando el STM32 le envía la Trama Binaria de la Venta de Gas (Día 222) al ESP32 o al Módem celular, el pin TX del STM32 sube de 0V a 3.3V bruscamente. En el dominio digital, esto es una onda cuadrada perfecta. En el mundo de la física, una onda cuadrada perfecta requiere energía infinita. Lo que realmente viaja por la pista de cobre es una onda con "picos" de resonancia (Ringing) y rebotes eléctricos.

Si la pista de cobre es muy larga y no está diseñada correctamente, la onda choca contra el pin RX del ESP32 y "rebota" de regreso hacia el STM32, corrompiendo los bits siguientes. Esto se conoce como Reflexión de Señal. Además, si las pistas TX y RX viajan muy juntas en paralelo, el campo magnético de una inducirá voltaje en la otra, causando Cross-Talk (Diafonía).

Las 3 Reglas de Oro para Ruteo de Alta Velocidad (KiCad)

  1. Resistencias Terminadoras de Serie (Damping Resistors): Justo a la salida del pin TX del STM32, y a la salida del pin TX del ESP32, se debe colocar una resistencia física de 22Ω a 33Ω. Esta resistencia absorbe la energía del rebote y "suaviza" las esquinas cortantes de la onda cuadrada, eliminando la radiación electromagnética (EMI) sin afectar el bit.
  2. La Regla 3W (Cross-Talk): La distancia de separación entre la pista TX y la RX debe ser al menos 3 veces el ancho de la pista. Si tu pista mide 0.25mm, sepáralas al menos 0.75mm. Nunca las rutees pegadas.
  3. El Plano de Tierra (Return Path): La corriente siempre busca el camino de menor impedancia para regresar a su fuente. A altas frecuencias, la corriente de retorno viaja exactamente debajo de la pista de cobre. Nunca, bajo ninguna circunstancia, rutees la pista UART cruzando una "grieta" o hueco en el Plano de Tierra de la capa inferior (Bottom Layer).
TOPOLOGÍA PCB: RUTEO DE ENLACE UART (STM32 <-> ESP32) Layer 1: F.Cu (Ruteo) | Layer 2: B.Cu (Plano GND Ininterrumpido) U1 STM32 TX RX U2 ESP32 RX TX R1(33Ω) R2(33Ω) Damping Resistor Suaviza señal, mata EMI. Regla de Cross-Talk Distancia > 3x Ancho X GND VOID (Prohibido) Nunca cruzar pistas sobre un hueco.

⚙️ Ejercicios Prácticos

Pasos en KiCad para Dual-Core UART:

  1. En el *Esquemático*, inserta resistencias de 33Ω. Conecta la de U1 (STM32) directamente al pin PA9 (TX). Conecta la de U2 (ESP32) directamente al pin GPIO17 (TX).
  2. En *Board Setup -> Net Classes*, crea una clase llamada HighSpeed_UART. Asignale un ancho de pista (Track Width) de 0.25 mm y una separación (Clearance) mínima de 0.75 mm (Regla 3W).
  3. En el *PCB Editor*, sitúa los chips lo más cerca posible. Rutea la capa `F.Cu` usando el modo de trazado a 45 grados (presiona la tecla '/' en KiCad). Nunca hagas esquinas de 90 grados; provocan refracción de señal.
  4. Dibuja un Filled Zone (Plano de Cobre) en la capa `B.Cu` (Bottom Copper) y asígnalo a GND. Asegúrate de que no haya pistas cortando este plano debajo de tus líneas UART.

Ejercicio 1: Mitigación por Software (Hardware Error Handling). Incluso con la mejor PCB, el encendido de los motores eléctricos de la gasolinera generará ruido radiado transitorio. Nuestro firmware MISRA-C debe configurar el UART del STM32 para rechazar ruido, e interceptar los errores de hardware (Framing Error / Noise Error) para evitar que el RTOS procese tramas corruptas.


/**
 * @file uart_pcb_integrity.c
 * @brief Configuración Hardware UART y Gestión de Errores Electromagnéticos (MISRA-C)
 */

#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include <stdint.h>

extern UART_HandleTypeDef huart1;

// =========================================================================
// INICIALIZACIÓN DE ALTA ROBUSTEZ FÍSICA
// =========================================================================
void UART_Integridad_Init(void) {
    // La configuración base del CubeMX suele usar 16x Oversampling.
    // Esto significa que el STM32 lee el pin RX 16 veces por cada bit recibido
    // y usa una "Votación Mayoritaria" (Majority Vote) para decidir si es 1 o 0.
    // Esto es vital para descartar picos de ruido electromagnético.
    
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 921600; // Alta velocidad, muy sensible al layout de la PCB
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE; // Usamos CRC8 en nuestro protocolo (Día 222)
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16; // Regla de Oro EMI
    
    if (HAL_UART_Init(&huart1) != HAL_OK) {
        // Manejador de Error Seguro
    }
}

// =========================================================================
// GESTIÓN DE ERRORES DE HARDWARE (ISR LAYER)
// =========================================================================
/**
 * @brief  Callback invocado automáticamente por el silicio del STM32 cuando 
 *         detecta corrupción eléctrica en la pista de la PCB.
 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART1) {
        
        uint32_t error_code = huart->ErrorCode;
        
        // 1. Error de Encuadre (Framing Error - FE)
        // La pista UART sufrió Cross-Talk severo o los relojes perdieron sincronía.
        if ((error_code & HAL_UART_ERROR_FE) != 0U) {
            // Contabilizar para diagnóstico predictivo de la placa madre
            // Logs_Registrar_Anomalia_PCB(ERROR_TIPO_FE);
        }
        
        // 2. Error de Ruido (Noise Error - NE)
        // El Oversampling detectó que el bit varió demasiado rápido durante la lectura.
        // Típico de cuando un relé industrial se enciende cerca del cableado.
        if ((error_code & HAL_UART_ERROR_NE) != 0U) {
            // Logs_Registrar_Anomalia_PCB(ERROR_TIPO_NE);
        }
        
        // 3. Error de Desbordamiento (Overrun - ORE)
        // El ESP32 envió datos muy rápido y el STM32 estaba ocupado (Data Race).
        if ((error_code & HAL_UART_ERROR_ORE) != 0U) {
            // Purga obligatoria del registro de datos y reinicio del DMA
            __HAL_UART_CLEAR_OREFLAG(huart);
        }
        
        // ACCIÓN MITIGADORA MISRA-C:
        // Abortar la recepción actual y reiniciar el túnel DMA.
        // Dependemos de nuestro protocolo (Día 222) para retransmitir la trama.
        HAL_UART_AbortReceive_IT(huart);
        // Reiniciar_DMA_Recepcion();
    }
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Diseño de Hardware a Nivel Placa (Board-Level Design) y Compatibilidad Electromagnética (EMC).

Un error clásico al pasar de un Arduino en Protoboard a una placa industrial final (PCB) es asumir que "si las conexiones coinciden, la placa funcionará". Muchos ingenieros diseñan placas donde el STM32 y el ESP32 están físicamente alejados, y rutean la pista de comunicación paseando por toda la tarjeta, cruzando por debajo de los relays de 24V y haciendo giros de 90 grados.

Cuando prueban esa máquina, la pantalla se congela aleatoriamente o el sistema se reinicia. Buscan el error en el código C durante meses, sin éxito. El problema no era lógico, era físico. Al aplicar las reglas de **Integridad de Señal** en KiCad (Resistencias de Damping en serie, regla de separación 3W y protección del Plano de Tierra), has creado una carretera digital silenciosa e inmune al ruido del motor de la gasolinera. Documentar este ruteo de alta velocidad en tu Tesis demuestra madurez ingenieril: entiendes que el Microcontrolador no es un ente abstracto, sino un chip analógico intentando sobrevivir en un entorno hostil. Has fusionado exitosamente el Hardware y el Software.

📝 Resumen del Día