Un capacitor es un componente pasivo que almacena energía en un campo eléctrico. En circuitos de corriente continua (DC), el capacitor actúa como un tanque de reserva. Si el voltaje de la fuente principal cae repentinamente, el capacitor libera su energía almacenada para mantener el voltaje estable. Si hay un pico de voltaje, el capacitor absorbe el impacto.
Ningún capacitor es perfecto. Los capacitores grandes (ej. 10 µF o 100 µF Electrolíticos) almacenan mucha energía, ideal para soportar "bajones" cuando arranca un motor. Pero son lentos y no pueden reaccionar al ruido eléctrico de alta frecuencia. A este se le llama capacitor Bulk (Reserva).
Por otro lado, los capacitores pequeños (ej. 0.1 µF Cerámicos) almacenan poca energía, pero son extremadamente rápidos. Absorben picos de ruido de alta frecuencia (como las chispas de los relés). A este se le llama capacitor de Bypass (Derivación), y en el diseño de tu placa KiCad, debe colocarse físicamente a menos de 5 milímetros del pin VDD de tu STM32.
El hardware filtra el voltaje de alimentación. Pero, ¿qué pasa con los sensores analógicos (ADC)? El ruido electromagnético a veces logra colarse en la lectura de presión del gas. Para que la Máquina de Estados (FSM) no enloquezca, aplicamos un Filtro de Promedio Móvil (Moving Average Filter) en software, actuando como un equivalente matemático de un capacitor.
Ejercicio 1: Tu hardware ya está protegido. Ahora, escribe un Filtro Pasa-Bajas digital en C (Promedio Móvil Circular) para "suavizar" las variaciones de lectura de los sensores de la gasera antes de procesarlos métricamente.
#include <stdint.h>
// --- 1. CONFIGURACIÓN DEL FILTRO DIGITAL ---
// Un búfer de 8 lecturas. Usar potencias de 2 (2, 4, 8, 16)
// permite al compilador usar desplazamientos de bits (Bit-shift)
// en lugar de usar división computacional, ahorrando tiempo de CPU.
#define TAMANO_MUESTRAS 8
typedef struct {
uint32_t buffer[TAMANO_MUESTRAS];
uint8_t indice;
uint32_t suma_total;
} FiltroPromedio;
// --- 2. INICIALIZACIÓN ---
void filtro_init(FiltroPromedio *filtro) {
filtro->indice = 0;
filtro->suma_total = 0;
for (uint8_t i = 0; i < TAMANO_MUESTRAS; i++) {
filtro->buffer[i] = 0;
}
}
// --- 3. EL ALGORITMO O(1) BARE-METAL ---
// Esta función procesa el ruido en tiempo real sin usar bucles costosos.
uint32_t filtro_procesar_lectura(FiltroPromedio *filtro, uint32_t nueva_lectura) {
// 1. Restamos la lectura más vieja de la suma total
filtro->suma_total -= filtro->buffer[filtro->indice];
// 2. Guardamos la nueva lectura en el arreglo
filtro->buffer[filtro->indice] = nueva_lectura;
// 3. Sumamos la nueva lectura a la suma total
filtro->suma_total += nueva_lectura;
// 4. Avanzamos el índice (Búfer circular)
filtro->indice++;
if (filtro->indice >= TAMANO_MUESTRAS) {
filtro->indice = 0;
}
// 5. Calculamos el promedio actual
// Como TAMANO_MUESTRAS es 8, equivale a mover los bits >> 3
return (filtro->suma_total / TAMANO_MUESTRAS);
}
// --- 4. INTEGRACIÓN EN EL DESPACHADOR ---
int main(void) {
FiltroPromedio filtro_presion_adc;
filtro_init(&filtro_presion_adc);
while(1) {
// Simulación: El hardware nos da una lectura con "ruido"
uint32_t lectura_adc_ruidosa = leer_adc_hardware();
// El filtro digital actúa como un "Capacitor de Software"
uint32_t lectura_limpia = filtro_procesar_lectura(&filtro_presion_adc, lectura_adc_ruidosa);
// Ahora la FSM (Día 60) opera sobre un dato matemático estable
// evaluar_presion_gasera(lectura_limpia);
}
return 0;
}
Objetivo del día: Estabilidad de Potencia y Señal.
El diseño de tu placa de circuito (PCB) es tan crítico como tu Súper Bucle. En una gasera industrial, cuando la contactora trifásica se activa para encender el motor de la bomba, el voltaje de la fuente puede colapsar una fracción de segundo. Si solo tienes un capacitor pequeño, tu STM32 sufrirá un "Brown-out" (Día 55) y la máquina se bloqueará, arruinando la venta.
Al diseñar el par 10 µF (Bulk) + 0.1 µF (Bypass) en paralelo a la entrada de tu chip, creas un suministro de energía a prueba de balas. El Bulk sostiene a la CPU durante la caída de tensión, y el Bypass absorbe las chispas de alta frecuencia del motor. Y para la lectura de datos, el Filtro de Promedio Móvil en código actúa como la última línea de defensa, promediando matemáticamente cualquier chispa electromagnética que haya logrado atravesar el hardware. Tu máquina es, ahora, eléctricamente resiliente.
1. ¿Por qué en la función del Filtro Digital llevamos una variable suma_total en lugar de usar un ciclo for que sume los 8 valores del arreglo cada vez que llega una lectura?
Respuesta: Por eficiencia Bare-Metal de Tiempo Real (Algoritmo O(1)). Si usaras un ciclo for y tuvieras un filtro de 64 muestras, la CPU perdería tiempo haciendo 64 sumas en cada vuelta del Súper Bucle. Al mantener una suma_total global, solo necesitas restar el número viejo que sale, y sumar el número nuevo que entra. ¡Son solo 2 operaciones matemáticas sin importar si el filtro es de 8 o de 1024 muestras!
2. Si en tu diseño KiCad olvidas poner el capacitor de Bypass de 0.1 µF y solo dejas el grande de 10 µF, ¿qué tipo de falla verías en campo?
Respuesta: Verías reinicios erráticos y "cuelgues" inexplicables en la máquina justamente en los momentos en que se activan los relés o las electroválvulas. El capacitor de 10 µF es lento por su construcción interna (alta inductancia equivalente, ESL). Cuando la chispa de la electroválvula inyecta ruido de megahercios, el capacitor grande no reacciona a tiempo, el ruido golpea el núcleo de silicio del STM32 y causa un HardFault (Día 54).