DÍA 298 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

Prueba Neumática vs Prueba Hidrostática

Ayer presurizamos con aire o nitrógeno para buscar fugas con jabón (Prueba Neumática). Pero los gases son elásticos; si inyectas gas a 25 Bar (360 PSI) en una tubería mal soldada y esta estalla, el gas se expandirá instantáneamente como una bomba, lanzando esquirlas de acero a la velocidad de una bala.

La norma **ASME B31.3** dicta la Prueba Hidrostática. Llenamos el tubo completamente de agua y lo presurizamos. Los líquidos son incompresibles. Si el tubo revienta a 30 Bar, el agua simplemente goteará y la presión caerá a cero instantáneamente, sin explosión ni onda expansiva.

La Dinámica de la Presión y la Dilatación

La regla exige inyectar agua al 1.5x de la Presión Máxima de Trabajo Permitida (MAWP). Si tu Despachador de Gas LP opera a 17 Bar (250 PSI), lo someteremos a 25.5 Bar (375 PSI). Al alcanzar esta presión, el tubo de acero al carbón *se estirará microscópicamente* (Dilatación Volumétrica). Este estiramiento causará una caída de presión inicial que los novatos confunden con una fuga. Para superarla, el STM32 debe monitorear la curva de asentamiento antes de fallar la prueba.

PRUEBA DE ESTRÉS HIDROSTÁTICO (1.5x MAWP) PLATAFORMA DE INYECCIÓN LÍQUIDA Bomba Manual (Inyecta Agua) Válvula de Bloqueo Purga de Aire PT STM32 Expansión CURVA DE CAÍDA DE PRESIÓN (ΔP/Δt) 25.5 Bar Tiempo Caída por Asentamiento (Dilatación elástica del acero) Aprobado Fallo (Fuga) TOLERANCIA ASME: CERO CAÍDA TRAS ESTABILIZAR

⚙️ Procedimiento Mecánico de Llenado

Paso 1: Llenado desde el punto más bajo.
Conecta una manguera de agua limpia al puerto inferior de tu sistema. Abre la válvula de purga (Bleed Valve) en el punto más alto del equipo. Bombea agua hasta que salga un chorro continuo y libre de burbujas por la purga superior. Cierra la purga herméticamente. Un solo mililitro de aire atrapado arruinará la matemática del procesador, ya que el aire comprimido amortiguará la lectura de fugas.

Paso 2: Bombeo Hidrostático.
Usa una bomba manual de prueba hidrostática (Hydro-test pump) para inyectar agua a alta presión hasta alcanzar los 25.5 Bar. Cierra la válvula de bloqueo maestra y desconecta la bomba. En este momento, el acero del Despachador está soportando una tensión masiva.

💻 Firmware: Matemáticas de Punto Fijo (Fixed-Point Math)

En el Día 297 escribimos un código de demostración usando la variable float. Pero un Arquitecto de Firmware Senior sabe que usar números de coma flotante en un microcontrolador Cortex-M4 sin FPU de doble precisión ralentiza el núcleo, engorda el binario compilado e introduce errores de redondeo letales al comparar caídas de presión minúsculas.

Hoy reescribiremos la lógica abandonando los floats. Usaremos matemáticas de punto fijo con enteros de 32 bits. Multiplicaremos todo por 1000 para procesar milibares (mBar), ganando velocidad brutal y exactitud absoluta.


/**
 * @file hydro_test_fixed_point.c
 * @brief Algoritmo ASME B31.3 de Presión Hidrostática usando enteros (Sin floats)
 */

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

// =========================================================================
// PARÁMETROS FIJOS (Todo en mBar y microAmperios para evitar floats)
// =========================================================================
#define TARGET_PRESSURE_MBAR     (25500U) // 25.5 Bar = 25,500 mBar
#define SETTLING_TIME_SEC        (300U)   // 5 Minutos de asentamiento elástico
#define HOLD_TIME_SEC            (900U)   // 15 Minutos de retención
#define MAX_DROP_MBAR            (150U)   // Caída máxima permitida de 0.15 Bar

extern ADC_HandleTypeDef hadc1;

/**
 * @brief Convierte la lectura ADC cruda a mBar usando aritmética entera
 * Asume: VREF = 3300mV, ADC 12-bit (4095), Shunt = 150 Ohm, Sensor 4-20mA = 0-40 Bar
 */
uint32_t Read_Pressure_mBar(void) {
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, 100);
    uint32_t adc_val = HAL_ADC_GetValue(&hadc1);
    HAL_ADC_Stop(&hadc1);

    // 1. Convertir ADC a microAmperios (uA)
    // Voltaje(mV) = (adc_val * 3300) / 4095
    // Corriente(uA) = (Voltaje * 1000) / 150
    uint32_t current_uA = (adc_val * 3300000U) / (4095U * 150U);

    // 2. Mapear de 4,000 uA - 20,000 uA  -->  0 - 40,000 mBar (40 Bar)
    if (current_uA < 4000U) return 0; // Evitar underflow
    
    // (Corriente_Actual - Corriente_Min) * Rango_Presion / Rango_Corriente
    uint32_t pressure_mbar = ((current_uA - 4000U) * 40000U) / 16000U;
    
    return pressure_mbar;
}

/**
 * @brief Máquina de estados de certificación hidrostática sin bloqueos pesados
 */
bool Execute_Hydrostatic_Test(void) {
    uint32_t start_pressure = Read_Pressure_mBar();
    
    if (start_pressure < TARGET_PRESSURE_MBAR) {
        // Enviar error serial (Se usaría una función UART_Send_String en lugar de printf)
        return false; 
    }

    // FASE 1: ASENTAMIENTO (Permite expansión del tubo y escape de aire residual)
    for(uint32_t i = 0; i < SETTLING_TIME_SEC; i++) {
        HAL_Delay(1000); // 1 segundo
    }
    
    // Fijar la "Presión Base" oficial después del estiramiento
    uint32_t base_pressure = Read_Pressure_mBar();

    // FASE 2: MONITOREO DE RETENCIÓN ESTRICTO
    for(uint32_t i = 0; i < HOLD_TIME_SEC; i++) {
        HAL_Delay(1000);
        uint32_t current_pressure = Read_Pressure_mBar();
        
        // Matemáticas de desbordamiento seguro
        uint32_t drop = 0;
        if (base_pressure > current_pressure) {
            drop = base_pressure - current_pressure;
        }

        if (drop > MAX_DROP_MBAR) {
            // [!] Falla Crítica. El tubo tiene una fisura o fuga en junta.
            return false;
        }
    }
    
    // [V] Certificado. El acero soportó 1.5x MAWP sin pérdida de masa.
    return true;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Certificación Estructural (ASME B31.3) y Optimización de Aritmética de CPU.

Diseñar un Despachador de Gas LP es una responsabilidad tremenda. Un error en el código de pantalla mostrará un precio incorrecto, pero un error en la resistencia mecánica liberará gas a la atmósfera. Al inyectar agua presurizada a **25.5 Bar (1.5 veces el MAWP de 17 Bar)**, forzamos a cada hilo NPT sellado con Loctite anaeróbico, a cada empaque de las válvulas solenoides y al propio acero al carbón a demostrar que pueden soportar el estrés sin estallar.

A nivel de Ingeniería de Firmware, hemos dado un salto magistral. Los novatos resuelven problemas de conversión ADC usando la variable `float` y la función `sprintf`. Esto invoca pesadas librerías de punto flotante que consumen Kilobytes enteros de la memoria Flash del STM32 y ciclos de CPU inútiles. Al reescribir tu núcleo metrológico utilizando **Aritmética de Enteros (Fixed-Point Math de 32 bits)** escalando todo a microAmperios y miliBares, has programado como un veterano de la industria automotriz. Tu procesador calcula la caída de presión en una fracción de milisegundo con precisión perfecta, entendiendo la diferencia entre la dilatación térmica normal del acero y una fisura catastrófica. La tubería es segura, el código es veloz y el sistema está certificado.

📝 Resumen del Día