Una gasolinera se divide en Zonas dependiendo de la probabilidad de que exista gas explosivo en el aire:
Tu STM32 y tus relés viven en una caja anti-explosión (Ex d), pero los cables del Caudalímetro y del Termómetro bajan directamente a la Zona 0. Tienes que garantizar matemáticamente que es imposible enviar suficiente energía para causar una chispa, sin importar qué parte de tu placa se queme.
La Seguridad Intrínseca asume que el peor escenario va a ocurrir: tu regulador de voltaje explota y envía 24V a 10 Amperios directo por el cable del RS485 o del sensor. Para proteger la Zona 0, interponemos un circuito analógico brutalmente simple llamado Barrera Zener, que hace tres cosas inquebrantables:
Ejercicio 1: La barrera física detendrá la explosión, pero el procesador debe enterarse de que un canal ha muerto. Agregaremos un monitor al Canal ADC de nuestro STM32 que lea el voltaje en el nodo intermedio de la barrera Zener. Si detecta 0V constantes mientras la máquina está encendida, significa que el fusible se reventó por un corto, e invocaremos la función de Bloqueo Legal (Día 158) para abortar la venta e informar al SCADA.
/**
* @file atex_barrier_monitor.c
* @brief Monitor de Diagnóstico de Barreras de Seguridad Intrínseca (Ex i)
*/
#include "stm32f401xe.h"
#include <stdbool.h>
// Dependencias
extern void Bloqueo_Legal_Fatal(uint32_t codigo_error); // Día 158
#define ERR_ATEX_BARRERA_ROTA 0xF004
// Supongamos que leemos el nodo de la Barrera Zener del Caudalímetro en PA0 (ADC1_IN0)
#define CANAL_ADC_BARRERA_CAUDALIMETRO 0
/**
* @brief Inicializa el ADC para monitorear las barreras pasivamente
*/
void inicializar_monitor_atex(void) {
// Activar reloj del ADC1 y GPIOA
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
// Configurar PA0 como Analógico (11)
GPIOA->MODER |= (3 << 0);
// Encender el ADC
ADC1->CR2 |= ADC_CR2_ADON;
// Pequeño delay de estabilización del ADC (T_stab)
for (volatile int i = 0; i < 1000; i++);
}
/**
* @brief Ejecuta una lectura cruda del ADC en el canal deseado
*/
uint16_t adc_leer_canal_sencillo(uint8_t canal) {
// Seleccionar el canal en la secuencia regular (SQR3)
ADC1->SQR3 = canal;
// Iniciar conversión por software
ADC1->CR2 |= ADC_CR2_SWSTART;
// Esperar bandera EOC (End of Conversion)
while (!(ADC1->SR & ADC_SR_EOC));
// Retornar valor (12 bits: 0 a 4095)
return ADC1->DR;
}
/**
* @brief Tarea de vigilancia asíncrona para la integridad de las barreras
*/
void Vigilar_Barreras_ATEX(void) {
// En un sistema de 3.3V, un valor de 4095 equivale a 3.3V.
// Nuestra barrera debería tener voltaje (Ej. 3.0V) en operación normal.
// Si el ADC lee un valor extremadamente bajo, es un corto o fusible roto.
uint16_t adc_val = adc_leer_canal_sencillo(CANAL_ADC_BARRERA_CAUDALIMETRO);
// Umbral de muerte: Menos de 0.5V (~620 unidades ADC)
if (adc_val < 620) {
// Anti-Glitch (Filtro simple por conteo o usar el IIR del Día 156)
static uint8_t fallas_consecutivas = 0;
fallas_consecutivas++;
if (fallas_consecutivas > 10) {
// El fusible de la barrera Zener ha sido destruido.
// Posible falla catastrófica de voltaje o corto en la Zona 0.
Bloqueo_Legal_Fatal(ERR_ATEX_BARRERA_ROTA);
}
} else {
// Todo normal, resetear contador
// fallas_consecutivas = 0; // (Requiere variable global/estática si se reinicia)
}
}
int main(void) {
// inicializar_sistema();
inicializar_monitor_atex();
while(1) {
// Supervisión cíclica (Integración con el Watchdog del Día 158)
// Se puede llamar cada 1 segundo, no requiere velocidad extrema.
// if (bandera_timer_1seg) {
// Vigilar_Barreras_ATEX();
// bandera_timer_1seg = false;
// }
// Operación normal
}
return 0;
}
Objetivo del día: Certificación Internacional para Atmósferas Explosivas (Ex).
El código más elegante y seguro no sirve de nada si tu máquina incendia la gasolinera. Las normas internacionales (IEC 60079-11) te prohíben llevar cables sin protección desde la electrónica principal hacia los sensores ubicados en la manguera de gas. Al incorporar una **Barrera Zener** en tu diseño de hardware (PCB), garantizas que incluso si tu STM32 y su regulador fallan arrojando 24 Voltios directos hacia el sensor, los diodos Zener drenarán el voltaje excesivo a tierra, y si la corriente es mucha, el fusible reventará, manteniendo la "Zona 0" completamente fría y segura.
A nivel de firmware Bare-Metal, añadir el **Monitor ATEX por ADC** cierra el lazo de seguridad. En el pasado, si la barrera se quemaba, la máquina simplemente dejaba de contar litros, y el dueño creía que el sensor se había descompuesto. Hoy, tu procesador detecta que la barrera actuó para salvar la estación, bloquea el sistema lógicamente para evitar ventas anómalas, y transmite a la nube a través de Modbus: "Cortocircuito letal contenido por barrera Zener en Vía 1". Eso es diseño mecatrónico de élite.