DÍA 299 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

El K-Factor (Pulsos por Unidad)

Los medidores de flujo mecánicos (engranajes ovalados, turbinas) o de efecto Coriolis generan una onda cuadrada. Cada pulso representa un volumen fijo de fluido que ha cruzado la cámara de medición. El K-Factor es el número escalar que relaciona los pulsos crudos con el volumen real:

$Volumen = \frac{Pulsos}{K\_Factor}$

El "Serafín" (Medidor Volumétrico Patrón)

La única manera de certificar a nivel legal (cumpliendo con la NOM-005-SCFI) cuánto gas entrega tu máquina es despachar fluido hacia un probador volumétrico certificado, conocido coloquialmente en la industria como "Serafín" o Jarro Patrón. Es un tanque metálico con un cuello de vidrio muy delgado y graduado. Si tu STM32 indica que entregó 20.00 Litros, el menisco del líquido en el cuello del Serafín debe marcar exactamente la línea de "0" de error.

Si la pantalla de tu Despachador dice 20 Litros, pero el Serafín marca 19.80 Litros físicos, tu equipo está "regalando" menos gas, lo cual amerita una multa de la autoridad metrológica. La fórmula para corregir el desvío es:

$K\_Factor_{Nuevo} = K\_Factor_{Actual} \times \left( \frac{Volumen_{STM32}}{Volumen_{Serafin}} \right)$

PROCESO DE CALIBRACIÓN: EL "SERAFÍN" (PROVER TANK) Flow Meter STM32 (Firmware) 20.00 L 2,000 Pulsos (Crudo) SERAFÍN Jarro Patrón de 20L +100 mL 20.000 L (CERO) -100 mL El gas físico llegó aquí V_real = 19.85 L (-150mL) CÁLCULO DEL ERROR DE MEDICIÓN (ERROR %) Error % = ((20.00L - 19.85L) / 19.85L) * 100 Fallo de Metrología: +0.75% (Multa PROFECO)

⚙️ Pasos Prácticos: El Proceso de Calibración en Campo

Paso 1: Purgado y Acondicionamiento Térmico.
Nunca calibres en el primer despacho del día. Las tuberías están vacías o llenas de vapor de gas dilatado por el calor del sol matutino. Debes despachar gas de vuelta al tanque de almacenamiento durante unos minutos para enfriar las tuberías (el GLP es un líquido refrigerante) y asegurar fase líquida 100% pura a través del medidor Coriolis o de turbina.

Paso 2: El Despacho al Serafín.
Coloca el equipo en "Modo de Calibración". Dispensa exactamente lo que tu STM32 considere que son 20.00 Litros al Serafín certificado. Deja reposar la espuma por un minuto. Lee el cuello de cristal. La escala no viene en litros, viene en mililitros de desviación (Ej. "-150 mL" indica que faltó gas para llegar al cero central).

Paso 3: Cálculo del Nuevo K-Factor.
Supongamos que el STM32 usa un K = 100.00 Pulsos/L y midió 2000 pulsos para detenerse en 20.00L. Pero en el vidrio lees 19.85L.
Nuevo_K = 100.00 * (20.00 / 19.85) = 100.755 Pulsos/L.
Ingresa este nuevo valor al Firmware y guárdalo en la memoria EEPROM/Flash.

💻 Firmware: Aritmética de Enteros 64-bit (Anti-Floats)

En el Día 298 determinamos que usar float es un suicidio para el rendimiento del microcontrolador. Un K-Factor como 100.755 es un número decimal, pero nosotros lo guardaremos en la memoria como un entero escalado (multiplicado por 1,000): 100755.

Para que las matemáticas sean exactas, multiplicaremos los pulsos por un millón antes de dividir, lo que excederá rápidamente la capacidad de un uint32_t (Límite 4,294 millones). Utilizaremos obligatoriamente uint64_t para el cálculo transitorio.


/**
 * @file metrology_calibration.c
 * @brief Cálculos volumétricos y Calibración K-Factor usando Punto Fijo
 */

#include <stdint.h>
#include <stdio.h>

// =========================================================================
// VARIABLES DE EEPROM / FLASH (Aritmética Escalada por 1,000)
// Ejemplo: Si el K-Factor es 100.755 Pulsos/L, guardamos 100755.
// =========================================================================
uint32_t Current_K_Factor_Scaled = 100000; // Valor de fábrica (100.000)

/**
 * @brief Convierte los pulsos del hardware (EXTI) a Mililitros despachados.
 * @param hardware_pulses: Cantidad de ticks leídos del pin del caudalímetro.
 * @retval uint32_t: Volumen despachado en Mililitros exactos.
 */
uint32_t Calculate_Volume_mL(uint32_t hardware_pulses) {
    // Fórmula teórica: Litros = Pulsos / K_Factor
    // Despeje Punto Fijo: mL = (Pulsos * 1,000,000) / K_Factor_Scaled
    
    // PELIGRO DE DESBORDAMIENTO: 
    // Si Pulsos = 5,000.  5000 * 1,000,000 = 5,000,000,000. 
    // Un uint32_t colapsa en 4.2 billones. Se requiere forzar uint64_t.
    
    uint64_t numerator = (uint64_t)hardware_pulses * 1000000ULL;
    uint32_t volume_mL = (uint32_t)(numerator / Current_K_Factor_Scaled);
    
    return volume_mL;
}

/**
 * @brief Rutina activada por el Gerente para ajustar el K-Factor tras la prueba del Serafín.
 * @param dispensed_pulses: Pulsos crudos que el sistema contó durante la prueba de 20L.
 * @param real_volume_mL: Lo que el inspector de PROFECO leyó en el cristal (Ej. 19850 mL).
 */
void Calibrate_K_Factor(uint32_t dispensed_pulses, uint32_t real_volume_mL) {
    
    // Fórmula Teórica: K_Nuevo = Pulsos_Contados / Litros_Reales
    // Despeje Punto Fijo: K_Nuevo_Scaled = (Pulsos_Contados * 1,000 * 1,000) / mL_Reales
    
    uint64_t numerator = (uint64_t)dispensed_pulses * 1000000ULL;
    uint32_t new_k_factor = (uint32_t)(numerator / real_volume_mL);
    
    // Validación de seguridad (Sanity Check)
    // El desgaste mecánico rara vez excede el +/- 15% del valor de fábrica.
    // Si el nuevo K-Factor es un 50% diferente, la turbina está rota, no descalibrada.
    
    if (new_k_factor < 50000 || new_k_factor > 150000) {
        printf("[X] ERROR CRÍTICO: Nueva calibración fuera de rango mecánico seguro.\r\n");
        printf("    Posible fallo catastrófico en aspas del Caudalímetro.\r\n");
        return;
    }
    
    // Actualizar la variable RAM y (posteriormente) guardar en EEPROM
    Current_K_Factor_Scaled = new_k_factor;
    
    printf("[V] Calibración Exitosa. Nuevo K-Factor: %lu / 1000 Pulsos/L\r\n", new_k_factor);
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Legalidad Comercial (NOM-005-SCFI) y Metrología de Precisión.

En el diseño de firmware industrial para LATAM, ninguna norma pesa más sobre un Despachador de Gas LP que la de los instrumentos de medición. La autoridad te exigirá que tu máquina tenga un error máximo de $\pm0.3\%$ o $\pm0.5\%$ en una probeta de 20 Litros. Si programaste tu STM32 para depender de la constante grabada en la carcasa del caudalímetro y no incluiste una función de recalibración, tu diseño es un fracaso comercial en su primer día de uso.

Al implementar una subrutina de **Calibración Volumétrica** basada en el "Jarro Patrón", otorgaste a la planta gasera la herramienta para mantener su negocio dentro de la legalidad ante los inspectores de PROFECO. Pero lo más elegante de tu solución como Arquitecto de Software es el uso del tipo `uint64_t` en la función Calibrate_K_Factor(). Has escalado la precisión del decimal (guardando `100.755` como `100755`) para proteger al procesador de los lentos y pesados números flotantes (heredando la disciplina matemática del Día 298), pero has anticipado el inevitable desbordamiento de 32 bits que habría reiniciado el volumen a cero misteriosamente si el despacho cruzaba la marca de los 4.2 Litros. Tu código no solo es exacto, es a prueba de fallos matemáticos bajo volumen extremo.

📝 Resumen del Día