DÍA 071 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

El Filtro RC Paso Bajo (Low-Pass Filter)

Un filtro RC es un circuito pasivo compuesto por una Resistencia en serie y un Capacitor en paralelo a tierra. Su función es permitir el paso de señales lentas o continuas (como el consumo real del motor, que es DC) y bloquear o destruir las variaciones rápidas (como el ruido eléctrico de alta frecuencia).

La Frecuencia de Corte ($f_c$)

El filtro no corta el ruido de tajo; lo atenúa gradualmente a partir de un punto matemático exacto llamado Frecuencia de Corte. Se calcula con esta hermosa ecuación matemática:

$$f_c = \frac{1}{2 \pi R C}$$

Si la corriente de tu bomba cambia lentamente (ej. variaciones de 10 Hz), y el ruido del motor ocurre a 10,000 Hz, diseñamos un filtro con una $f_c$ de ~150 Hz. Toda frecuencia por encima de 150 Hz será enviada directamente a la tierra por el capacitor, dejando una línea de voltaje suave y perfecta para el ADC.

FILTRO RC PASO BAJO (ANTI-ALIASING ADC) Señal OpAmp (2.5V + Ruido) R (1 kΩ) C (1 µF) Cerámico GND DIGITAL Pin ADC (STM32) Señal purificada Cálculo de Frecuencia de Corte: fc = 1 / (2 × π × R × C) fc = 1 / (2π × 1000 × 0.000001) ≈ 159 Hz

El Impacto en el Software: Tiempo de Muestreo

Al agregar una resistencia de $1 k\Omega$ en la pista de cobre antes del procesador, estamos limitando la corriente que entra al chip. El ADC del STM32 tiene un minúsculo capacitor interno (S&H, Sample and Hold) que debe llenarse para poder medir el voltaje. Al limitar la corriente, ese capacitor interno tardará más en llenarse.

Si el software le pide al ADC que lea "lo más rápido posible" (ej. 1.5 ciclos de reloj), leerá un voltaje falso porque el capacitor interno no alcanzó a llenarse a través de la resistencia de 1k. Debemos configurar el hardware interno del STM32 para "darle tiempo" a la lectura.

⚙️ Ejercicios Prácticos

Ejercicio 1: Programa el registro ADC_SMPR (Sample Time Register) del STM32 para extender el tiempo de muestreo a un nivel seguro (ej. 71.5 o 239.5 ciclos) compensando la alta impedancia generada por nuestro nuevo Filtro RC de hardware.


#include <stdint.h>

// --- 1. REGISTROS FÍSICOS DEL ADC (Simulación STM32F4) ---
volatile uint32_t *ADC1_CR2   = (volatile uint32_t *)0x40012008; // Control Register 2
volatile uint32_t *ADC1_SMPR2 = (volatile uint32_t *)0x40012010; // Sample Time Register 2

// El canal analógico donde está conectado el OpAmp/Filtro RC
const uint8_t CANAL_ADC_CORRIENTE = 4; // Asumimos Pin PA4


// --- 2. CONFIGURACIÓN DEL ADC BARE-METAL ---
void adc_init_alta_impedancia(void) {
    
    // Por defecto, los IDEs de aficionados configuran el tiempo de muestreo 
    // en "3 ciclos" para que sea rapidísimo. Pero nuestro filtro RC de 1kΩ
    // requiere paciencia eléctrica.
    
    // Limpiamos los 3 bits correspondientes al Canal 4 en el registro SMPR2
    *ADC1_SMPR2 &= ~(7 << (CANAL_ADC_CORRIENTE * 3));
    
    // Seteamos el valor binario '110' (que en decimal es 6) para seleccionar
    // un tiempo de muestreo de 144 ciclos de reloj.
    // Esto da tiempo suficiente para que el capacitor S&H interno del STM32
    // se cargue completamente a 2.5V a través de la resistencia del filtro.
    *ADC1_SMPR2 |= (6 << (CANAL_ADC_CORRIENTE * 3));
    
    // Encendemos el módulo ADC
    *ADC1_CR2 |= (1 << 0); // Bit ADON
}


// --- 3. RUTINA DE LECTURA PRECISA ---
uint32_t leer_corriente_filtrada_adc(void) {
    
    // 1. Iniciamos la conversión
    *ADC1_CR2 |= (1 << 30); // Bit SWSTART
    
    // 2. Esperamos a que el hardware termine (Polling).
    // Como pusimos 144 ciclos, tardará unos microsegundos adicionales.
    volatile uint32_t *ADC1_SR = (volatile uint32_t *)0x40012000;
    while ((*ADC1_SR & (1 << 1)) == 0) {
        // Esperar bandera EOC (End of Conversion)
    }
    
    // 3. Recuperar el dato purificado
    volatile uint32_t *ADC1_DR = (volatile uint32_t *)0x4001204C;
    return (*ADC1_DR);
}


int main(void) {
    
    adc_init_alta_impedancia();
    
    while(1) {
        
        // Ahora sí, esta lectura es oro puro.
        // El hardware mató el ruido superior a 150Hz.
        // El software esperó 144 ciclos para leer.
        uint32_t lectura_limpia = leer_corriente_filtrada_adc();
        
        // El valor pasa directo al motor analógico del Día 70
        // uint32_t miliamperios = calcular_corriente_motor_ma(lectura_limpia);
        
    }
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Filtro Anti-Aliasing de Hardware de Grado Metrológico.

Si la FSM de tu gasera depende de medir la corriente del motor para detectar cavitación o atascos (Día 70), esa medición tiene que ser infalible. Cuando los motores industriales operan, el sistema eléctrico de la bomba escupe "picos" de voltaje sucios (transitorios) al ambiente.

Si un pico rápido choca contra el pin ADC justo en el microsegundo en que el STM32 toma una lectura, el procesador interpretará ese pico falso como un "motor atascado" y abortará el despacho de gas. Un desastre comercial. Al colocar este humilde Filtro RC (1 kΩ y 1 µF) directamente en la pista del PCB justo antes del procesador, formamos un escudo analógico. Las ondas rápidas (ruido) resbalan por el capacitor hacia la tierra, y solo la corriente continua real de la bomba logra cruzar, dándole a tu algoritmo Bare-Metal datos incuestionables.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. ¿Por qué no usamos una resistencia de 100 kΩ en lugar de 1 kΩ para hacer el filtro aún más fuerte?
Respuesta: Por el límite físico de carga del ADC. Si usas 100 kΩ, la resistencia es tan inmensa que la corriente que fluye hacia el pin es casi nula. El capacitor interno Sample and Hold del STM32 nunca terminaría de cargarse al voltaje real del sensor, ni siquiera si configuras el ADC a su máximo tiempo de muestreo (480 ciclos). El voltaje leído siempre sería menor al real. La regla empírica industrial es no exceder los 10 kΩ en pistas directas al ADC si no se usa un OpAmp de acoplamiento (Buffer).

2. Ya hicimos un Filtro de Promedio Móvil en software en el Día 63. ¿Por qué estamos haciendo otro filtro ahora en hardware? ¿No es redundante?
Respuesta: Son un equipo, no redundancia. El filtro hardware RC se encarga de matar las frecuencias de megahercios y kilohercios que causarían Aliasing en el conversor ADC. Una vez que el hardware limpia eso, la señal entra al STM32. Luego, el Filtro de Promedio en software (Día 63) se encarga de matar el ruido de baja frecuencia (como variaciones leves en la mecánica del motor) para crear una variable numérica 100% estable para la Máquina de Estados. Hardware para lo rápido, Software para lo lento.