DÍA 083 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

Floorplanning: La Anatomía de la Placa

Al importar el Netlist a Pcbnew, todos los componentes aparecen apilados. El proceso de separarlos y organizarlos no es estético, es electromagnético y termodinámico. Debemos dividir la placa de circuito en "Zonas o Dominios" estrictamente aislados.

Reglas de Ubicación de Potencia y Cerebro

  1. Zona de Potencia (Power Supply): El Convertidor Buck (Día 69) y el LDO (Día 68) deben ir pegados al conector de entrada de 24V. El inductor y el diodo Schottky generan un ruido magnético brutal (EMI) conmutando a 1 MHz. Deben estar lo más lejos posible del microcontrolador y de las entradas analógicas.
  2. Zona del Microcontrolador (MCU): El STM32 va en el centro de la zona lógica. Sus capacitores de Bypass (Día 63) no se negocian: deben estar físicamente aplastados contra los pines VDD y GND del chip. Si los alejas 5 milímetros, la pista de cobre actuará como una antena inductiva y el capacitor perderá su efecto de filtrado.
FLOORPLANNING INDUSTRIAL (UBICACIÓN KICAD) Edge.Cuts (Borde FR4) ZONA DE POTENCIA (Ruidosa) IN 24V BUCK (5V) L1 EMI RADIAL LDO 3.3V TO-252 ZONA DIGITAL (Limpia) VCC 3.3V Puro STM32 Cerebro 100nF (¡Pegado!) Y1 Oscilador Corto ZONA ANALÓGICA (Lejos de Potencia) OpAmp ADC In

Pin Swapping: Cuando el Hardware altera el Software

Al mover el MCU y enfrentarlo a los conectores, te darás cuenta de algo terrible: el Airwire (Día 81) que va del Pin PA5 hacia el Relé se cruza en "X" con el Airwire del Pin PB12 que va al LED. Si ruteas eso en cobre en una placa de 2 capas, chocarán.

La técnica industrial maestra es el Pin Swapping (Intercambio de Pines). En lugar de hacer una pista de cobre larguísima que dé la vuelta a toda la placa, el Arquitecto de Hardware vuelve al esquemático (Eeschema), cambia la etiqueta del LED de PB12 a PA6, actualiza el Netlist, y mágicamente los Airwires se desenredan, permitiendo pistas rectas y cortas. Luego, se le informa al ingeniero de Firmware que actualice el código.

⚙️ Ejercicios Prácticos

Ejercicio 1: Tu labor como diseñador Bare-Metal requiere sincronización perfecta. El ingeniero de Layout acaba de desenredar el "Rat's Nest" rotando el MCU y haciendo Pin Swapping. Actualiza las macros del Súper Bucle utilizando la abstracción correcta (Driver de Hardware) para asimilar los cambios físicos del PCB sin romper la Máquina de Estados.


#include <stdint.h>

// ============================================================================
// ARCHIVO: bsp_pines.h (Actualización por Layout del PCB Rev B)
// ============================================================================

/*
 * REPORTE DE CAMBIOS DEL INGENIERO DE LAYOUT (KiCad Pcbnew):
 * Para evitar que las pistas de potencia del MOSFET de la válvula crucen 
 * por debajo del oscilador de cristal (Y1) e induzcan ruido, se realizó 
 * un Pin Swapping de los actuadores hacia el lado derecho del STM32.
 * 
 * CAMBIOS:
 * - Válvula Principal:  De PB5 -> PC8
 * - Torreta de Alarma: De PC13 -> PC9
 */

// --- ANTES DEL LAYOUT (Comentado por historial) ---
// #define PORT_VALVULA  GPIOB
// #define PIN_VALVULA   5
// #define PORT_TORRETA  GPIOC
// #define PIN_TORRETA   13

// --- DESPUÉS DEL LAYOUT OPTIMIZADO (Actual) ---
#define PORT_VALVULA  GPIOC
#define PIN_VALVULA   8
#define PORT_TORRETA  GPIOC
#define PIN_TORRETA   9

// ----------------------------------------------------------------------------
// DRIVER BARE-METAL EN C
// ----------------------------------------------------------------------------
// Al usar macros para enmascarar los registros físicos, el Súper Bucle 
// nunca se entera de que los pines físicos cambiaron.

#define ABRIR_VALVULA()   (PORT_VALVULA->BSRR = (1 << PIN_VALVULA))
#define CERRAR_VALVULA()  (PORT_VALVULA->BSRR = (1 << (PIN_VALVULA + 16)))

#define ALARMA_ON()       (PORT_TORRETA->BSRR = (1 << PIN_TORRETA))
#define ALARMA_OFF()      (PORT_TORRETA->BSRR = (1 << (PIN_TORRETA + 16)))

// ... En el main.c, llamar a ABRIR_VALVULA() funcionará sin importar el hardware.
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Aislamiento de Ruido Magnético por Zonificación (Floorplanning).

La precisión de tu Despachador depende del ADC (Día 74) leyendo microvoltios del puente PT100. Si colocas el componente L1 (el inductor del Buck Converter) cerca del ADC, el campo magnético pulsante (EMI) inducirá voltajes parásitos en las pistas de cobre de los sensores, alterando la lectura de temperatura de 20.0°C a 20.5°C erráticamente. Eso significa que cobrarás mal el gas.

Al hacer un Placement riguroso en KiCad, hemos desterrado a toda la sección de Potencia a la esquina inferior izquierda del PCB. El procesador STM32 reina en el centro, y la zona Analógica (PT100, OpAmp) se ubica en el extremo derecho, en una "isla" aislada física y eléctricamente. Además, has aprendido que el diseño Bare-Metal en C no es rígido: a través de las abstracciones del bsp_pines.h, el software cede ante las necesidades topológicas del hardware para crear una Placa de Circuito limpia, corta y eficiente.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. Mirando el diagrama de Floorplanning, ¿por qué es crítico que las pistas que van del cristal del Reloj (Y1) al STM32 sean lo más cortas posibles?
Respuesta: El cristal genera una onda cuadrada constante de muy alta frecuencia (ej. 8 MHz, 16 MHz). Si las pistas de cobre (cables) de ese cristal son largas, se convierten literalmente en antenas transmisoras de radio. Empezarán a irradiar ruido a los sensores cercanos y tu diseño fallará las pruebas de Emisiones Radiadas (Certificación CE / FCC) porque tu Despachador de Gas se comportará como una estación de radio pirata.

2. Cuando un ingeniero de Hardware te pide hacer un "Pin Swap" en C para facilitar su ruteo de cobre, ¿deberías usar variables globales para configurar los pines o Macros de Preprocesador (#define)?
Respuesta: Estrictamente Macros (#define). En sistemas embebidos Bare-Metal, configurar pines de registros de bajo nivel usando variables (ej. int pin_valvula = 8; PORT->BSRR = (1 << pin_valvula);) gasta memoria RAM valiosa y le toma a la CPU múltiples ciclos de reloj leer la memoria y calcular el desplazamiento (Shift) en tiempo de ejecución. Las Macros se resuelven en el proceso de compilación, resultando en instrucciones de máquina ensamblador absolutas de un solo ciclo (O(1)), garantizando máxima velocidad sin usar memoria RAM dinámica.