DÍA 107 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

Modulación por Ancho de Pulso (PWM)

El hardware de los Timers (como el TIM4) cuenta con un modo llamado Output Compare. En lugar de usar el registro CCR para "fotografiar" el tiempo entrante (como hicimos ayer con el Input Capture), el Timer enciende un pin físico cuando empieza a contar en cero, y lo apaga automáticamente cuando el contador (CNT) alcanza el valor que tú escribiste en el registro CCR.

Al mantener la frecuencia total constante mediante el registro ARR, y variar únicamente el CCR, logramos modificar el porcentaje de tiempo que la señal permanece en alto. Esto es el Duty Cycle (Ciclo de Trabajo).

Cálculo de Resolución y Frecuencia

Para controlar el brillo de un LED (como el Backlight de la LCD) sin que el ojo humano note un parpadeo mareante, la frecuencia de la onda (Periodo) debe ser de al menos 1 kHz. La matemática Bare-Metal es la siguiente:

Si el ARR es 1000, entonces cualquier número que escribas en el CCR (de 0 a 1000) será el equivalente directo a controlar el brillo de 0.0% a 100.0%. ¡Sin usar números flotantes!

ARQUITECTURA HARDWARE PWM (OUTPUT COMPARE) Tiempo (t) 3.3V 0V ARR (Periodo = 1ms) 25% CCR1 = 250 75% CCR1 = 750 El ojo humano / filtro RC promedia el voltaje: Vout = Vcc * Duty Cycle

⚙️ Ejercicios Prácticos

Ejercicio 1: El pin PB6 de tu microcontrolador está conectado a la compuerta de un transistor que alimenta los LEDs traseros (Backlight) de la pantalla LCD. Este pin corresponde a la Función Alternativa 2 (AF2) del Canal 1 del TIM4. Configura el timer Bare-Metal para generar una señal PWM a 1kHz y diseña una función para alterar el brillo del 0% al 100%.


/**
 * @file main.c
 * @brief Control PWM Hardware para Backlight LCD (TIM4_CH1)
 */

#include "stm32f401xe.h"

// Macro para limpieza y abstracción del brillo
#define SET_BRILLO_LCD(porcentaje) (TIM4->CCR1 = (porcentaje * 10))

void inicializar_pwm_backlight(void) {
    
    // --- 1. CONFIGURACIÓN DEL PIN FÍSICO (PB6) ---
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
    
    // Pin en modo Función Alternativa (10)
    GPIOB->MODER &= ~GPIO_MODER_MODE6; 
    GPIOB->MODER |= GPIO_MODER_MODE6_1; 
    
    // Asignar AF2 (TIM4) al pin PB6 en el registro Alternate Function Low (AFRL)
    GPIOB->AFR[0] &= ~GPIO_AFRL_AFSEL6;
    GPIOB->AFR[0] |= (2 << (6 * 4)); 
    
    // --- 2. CONFIGURACIÓN DEL TIMER 4 ---
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
    
    // Reloj maestro a 84MHz. Prescaler = 83.
    // El Timer contará a 1MHz (resolución de 1 microsegundo por paso).
    TIM4->PSC = 84 - 1; 
    
    // ARR = 999. El contador irá de 0 a 999.
    // A 1MHz, contar 1000 pasos toma exactamente 1 milisegundo (1kHz de frecuencia de PWM).
    TIM4->ARR = 1000 - 1; 
    
    // --- 3. CONFIGURACIÓN DEL CANAL 1 EN MODO PWM ---
    // CCMR1: Configurar Output Compare Mode 1 (OC1M = 110) en el Canal 1.
    // Esto enciende el pin al inicio y lo apaga al cruzar el valor CCR1.
    TIM4->CCMR1 &= ~TIM_CCMR1_OC1M;
    TIM4->CCMR1 |= (6 << TIM_CCMR1_OC1M_Pos);
    
    // Habilitar el buffer de precarga (Preload) para evitar glitches gráficos
    TIM4->CCMR1 |= TIM_CCMR1_OC1PE;
    
    // Habilitar la salida física del canal 1 (Capture/Compare 1 Enable)
    TIM4->CCER |= TIM_CCER_CC1E;
    
    // Brillo inicial al 100% (CCR1 = 1000)
    TIM4->CCR1 = 1000;
    
    // Arrancar el Timer
    TIM4->CR1 |= TIM_CR1_CEN;
}

int main(void) {
    
    inicializar_pwm_backlight();
    
    while(1) {
        
        // Simulación: Efecto "Respiración" (Breathing LED) suave
        for(uint32_t brillo = 0; brillo <= 100; brillo++) {
            SET_BRILLO_LCD(brillo);
            for(volatile int i=0; i<50000; i++); // Retardo simple
        }
        
        for(uint32_t brillo = 100; brillo > 0; brillo--) {
            SET_BRILLO_LCD(brillo);
            for(volatile int i=0; i<50000; i++); // Retardo simple
        }
    }
    
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Regulación Térmica y Experiencia de Usuario (UX).

Conectar tu arquitectura térmica (Día 86) con la interfaz de usuario es la marca de un diseño coherente. Recuerda la función de Thermal Throttling que planificamos. Si el interior del Despachador supera los 85°C bajo el sol ardiente, el procesador puede leer esa temperatura y ejecutar instantáneamente SET_BRILLO_LCD(20).

Al reducir el PWM al 20%, el regulador LDO (TO-252) dejará de disipar el calor excesivo generado por los LEDs de la pantalla. El hardware TIM4 se encarga de sostener la señal cuadrada a 1kHz eternamente en segundo plano. Ni un solo ciclo del procesador se desperdicia encendiendo y apagando el pin, permitiendo que el Cortex-M dedique toda su potencia a vigilar el caudal de gas y las alarmas críticas.

📝 Resumen del Día