Un optoacoplador (como el clásico PC817 o el industrial TLP281) es un chip mágico. En su interior, no hay cables que unan el lado izquierdo con el derecho. Contiene un LED infrarrojo y un Fototransistor separados por un plástico transparente.
Cuando el STM32 enciende el pin, ilumina el LED (lado de 3.3V). La luz viaja a través del chip y excita la base del fototransistor en el otro lado, dejando pasar la corriente de 24V. Como la comunicación es exclusivamente mediante fotones (luz), existe un Aislamiento Galvánico. Si el relé explota y le inyecta 1,000 voltios a la placa, el chip optoacoplador morirá, pero el arco eléctrico no podrá cruzar el plástico hacia el STM32. Tu cerebro electrónico sobrevivirá.
Los relés y las válvulas son cargas inductivas (bobinas de alambre). Cuando las enciendes, crean un campo magnético. El problema ocurre cuando las apagas: el campo magnético colapsa violentamente e induce un voltaje en sentido inverso (Back-EMF) que puede alcanzar cientos de voltios durante microsegundos. Este pico de voltaje destruirá el transistor que controla el relé. Colocar un diodo (como el 1N4148 o 1N4007) en anti-paralelo a la bobina permite que este pico de energía gire en un bucle cerrado sobre sí mismo hasta disiparse inofensivamente.
Diseño de Tierras Físicas (GND vs PGND): El aislamiento galvánico no sirve de nada si unes las tierras de ambos lados. En tu diseño de KiCad (Día 271), debes tener dos símbolos de tierra distintos. La Tierra Digital (GND) se conecta al STM32, a la EEPROM y al cátodo del LED del optoacoplador. La Tierra de Potencia (PGND) se conecta a la fuente de 24V, al emisor del MOSFET y a los motores. El circuito se cierra localmente a cada lado de la barrera de luz.
Ejercicio 1: El Driver Seguro MISRA-C. Escribiremos la función en software que controla este hardware aislando conceptualmente la lógica de la máquina ("Abrir Válvula 1") del pin de silicio subyacente.
/**
* @file actuator_valve_driver.c
* @brief Driver de salidas digitales aisladas para Relés/Válvulas (MISRA C)
*/
#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include <stdint.h>
#include <stdbool.h>
// =========================================================================
// MAPEO DE HARDWARE (Capa de Abstracción)
// =========================================================================
// El Optoacoplador invierte la lógica dependiendo de cómo esté conectado.
// En nuestro diagrama, encender el LED (High) satura el opto,
// lo que carga el Gate del MOSFET (High), cerrando el relé.
#define VALVE_OPTO_PIN_ON GPIO_PIN_SET
#define VALVE_OPTO_PIN_OFF GPIO_PIN_RESET
#define VALVE_1_PORT GPIOB
#define VALVE_1_PIN GPIO_PIN_5
// Estructura de estado de las válvulas
typedef enum {
VALVE_STATE_CLOSED = 0U,
VALVE_STATE_OPEN = 1U
} ValveState_t;
static ValveState_t state_valve_1 = VALVE_STATE_CLOSED;
// =========================================================================
// FUNCIONES DE CONTROL ROBUSTO
// =========================================================================
/**
* @brief Abre o Cierra la válvula de despacho de Gas LP.
* @param open_valve: TRUE para energizar el relé, FALSE para desenergizar.
*/
void Actuator_Set_Valve_1(bool open_valve) {
if (open_valve) {
// Validación extra de seguridad de negocio antes de accionar hardware
// if (!Safety_Is_Emergency_Stop_Active()) { ... }
HAL_GPIO_WritePin(VALVE_1_PORT, VALVE_1_PIN, VALVE_OPTO_PIN_ON);
state_valve_1 = VALVE_STATE_OPEN;
// Logueamos la acción para auditoría termodinámica
// printf("[CTRL] Valvula 1: ENERGIZADA (Flujo Abierto)\r\n");
} else {
// El estado por defecto (Safe State) siempre debe apagar el pin
HAL_GPIO_WritePin(VALVE_1_PORT, VALVE_1_PIN, VALVE_OPTO_PIN_OFF);
state_valve_1 = VALVE_STATE_CLOSED;
// printf("[CTRL] Valvula 1: DESENERGIZADA (Flujo Cerrado)\r\n");
}
}
/**
* @brief Retorna el estado lógico actual de la válvula.
* @retval ValveState_t (Abierta o Cerrada)
*/
ValveState_t Actuator_Get_Valve_1_State(void) {
return state_valve_1;
}
// =========================================================================
// RUTINA DE EMERGENCIA (FAIL-SAFE)
// =========================================================================
/**
* @brief Cierra mecánicamente todas las válvulas ignorando la lógica de negocio.
* Debe llamarse desde interrupciones críticas (HardFault, Botón Paro).
*/
void Actuator_Emergency_Shutdown_All(void) {
// Al escribir un 0 (RESET), apagamos el LED del Optoacoplador.
// Al no haber luz, el fototransistor se bloquea.
// La resistencia de pull-down R2 descarga el Gate del MOSFET a PGND.
// El MOSFET se abre, desenergizando la bobina del relé.
// El diodo Flyback absorbe el contragolpe inductivo.
HAL_GPIO_WritePin(VALVE_1_PORT, VALVE_1_PIN, VALVE_OPTO_PIN_OFF);
// Repetir para Válvula 2, 3, etc...
state_valve_1 = VALVE_STATE_CLOSED;
}
Objetivo del día: Aislamiento de Actuadores Inductivos y Supresión Electromagnética (EMC).
Un ingeniero en ciernes conecta un microcontrolador directo a un relé y, cuando enciende la bomba de la gasolinera, la pantalla LCD muestra basura y el chip se reinicia. Intentará solucionarlo añadiendo "delays" en el código o capacitores al azar, sin comprender que está luchando contra la física de los campos magnéticos colapsantes.
Al diseñar la Etapa de Potencia con Optoacopladores y MOSFETs en KiCad, has levantado una muralla infranqueable. La delicada lógica de 3.3V de tu STM32 ahora vive en una "Burbuja de Cristal", comunicándose con las bestias de 24V (Solenoides, Contactores) disparando destellos de luz infrarroja dentro del chip PC817. Además, el Diodo Flyback ahoga el grito electromagnético de la bobina del relé justo donde nace. Esto garantiza que sin importar cuántas veces el despachador encienda y apague las enormes bombas de Gas LP, tu núcleo de procesamiento RTOS no perderá un solo ciclo de reloj por interferencia eléctrica. Tu equipo ha alcanzado la robustez ininterrumpida que la industria petrolera y de gases (Oil & Gas) exige.
GND) para el cerebro y una Tierra de Potencia (PGND) para los relés, sin que ninguna pista de cobre las una físicamente.