DÍA 075 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

Diodos TVS (Supresores de Voltaje Transitorio)

Un Diodo TVS es el "guardaespaldas" definitivo de la electrónica. En condiciones normales (ej. a 3.3V o 5V), el TVS es un "fantasma": tiene una impedancia tan alta que el circuito ni se entera de que está ahí. Pero su magia es la velocidad: cuando ocurre un pico de miles de voltios (ESD o inducción de rayos), el TVS reacciona en picosegundos (billonésimas de segundo).

El Efecto Avalancha y el Voltaje de Clamping (Corte)

Al detectar el pico, el diodo entra en "Efecto Avalancha" y se convierte instantáneamente en un cortocircuito hacia tierra. Redirige toda la violencia eléctrica (decenas de Amperios) lejos de tu procesador. El voltaje máximo que el TVS dejará pasar hacia tu STM32 se llama Clamping Voltage. Un pico de 8,000V será aplastado y "recortado" a unos inofensivos 5V o 6V durante ese microsegundo.

PROTECCIÓN ESD CON DIODO TVS (ENTRADA DE BOTÓN) PANEL EXTERNO ESD: 8,000 Voltios ¡Dedo del operario! BOTÓN NUESTRA PCB (Con blindaje de hardware) Rs (100Ω) DIODO TVS (ej. SMAJ5.0A) Toda la energía ESD se va a GND Pull-up 10k +3.3V 100nF Pin STM32 Máximo ~4V GND CHASIS

La Triada de Protección de Entradas

Observa el diagrama SVG, es la receta perfecta de hardware industrial para cualquier pin que reciba cables del exterior:

  1. TVS (Diodo Supresor): Absorbe los 8,000V de estática (ESD) y los rayos, protegiendo al procesador de la muerte térmica.
  2. Filtro RC (Resistencia + Capacitor): La Resistencia serie limita la corriente para que el TVS no explote, y el capacitor de 100nF "se come" el minúsculo pico sobrante que el TVS dejó pasar y además elimina el ruido electromagnético y el rebote mecánico del botón.
  3. Pull-up (Día 62): Fija el estado lógico a "1" para evitar falsos positivos por estática del aire.

⚙️ Ejercicios Prácticos

Ejercicio 1: El hardware TVS absorbió el rayo, pero durante ese microsegundo (el pico de "Clamping"), tu pin GPIO pudo haber registrado una falsa pulsación rápida. Programa un Filtro Antirrebote (Debouncer) por Software NO Bloqueante para ignorar cualquier pulso que no dure al menos 50 milisegundos reales.


#include <stdint.h>
#include <stdbool.h>

// Simulación de variables globales
extern volatile uint32_t milisegundos_globales;
extern bool leer_pin_boton_fisico(void); // Del Día 62 (Lógica Inversa resuelta)

// Estructura para el filtro digital de botones
typedef struct {
    bool estado_estable;
    bool ultimo_estado_leido;
    uint32_t marca_tiempo_cambio;
} BotonDebouncer;


// --- 1. INICIALIZACIÓN ---
void debouncer_init(BotonDebouncer *btn) {
    btn->estado_estable = false;
    btn->ultimo_estado_leido = false;
    btn->marca_tiempo_cambio = 0;
}


// --- 2. FILTRO DIGITAL DE TIEMPO (O(1) No Bloqueante) ---
// El TVS frena el rayo. Este código frena la ilusión óptica.
bool actualizar_estado_boton(BotonDebouncer *btn) {
    
    // Leemos el hardware puro
    bool estado_fisico_actual = leer_pin_boton_fisico();
    
    // Si el estado físico es distinto al último que vimos...
    if (estado_fisico_actual != btn->ultimo_estado_leido) {
        // Alguien tocó el botón (O cayó un rayo / EMI)
        // Reiniciamos el cronómetro y actualizamos el último estado visto
        btn->marca_tiempo_cambio = milisegundos_globales;
        btn->ultimo_estado_leido = estado_fisico_actual;
    }
    
    // Evaluamos si el estado se ha mantenido ESTABLE por más de 50ms
    // Un chispazo de ESD dura nanosegundos. Un humano presiona por ~200ms.
    if ((milisegundos_globales - btn->marca_tiempo_cambio) > 50) {
        
        // Si el estado estable actual de la FSM es diferente al físico validado
        if (btn->estado_estable != estado_fisico_actual) {
            btn->estado_estable = estado_fisico_actual;
            // Aquí podríamos disparar un evento (Callback)
        }
    }
    
    return btn->estado_estable;
}


// --- 3. INTEGRACIÓN AL SÚPER BUCLE ---
int main(void) {
    
    BotonDebouncer boton_paro_emergencia;
    debouncer_init(&boton_paro_emergencia);
    
    while(1) {
        
        // 1. Escaneo cíclico súper rápido
        bool paro_presionado = actualizar_estado_boton(&boton_paro_emergencia);
        
        // 2. La FSM (Día 60) actúa
        if (paro_presionado) {
            // Este IF jamás se activará por un chispazo eléctrico
            // ejecutar_paro_emergencia_fsm();
        }
        
    }
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Inmunidad Electrostática y Robusted Periférica.

Un ingeniero novato cree que su código C es el culpable cuando el microcontrolador se resetea o ejecuta acciones "fantasma" cada vez que un operario toca el metal del teclado en un día seco. El código no puede arreglar leyes físicas; la estática (ESD) es de 8,000V a 15,000V.

Al agregar este componente de 10 centavos (Diodo TVS) en paralelo a cada pin externo de tu placa KiCad, has levantado un muro impenetrable. La descarga del operario ahora es tragada por la tierra del chasis antes de siquiera tocar la resistencia limitadora. Y al combinar esa protección de hardware con el Filtro Antirrebote (Debouncer) No Bloqueante de 50ms en tu software, garantizas que la Máquina de Estados (FSM) solo reaccione ante intenciones humanas reales, logrando la certificación industrial requerida para atmósferas inflamables.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. ¿Qué diferencia hay entre usar un Diodo TVS Unidireccional y uno Bidireccional?
Respuesta: El Unidireccional protege señales de corriente directa (DC) fijas, como nuestros botones que varían de 0 a 3.3V, mandando los picos positivos a GND y bloqueando los negativos de tajo (como un diodo normal). El Bidireccional (que es como tener dos TVS en serie encontrados) se usa en líneas de comunicación (como RS485 o CAN Bus) donde las señales de datos tienen polaridades negativas y positivas (ej. de -7V a +12V); el TVS bidireccional no afectará la señal normal que viaja por debajo de cero, pero cortará cualquier pico violento en ambas direcciones.

2. ¿Por qué usamos una variable separada para el cronómetro (marca_tiempo_cambio) en lugar de simplemente usar un delay(50) cuando detectamos el cambio?
Respuesta: ¡Esa es la regla de oro del Bare-Metal! Si usas delay(50) para esperar a que pase el ruido, tu Súper Bucle se congela por 50 milisegundos enteros. En ese tiempo, el Watchdog Timer podría ladrar (Día 40), o el caudalímetro de alta velocidad (Día 73) perdería docenas de pulsos de gas. Al usar la resta de tiempos (Timestamping) y mantener una variable estática, la CPU revisa el botón, decide que aún no es tiempo, y sigue ejecutando el resto de las tareas en el mismo microsegundo.