DÍA 073 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

El Efecto Hall y el Caudalímetro Magnético

El Efecto Hall (descubierto por Edwin Hall) ocurre cuando un campo magnético atraviesa un semiconductor por el que fluye corriente. El magnetismo "empuja" a los electrones hacia un lado del chip, creando un minúsculo voltaje perpendicular. En palabras simples: el chip puede "sentir" la presencia de un imán sin tocarlo.

El Sensor de Colector Abierto (Open-Collector)

En tu caudalímetro, el gas empuja una turbina que tiene imanes incrustados en sus aspas. Cada vez que un aspa pasa frente al sensor Hall sellado, el sensor detecta el imán y cierra un interruptor interno (un transistor NPN). A esta salida se le llama Colector Abierto: el sensor no emite voltaje, simplemente "jala" la señal hacia Tierra (GND) cada vez que ve un imán.

INTERFAZ DE CAUDALÍMETRO (HALL + OPTOACOPLADOR) TUBERÍA GAS LP N SENSOR HALL (Industrial 24V) Open-Collector VCC +24V_EXT R1 (2.2kΩ) OPTOAISLADOR PC817 Señal (Pulso) GND_EXT VCC +3.3V_MCU Pin TIM_CH1 R2 (10kΩ) GND_DIGITAL

La Integración Perfecta (Día 62 y 67 combinados)

Como el sensor es de Colector Abierto, el circuito "cuelga" el LED del optoacoplador de los +24V y lo conecta al pin de señal del sensor. Cuando el imán pasa, el sensor conecta la señal a GND, cerrando el circuito. El LED infrarrojo se enciende y transfiere el pulso galvánicamente aislado a la placa STM32. ¡Un pulso perfecto, libre de ruido industrial y seguro a 3.3V!

El Contador de Hardware (Hardware Counter)

Una turbina de gas girando rápido puede generar miles de pulsos por segundo. Si usaras Interrupciones Externas (EXTI) como en el Día 67, la CPU se interrumpiría miles de veces por segundo, ahogando al Súper Bucle. La solución maestra Bare-Metal es usar un Timer en Modo Contador Externo (External Clock Mode). El hardware interno del microcontrolador cuenta los pulsos por sí solo, y el software simplemente lee la variable cuando lo necesita. Cero carga para la CPU.

⚙️ Ejercicios Prácticos

Ejercicio 1: Configura el Timer 2 (TIM2) de tu STM32 para que actúe no como un reloj de tiempo, sino como un contador de eventos externos provenientes del pin del optoacoplador.


#include <stdint.h>

// --- 1. REGISTROS FÍSICOS (Simulación STM32 TIM2) ---
volatile uint32_t *GPIOA_MODER = (volatile uint32_t *)0x40020000;
volatile uint32_t *GPIOA_AFRL  = (volatile uint32_t *)0x40020020;

volatile uint32_t *TIM2_CR1    = (volatile uint32_t *)0x40000000;
volatile uint32_t *TIM2_SMCR   = (volatile uint32_t *)0x40000008; // Slave Mode Control Reg
volatile uint32_t *TIM2_CCMR1  = (volatile uint32_t *)0x40000018; 
volatile uint32_t *TIM2_CNT    = (volatile uint32_t *)0x40000024; // El Registro Contador

const uint8_t PIN_CAUDALIMETRO = 0; // Usaremos PA0 (TIM2_CH1)


// --- 2. CONFIGURACIÓN DEL CONTADOR DE HARDWARE ---
void caudalimetro_init_hardware_counter(void) {
    
    // 1. Configurar Pin PA0 como Función Alternativa (Alternate Function)
    *GPIOA_MODER &= ~(3 << (PIN_CAUDALIMETRO * 2));
    *GPIOA_MODER |=  (2 << (PIN_CAUDALIMETRO * 2));
    
    // Asignar el AF1 (TIM2) al Pin PA0 en el registro AFRL
    *GPIOA_AFRL &= ~(0xF << (PIN_CAUDALIMETRO * 4));
    *GPIOA_AFRL |=  (1 << (PIN_CAUDALIMETRO * 4));
    
    // 2. Configurar el Timer 2 en Modo Esclavo (External Clock Mode 1)
    // El canal 1 (TI1) será la fuente de los "ticks", no el cristal de cuarzo.
    
    // Mapear IC1 al TI1 (Input Capture)
    *TIM2_CCMR1 |= (1 << 0); 
    
    // Configurar el Trigger Selection a TI1FP1 (101 en binario)
    *TIM2_SMCR &= ~(7 << 4);
    *TIM2_SMCR |=  (5 << 4);
    
    // Seleccionar External Clock Mode 1 (111 en binario)
    *TIM2_SMCR &= ~(7 << 0);
    *TIM2_SMCR |=  (7 << 0);
    
    // 3. Encender el Contador
    *TIM2_CR1 |= (1 << 0); // Bit CEN (Counter Enable)
}


// --- 3. LECTURA O(1) EN EL SÚPER BUCLE ---
uint32_t leer_pulsos_acumulados(void) {
    // Al software no le importa qué tan rápido gira la turbina.
    // El hardware de silicio está contando los fotones de luz del optoacoplador
    // en tiempo real. Solo venimos a recolectar el botín.
    return (*TIM2_CNT);
}


int main(void) {
    
    caudalimetro_init_hardware_counter();
    
    // Factor de conversión metrológico. Ej. 100 pulsos = 1 Litro
    const uint32_t FACTOR_PULSO_POR_LITRO = 100; 
    
    while(1) {
        
        // 1. Leer contador directo del hardware (Instantáneo y determinista)
        uint32_t total_pulsos = leer_pulsos_acumulados();
        
        // 2. Matemática de Punto Fijo (Día 48)
        uint32_t litros_despachados = total_pulsos / FACTOR_PULSO_POR_LITRO;
        
        // 3. Mostrar en la LCD HMI
        // lcd_imprimir_volumen(litros_despachados);
        
    }
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Adquisición de Señal Digital Inmune y de Alta Velocidad.

Leer el volumen del gas no es solo un tema matemático, es un desafío electromagnético. La tubería del despachador es de acero, el gas fluye a alta presión y los motores generan estática. Usar un sensor óptico es imposible por la oscuridad interna. Usar un interruptor mecánico (Reed Switch) provocaría rebotes falsos (Bouncing) y riesgo de chispa.

Al implementar el Sensor de Efecto Hall Industrial de Colector Abierto alimentado a 24V, cruzar la señal por la barrera de fotones de un Optoaislador, y entregar ese pulso limpio directamente al Hardware Timer del STM32, has creado la interfaz metrológica perfecta. Tu CPU puede estar ocupada encriptando un JSON (Día 58) para subirlo a la nube, y el hardware periférico seguirá contando cada mililitro de gas sin perder un solo pulso. Esta arquitectura separa físicamente la captura de datos (Hardware) del procesamiento de los mismos (Software).

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. Si un operario instala el sensor Hall cerca de una bomba de gas cuyo motor genera un campo electromagnético masivo (EMI), ¿afectará la lectura del caudalímetro?
Respuesta: Sí, es un riesgo físico conocido. Aunque nuestro hardware y optoaislador protegerán a la tarjeta de quemarse, el sensor Hall mide magnetismo. Un campo magnético externo extremadamente fuerte y fluctuante emitido por un motor AC cercano podría inducir pulsos falsos en el sensor, sumando litros fantasma. Por eso, en el diseño mecánico industrial, el caudalímetro siempre se aleja de la bomba o se blinda el motor con jaulas de Faraday magnéticas.

2. ¿Qué pasa si el TIM2_CNT llega a su máximo valor (Overflow)? ¿Perdemos el dinero de los pulsos del cliente?
Respuesta: En un STM32F4, el Timer 2 es de 32 bits, lo que significa que puede contar hasta 4,294,967,295 pulsos. Si 100 pulsos son un litro, ¡podrías despachar 42 millones de litros antes de que se desborde! Para el volumen de un camión o un tanque estacionario, jamás ocurrirá un Overflow en una sola venta. Si usáramos un timer de 16 bits (límite 65,535), sí tendríamos que programar una interrupción de desbordamiento de hardware (Update Interrupt) para sumar el exceso en una variable global auxiliar.