DÍA 070 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

El Amplificador Operacional (OpAmp)

Un Amplificador Operacional (como el LM358 o el moderno OPA340) es un circuito integrado analógico que toma una diferencia de voltaje en sus entradas y la multiplica de forma colosal. Sin embargo, no lo usamos "crudo". Lo domamos utilizando una red de resistencias de retroalimentación (Feedback) para crear una ganancia fija y matemática.

Configuración No Inversora

En el diseño de sensores, la configuración más usada es la "No Inversora". El voltaje diminuto del sensor entra por la terminal positiva (+). La terminal negativa (-) se conecta a un divisor de tensión formado por dos resistencias: $R_f$ (Feedback, que regresa desde la salida) y $R_{in}$ (conectada a GND).

La fórmula de la ganancia de voltaje ($A_v$) es universal y bellísima:

$$V_{out} = V_{in} \cdot \left(1 + \frac{R_f}{R_{in}}\right)$$

AMPLIFICADOR OP. NO INVERSOR (ACONDICIONAMIENTO DE SHUNT) - + LM358 VCC (5V) GND Vin (Sensor) Ej. 50 mV Vout (2.5V) Hacia ADC STM32 Rf (49 kΩ) Rin (1 kΩ) Ganancia del Hardware: Av = 1 + (Rf / Rin) Av = 1 + (49k / 1k) = 50x

La Amplificación de la Presión y Corriente

Si la bomba de gas utiliza 5 Amperios, al pasar por una pequeña Resistencia Shunt de 0.01 Ω, generará apenas 50 milivoltios. El ADC de tu STM32 apenas notaría un cambio entre el ruido. Al pasarlo por nuestro circuito OpAmp con $R_f = 49 k\Omega$ y $R_{in} = 1 k\Omega$, la ganancia es de 50.

Los diminutos 50 mV se transforman mágicamente en 2.5 Voltios limpios y estables, los cuales el STM32 puede leer con la precisión de un bisturí usando todo el rango de su ADC de 12 bits.

⚙️ Ejercicios Prácticos

Ejercicio 1: Tu hardware hizo el trabajo de multiplicar por 50. Ahora, tu firmware debe hacer la inversa: leer el ADC, calcular el voltaje amplificado, deshacer la ganancia y aplicar la Ley de Ohm (Día 61) para averiguar exactamente cuántos miliamperios está consumiendo el motor de la bomba en tiempo real.


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

// --- 1. CONSTANTES DEL HARDWARE ANALÓGICO ---
#define RESISTENCIA_F_K 49   // Rf en Kilo Ohmios
#define RESISTENCIA_IN_K 1   // Rin en Kilo Ohmios

// El compilador pre-calcula esto al compilar, cero carga para el STM32.
// Ganancia = 50
#define GANANCIA_OPAMP (1 + (RESISTENCIA_F_K / RESISTENCIA_IN_K)) 

// Valor de la resistencia Shunt de potencia de la bomba (0.01 Ohmios)
// Lo expresamos como mili-Ohmios para matemática entera
#define SHUNT_MILIOHM 10 

// Variables globales simuladas
extern uint32_t leer_adc_corriente_dma(void);
extern void ejecutar_paro_emergencia_fsm(void);


// --- 2. MOTOR DE INGENIERÍA INVERSA ANALÓGICA ---
uint32_t calcular_corriente_motor_ma(uint32_t adc_raw) {
    
    // PASO A: Convertir lectura ADC a Milivoltios del Pin (0-3300mV)
    uint32_t mv_en_pin_stm32 = (adc_raw * 3300) / 4095;
    
    // PASO B: Deshacer el trabajo del Amplificador Operacional
    // Si el pin tiene 2500mV, y el hardware multiplicó por 50,
    // el sensor real tenía 50mV.
    uint32_t mv_sensor_real = mv_en_pin_stm32 / GANANCIA_OPAMP;
    
    // PASO C: Ley de Ohm en el Shunt (I = V / R)
    // Voltaje (mV) / Resistencia (mOhm) = Corriente en Amperios.
    // Como queremos Miliamperios, multiplicamos por 1000.
    // mA = (mv_sensor_real * 1000) / SHUNT_MILIOHM
    uint32_t corriente_motor_ma = (mv_sensor_real * 1000) / SHUNT_MILIOHM;
    
    return corriente_motor_ma;
}


// --- 3. IMPLEMENTACIÓN EN LA SEGURIDAD DE LA FSM ---
int main(void) {
    
    while(1) {
        
        // Simulación: El DMA lee el voltaje amplificado del OpAmp
        uint32_t lectura_adc = 3102; // Equivale a ~2500mV en el pin
        
        // Calculamos la corriente real de la bomba
        uint32_t consumo_bomba_ma = calcular_corriente_motor_ma(lectura_adc);
        
        // Si el consumo supera los 8 Amperios (8000 mA)...
        if (consumo_bomba_ma > 8000) {
            
            // ¡EL MOTOR ESTÁ ATASCADO! (Locked Rotor)
            // La bomba intentó succionar gas, pero hay una obstrucción sólida.
            // Si no cortamos el relé ahora mismo, el MOSFET (Día 66) o la bomba arderán.
            
            ejecutar_paro_emergencia_fsm();
            // lcd_imprimir("ERR: BOMBA ATASCADA");
        }
        
        // Si el consumo es menor a 1 Amperio (1000 mA) estando encendido...
        else if (consumo_bomba_ma < 1000) {
            
            // ¡CAVITACIÓN! (Running Dry)
            // El tanque de gas está vacío. El motor gira en el aire sin resistencia.
            // Los sellos mecánicos se destruirán por fricción térmica en segundos.
            
            ejecutar_paro_emergencia_fsm();
            // lcd_imprimir("ERR: TANQUE VACIO");
        }
    }
    
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Telemetría de Carga Dinámica e Inteligencia Predictiva.

Tu Despachador de Gas ya no es "ciego" a la física del mundo exterior. En el Día 52 pusimos un Watchdog de 5 segundos para apagar la máquina si los pulsos del líquido se detenían. Era una solución de software reactiva. Hoy, con el OpAmp, hemos construido una solución de hardware proactiva de tiempo real.

Al amplificar la micro-caída de tensión del circuito de potencia y leerla en la CPU, has dotado a tu sistema de "tacto". El microcontrolador puede "sentir" el esfuerzo mecánico del motor eléctrico. Identifica si el motor está forzado (sobrecarga/sobrepresión) o si está girando libremente sin líquido. Ahora tu gasera protege sus propios actuadores mecánicos de miles de dólares en fracciones de segundo, el Santo Grial de los variadores de frecuencia (VFD) y PLCs industriales de alta gama.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. Si cambiamos la resistencia de Feedback ($R_f$) a 99 kΩ y dejamos $R_{in}$ en 1 kΩ, ¿cuál será la ganancia, y qué pasaría si el motor jala 10 Amperios (100mV en el Shunt)?
Respuesta: La ganancia sería $1 + (99k/1k) = 100x$. Si el sensor emite 100mV (0.1V), el OpAmp intentaría sacar 10 Voltios ($0.1V \times 100$). Pero el OpAmp está alimentado a 5V (VCC), así que el voltaje de salida se "saturaría" chocando contra el techo de 5V. Peor aún, ¡le enviarías 5V al pin del STM32 (cuyo máximo es 3.3V) y lo destruirías! El diseño de la ganancia del OpAmp siempre debe calcularse para que el pico máximo del sensor físico jamás supere los 3.3V en la salida.

2. ¿Por qué usamos matemáticas puramente enteras (multiplicar primero, dividir después) en la función del código en lugar de simplemente declarar float?
Respuesta: Como hemos visto a lo largo de esta maestría (Día 38, Día 48), el uso de punto flotante en microcontroladores ARM sin FPU hardware destroza el rendimiento del Súper Bucle, invocando enormes librerías de emulación matemática y provocando latencias variables. En sistemas de emergencia donde debemos reaccionar a un motor atascado en microsegundos, el Punto Fijo nos da velocidad extrema y determinismo absoluto en el "Carril de Decisión" de la FSM.