DÍA 316 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

El Vengador Inductivo: El Pico Flyback

Una electroválvula de Gas LP es, esencialmente, una bobina electromagnética gigante (Inductor). Cuando el STM32 le dice al relé que cierre la válvula, la corriente se corta de golpe. La física ($V = L \frac{di}{dt}$) dicta que la energía magnética almacenada en la bobina tiene que ir a alguna parte. Como el circuito se abrió abruptamente, la bobina induce un Pico de Voltaje Negativo (Flyback) que puede alcanzar los cientos o miles de voltios.

Este pulso violento viaja en reversa, salta a través de la aislación del relé, entra a la PCB, rebota en las tierras y satura de ruido a todo el sistema. Es tan fuerte que puede inducir voltajes en pistas de cobre vecinas que operan a 3.3V.

Consecuencias Fatales de la EMI (Ruido)

  1. El Falso Reset (Pin NRST): Si la pista del pin RESET del STM32 es larga y actúa como antena, el pico de ruido inducirá un voltaje negativo que bajará momentáneamente el pin de 3.3V a 0V. El chip creerá que alguien presionó el botón de reinicio.
  2. El Ahorcamiento del I2C (Deadlock): El bus I2C de la pantalla (Día 285) es extremadamente sensible al ruido. Un pico Flyback puede corromper el bit de Acknowledgment (ACK). La librería HAL de STMicroelectronics se quedará atascada en un while(estado != HAL_OK) esperando eternamente. La máquina se congela hasta que el Perro Guardián (Watchdog) corta la corriente.
DIAGNÓSTICO DE RUIDO: FLYBACK, I2C DEADLOCK Y PIN RESET Bobina Electroválvula 24V CIRCUITO ABRE (OFF) PICO DE -500V INDUCIDO Diodo Flyback Atrapa el pulso haciendo bucle. Radiación EMI STM32 MCU I2C (SDA) Bit Corrupto HAL_I2C se cuelga. Watchdog (IWDG) detecta el cuelgue y resetea. PIN NRST Pico Falso (0V) C: 100nF R: 10kΩ Filtro RC Hardware previene Falso Reset RUTINA FORENSE (SOFTWARE) if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST)) -> "Ruido en pin NRST. Añadir capacitor." if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)) -> "Cuelgue de I2C/Loop. CPU ahogada."

⚙️ Escenario Práctico de Campo (La Autopsia)

El Problema: El técnico está frente a la máquina tras un reset aleatorio. No sabe si fue una falla eléctrica en el transformador de la calle (Brownout), un pico inductivo de la válvula de gas (Pin Reset), o un error de software atascado en un bucle I2C (Watchdog Reset).

La Solución Física (Mitigación Hardware):

  1. Instalar Diodo Flyback: El técnico atornilla un diodo rectificador robusto (ej. 1N4007) en anti-paralelo directamente en los bornes de la bobina de la electroválvula. El cátodo (raya) va al Positivo de 24V. Cuando la válvula corta, los -500V circulan a través del diodo y se disipan como calor dentro de la misma bobina, sin regresar a la placa base.
  2. Refuerzo del Pin de Reset: El STM32 tiene un Pull-Up interno en el pin NRST, pero es muy débil (~40kΩ) frente a la EMI industrial. El técnico verifica que la PCB tenga soldado un resistor externo de 10kΩ hacia 3.3V, y un capacitor cerámico de 100nF hacia GND, creando un filtro RC pasabajos invulnerable a los picos rápidos.

💻 Firmware: Autopsia del Sistema (Código Forense)

Convertiremos al STM32 en un médico forense. El registro interno de Control de Reinicios (RCC) del chip ARM memoriza exactamente qué evento causó el último encendido. Ejecutaremos esta función una sola vez, justo en el main(), antes de borrar la memoria.


/**
 * @file hardware_autopsy.c
 * @brief Rutina Forense para identificar causas de Resets Aleatorios.
 */

#include "stm32f4xx_hal.h"
#include <stdio.h>

// Declaraciones externas del LCD (Para notificar al técnico)
extern void LCD_Clear(void);
extern void LCD_Print_Line(uint8_t line, const char* text);
extern void Cloud_Telemetry_Log(const char* msg);

// =========================================================================
// RUTINA DE AUTOPSIA (BOOT DIAGNOSTIC)
// =========================================================================
/**
 * @brief Lee el registro RCC_CSR para determinar por qué despertó la CPU.
 * @note Esta función DEBE llamarse al principio del main(), antes de borrar las banderas.
 */
void System_Autopsy_Check_Reset_Cause(void) {
    
    printf("\r\n[SYS] INICIANDO RUTINA FORENSE DE BOOT...\r\n");

    // 1. EVALUAR CAUSA DEL REINICIO

    if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) {
        // Power-On Reset. La máquina se conectó a la electricidad por primera vez.
        // Es un encendido normal.
        printf("      Causa: POWER-ON (Encendido normal desde 0V)\r\n");
    }
    else if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) {
        // Pin Reset. Alguien presionó el botón físico, O el ruido EMI fue tan fuerte
        // que tiró el pin NRST a 0V.
        printf("      Causa: PIN RESET EXTERNO (Boton o Ruido EMI Fuerte)\r\n");
        Cloud_Telemetry_Log("WARN: Reinicio por Pin detectado. Posible EMI Flyback en actuadores.");
        
        LCD_Clear();
        LCD_Print_Line(0, "ULTIMO REINICIO:");
        LCD_Print_Line(1, "FALLO ELECTRICO (PIN)");
        LCD_Print_Line(2, "Revise diodos Flyback");
        HAL_Delay(3000); // Mostrar al técnico
    }
    else if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) {
        // Watchdog Reset. El software se quedó colgado en un bucle infinito
        // (Ej. Bus I2C de la pantalla bloqueado por estática) y el Perro Guardián mordió.
        printf("      Causa: WATCHDOG TIMEOUT (Software Colgado)\r\n");
        Cloud_Telemetry_Log("CRIT: Watchdog IWDG disparado. Falla en bus I2C o Deadlock de FSM.");
        
        LCD_Clear();
        LCD_Print_Line(0, "ULTIMO REINICIO:");
        LCD_Print_Line(1, "CUELGUE SISTEMA(IWDG)");
        LCD_Print_Line(2, "Revise Bus I2C / SPI");
        HAL_Delay(3000);
    }
    else if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST) != RESET) {
        // Brown-out Reset. El voltaje de 3.3V cayó peligrosamente (ej. a 2.5V) por 
        // inestabilidad en la fuente, protegiendo la memoria de corrupción.
        printf("      Causa: BROWNOUT (Caida de voltaje en PSU)\r\n");
    }

    // 2. BORRAR LA EVIDENCIA
    // Es obligatorio limpiar las banderas del registro, de lo contrario
    // en el próximo reinicio, las banderas viejas seguirán marcadas (Sticky bits).
    __HAL_RCC_CLEAR_RESET_FLAGS();
    
    printf("[SYS] Registro RCC limpiado. Arrancando SO...\r\n");
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Mitigación de Ruido Inductivo (EMI) y Resiliencia Forense de Software.

El "Reset Aleatorio" es la falla que ha provocado la cancelación comercial de miles de proyectos de ingeniería. Ocurre porque los ingenieros diseñan basándose en condiciones ideales. Cuando pusiste una electroválvula de 24V en tu Tesis, asumiste que apagarla era simplemente cortar el voltaje. Pero la física del **Flyback** exige su tributo. Sin un diodo de mitigación, ese corte genera un latigazo de cientos de voltios que recorre todo el cobre de tu placa, inyecta falsos negativos en tu pin de Reset (`NRST`), o desorienta los relojes sincronizados del bus de tu pantalla I2C, colgando tu microcontrolador a la mitad de una venta comercial.

Hoy cruzaste la frontera entre el desarrollador y el forense de sistemas. Al armar a tu placa con capacitores de filtro de hardware, sofocaste la radiación EMI. Y más importante aún, al programar la rutina `System_Autopsy_Check_Reset_Cause()`, has dotado a tu máquina de "Memoria Post-Mortem". La placa ahora retiene el registro RCC de hardware a través del evento de la muerte, y al resucitar, lo primero que hace es publicar en la nube si fue asesinada por un pico de corriente externo (`PINRST`) o por asfixia de su propio código (`IWDGRST`). Este simple bloque de C reduce los tiempos de diagnóstico de una semana a 5 segundos, convirtiendo a tu equipo técnico en francotiradores de solución de problemas.

📝 Resumen del Día