DÍA 072 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

El Estándar Industrial 4-20mA

En un lazo de corriente, el sensor no varía su voltaje; varía su resistencia interna para dejar pasar una cantidad exacta de corriente, independientemente del largo del cable. Según la Ley de Kirchhoff, la corriente es exactamente la misma en cualquier punto de un circuito en serie. Si el sensor deja pasar 12 mA a 50 metros de distancia, tu placa electrónica recibirá exactamente 12 mA.

El Cero Vivo (Live Zero)

¿Por qué el estándar empieza en 4 mA y no en 0 mA? A esto se le llama "Cero Vivo". Esos 4 miliamperios cumplen dos funciones críticas:

  1. Proporcionan la energía mínima necesaria para que el microprocesador interno del sensor funcione sin necesitar una fuente de alimentación adicional (Sensores de 2 hilos).
  2. Seguridad (Fail-Safe): Si el cable se corta o un operario lo desconecta, la corriente cae instantáneamente a 0 mA. Tu software puede detectar matemáticamente el "Cero Muerto" y lanzar una alarma de "CABLE CORTADO". Si el rango fuera 0-20mA, no sabrías si el sensor lee cero presión o si el cable se rompió.
RECEPTOR DE LAZO DE CORRIENTE 4-20mA (2 HILOS) ZONA EXTERIOR (A 50 metros) NUESTRA PCB (Cuarto de Control) SENSOR DE PRESIÓN 4 - 20 mA IN (+) OUT (-) VCC +24V R_shunt 150 Ω (0.1%) GND COMÚN 1 kΩ 1 µF Al Pin ADC STM32 Conversión Corriente a Voltaje: V = I × R Mínimo (4mA): 0.004 A × 150 Ω = 0.6V Máximo (20mA): 0.020 A × 150 Ω = 3.0V

La Resistencia Receptora

Los microcontroladores no pueden medir corriente directamente, solo miden voltaje (ADC). Para convertir la corriente del sensor de nuevo en voltaje, colocamos una Resistencia de Precisión (0.1% de tolerancia) al final del lazo, justo antes de enviarlo a tierra.

Si usamos una resistencia de 150 Ohmios, la Ley de Ohm ($V = I \cdot R$) nos regala una matemática perfecta y segura para nuestro STM32 (que soporta máximo 3.3V):

⚙️ Ejercicios Prácticos

Ejercicio 1: Programa una función C en Punto Fijo que tome la lectura del ADC del circuito receptor de 150Ω, detecte si el cable está roto ("Cero Muerto"), y convierta el voltaje válido a Presión en PSI (asumiendo un transmisor industrial de 0 a 300 PSI).


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

// --- 1. CONSTANTES DEL SISTEMA 4-20mA ---
// Valores matemáticos esperados en un sistema con R = 150 Ohmios y ADC 12 bits a 3.3V
// ADC a 0.6V (4mA) = (0.6 * 4095) / 3.3 = 744
// ADC a 3.0V (20mA) = (3.0 * 4095) / 3.3 = 3722

#define ADC_MIN_4MA  744
#define ADC_MAX_20MA 3722

// Límite de seguridad. Si el ADC lee menos de 0.2V (aprox 248), el cable está roto.
#define ADC_UMBRAL_CABLE_ROTO 250 

// Rango del sensor físico (Transmisor Danfoss / WIKA de 0 a 300 PSI)
#define SENSOR_PRESION_MAX_PSI 300


// --- 2. DECODIFICADOR Y SEGURIDAD BARE-METAL ---
// Utilizamos código de estado para devolver un valor o un error grave
typedef enum {
    ESTADO_SENSOR_OK,
    ESTADO_SENSOR_CABLE_ROTO,
    ESTADO_SENSOR_CORTO_CIRCUITO
} EstadoSensor;

EstadoSensor estado_presion_global;


uint32_t decodificar_presion_lazo_cerrado(uint32_t adc_raw) {
    
    // 1. EVALUACIÓN DE INTEGRIDAD DE HARDWARE (Fail-Safe)
    if (adc_raw < ADC_UMBRAL_CABLE_ROTO) {
        estado_presion_global = ESTADO_SENSOR_CABLE_ROTO;
        return 0; // El sistema debe detenerse
    }
    
    // Si la corriente excede los 20mA por mucho (ej. 3.2V / ADC > 3900)
    if (adc_raw > 3900) {
        estado_presion_global = ESTADO_SENSOR_CORTO_CIRCUITO;
        return 0; // Daño en el sensor o corto a VCC
    }
    
    // El sensor está sano
    estado_presion_global = ESTADO_SENSOR_OK;
    
    // 2. MATEMÁTICA DE MAPEADO (Punto Fijo)
    // Protegemos la resta contra lecturas levemente por debajo del 4mA por ruido
    if (adc_raw < ADC_MIN_4MA) adc_raw = ADC_MIN_4MA;
    
    // Rango activo del ADC (Span) = 3722 - 744 = 2978 pasos
    uint32_t span_adc = ADC_MAX_20MA - ADC_MIN_4MA;
    uint32_t valor_relativo = adc_raw - ADC_MIN_4MA;
    
    // Regla de tres sin punto flotante: (Valor * Max_PSI) / Span_ADC
    uint32_t presion_psi = (valor_relativo * SENSOR_PRESION_MAX_PSI) / span_adc;
    
    return presion_psi;
}


// --- 3. INTEGRACIÓN CON LA MÁQUINA DE ESTADOS ---
int main(void) {
    
    while(1) {
        
        // El DMA lee el voltaje de la resistencia receptora purificado por el Filtro RC
        uint32_t adc_crudo = 2233; // ~1.8V -> ~12mA -> ~150 PSI
        
        uint32_t presion_tanque = decodificar_presion_lazo_cerrado(adc_crudo);
        
        // Bloque de Emergencia Principal (Día 60)
        if (estado_presion_global == ESTADO_SENSOR_CABLE_ROTO) {
            
            // Falla catastrófica. La FSM apaga la bomba incondicionalmente.
            // ejecutar_paro_emergencia_fsm();
            // activar_torreta_alarma(); (Día 65)
            
        } else if (estado_presion_global == ESTADO_SENSOR_OK) {
            
            // Operar normalmente. Si la presión sube a niveles de ruptura:
            if (presion_tanque > 250) {
                // sobrepresion_rutina();
            }
        }
    }
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Telemetría de Largo Alcance a Prueba de Fallos.

Tu placa STM32 controlará las válvulas, pero para decidir si abrir o no, necesita saber la presión del enorme tanque de almacenamiento de Gas LP que está a 50 metros de distancia. Usando un Sensor de Lazo de Corriente de 2 Hilos, mandas 24V hacia el tanque usando un simple cable par trenzado, y el sensor usa esa misma energía para devolverte una corriente modulada milimétricamente exacta.

Al diseñar la Resistencia Receptora de 150 Ohmios, complementada por tu Filtro RC (Día 71), logras que esos miliamperios se conviertan en un voltaje seguro y limpio (0.6V a 3.0V). Con la detección del "Cero Vivo", tu firmware Bare-Metal se vuelve un auditor implacable: en el milisegundo en que un camión atropelle el cable y lo corte, la lectura caerá de 0.6V a 0V, y tu Súper Bucle congelará las válvulas previniendo una explosión por ceguera del sistema.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. ¿Qué pasaría con nuestro ADC de 3.3V si usamos el estándar antiguo de resistencia receptora de 250 Ohmios?
Respuesta: Matemáticas destructivas. A 20mA, el voltaje generado sería de 5 Voltios ($0.020A \times 250\Omega = 5V$). Como el pin del STM32 solo soporta 3.3V, la lectura se saturaría a 4095 desde los 13.2mA, perdiendo la mitad superior de la escala de presión, y a la larga, el exceso de voltaje degradaría el silicio del procesador. 250 Ohmios se usaba antes cuando todos los PLCs trabajaban internamente a 5V.

2. ¿Por qué se especifica que la resistencia receptora debe ser "de Precisión (0.1% de tolerancia)" y no una resistencia de carbón normal de 5%?
Respuesta: Por el error inducido en el hardware. Si usas una resistencia comercial del 5%, en lugar de 150 Ohmios podrías tener 157.5 Ohmios físicos. A 20mA, el voltaje sería de 3.15V en lugar de 3.0V. Tu software de mapeado calcularía una presión más alta de la real. En metrología, si la resistencia tiene un margen de error grande, toda la matemática de calibración colapsa. Usamos resistores Metal Film de 0.1% (o incluso 0.05%) para que la exactitud sea impecable.