Volver al inicio

Relojes en VLI IV-11 y STM32F401: esquema y código

Proyecto de reloj de escritorio usa VLI IV-11 con microcontrolador STM32F401CC. Implementado control de indicación dinámica, RTC hardware con calibración y alimentación USB vía módulos DC-DC. Código y esquema completos para reproducción.

Relojes retro IV-11 en STM32: guía completa de ensamblaje
Advertisement 728x90

Reloj de escritorio con tubos VFD IV-11 en STM32F401 y convertidores DC-DC

Este proyecto crea un elegante reloj de escritorio utilizando tubos de visualización fluorescente de vacío (VFD), específicamente los IV-11. El microcontrolador STM32F401CC gestiona la visualización dinámica del tiempo mediante un controlador de 8 canales como el TD62783AP (o el compatible KID65783AP). La alimentación proviene de módulos DC-DC modernos: el XL6009 eleva a 45 V para el ánodo, mientras que el MP2307 reduce los 5 V USB a un preciso suministro de filamento de 1,5 V. El RTC integrado en la placa mantiene la hora perfecta sin módulos externos.

Requisitos del IV-11: filamento de 1,5 V, ánodo de ~50 V. Diseñado en Altium Designer con archivos Gerber listos para producción.

Componentes y esquema

Partes clave:

Google AdInline article slot
  • Microcontrolador: STM32F401CC (placa Black Pill) con RTC integrado.
  • Controlador de visualización: TD62783AP para control de segmentos a alto voltaje.
  • Alimentación:

- XL6009: convertidor elevador 5 V → 45 V.

- MP2307: regulador reductor para filamento estable de 1,5 V.

  • Visualización: IV-11 VFD de 4 dígitos con multiplexación dinámica.
  • Controles: Un solo botón para ajustar la hora (pulsación corta: minutos; pulsación larga: horas).

El esquema utiliza GPIO para segmentos y dígitos, más un temporizador para el antirrebote del botón.

Google AdInline article slot

Firmware en STM32CubeIDE

El código aprovecha una librería segment_lcd para una visualización dinámica fluida. Bucle principal: consulta el RTC, maneja botones, formatea la cadena de hora con dos puntos parpadeantes (período de 2 s) y actualiza la pantalla.

Código completo:

#include "main.h"
#include "segment_lcd.h"
#include "stdio.h"
#include "button.h"

/* Private variables ---------------------------------------------------------*/
RTC_HandleTypeDef hrtc;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim10;

RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef DateToUpdate = {0};

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_RTC_Init(void);
static void MX_TIM10_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_RTC_Init();
  MX_TIM10_Init();

  HAL_PWR_EnableBkUpAccess();

  HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
  HAL_TIM_Base_Start_IT(&htim10);

  while (1)
  {
    HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN);

    BUTTON_Process();
    if (BUTTON_GetAction(BUTTON_SETTINGS) == BUTTON_SHORT_PRESS)
    {
      sTime.Minutes++;
      sTime.Seconds = 0;
      if(sTime.Minutes >=60)
      {
        sTime.Seconds = 0;
        sTime.Minutes = 0;
      }
      HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    }

    if (BUTTON_GetAction(BUTTON_SETTINGS) == BUTTON_LONG_PRESS)
    {
      sTime.Hours++;
      if(sTime.Hours >=24)
      {
        sTime.Hours = 0;
      }
      HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    }
    BUTTON_ResetActions();

    SEG_LCD_Process();
    HAL_Delay(1);

    char str[DIGITS_NUM + 2];
    if(sTime.Seconds % 2 == 0)
    {
      snprintf(str, DIGITS_NUM +2, "%02d.%02d", sTime.Hours, sTime.Minutes );
    }
    else
    {
      snprintf(str, DIGITS_NUM +2, "%02d%02d", sTime.Hours, sTime.Minutes );
    }
    SEG_LCD_WriteString(str);
  }
}

// ... (otras funciones: SystemClock_Config, MX_RTC_Init, MX_TIM10_Init, MX_GPIO_Init - ver original)

Configuración del reloj y RTC

Reloj del sistema: HSE 25 MHz → PLL 84 MHz (HCLK). LSE 32,768 kHz para RTC. Preescaladores: asíncrono 127, síncrono 255. Calibración RTC: cal suave con corrección de -142 pulsos en 32 s.

Google AdInline article slot

Inicio inicial: establece 12:00 del 02/12/2026, bandera de respaldo en BKP_DR0 (0x32F2). TIM10 (10 kHz) maneja el procesamiento de botones.

GPIO: PB3-6,12-15 para dígitos/segmentos (salida push-pull, baja velocidad); PA2 para botón (entrada, sin pull).

Ensamblaje y depuración

  • Envía los Gerbers a fabricación.
  • Graba vía STM32CubeIDE (ST-Link).
  • Conecta USB 5 V.
  • Ajusta la hora con el botón.

Consejos: Evita TD62783AP falsos—usa KID65783AP. Para tubos IV-6, añade una resistencia para bajar el filamento a 1,2 V.

Aspectos destacados

  • Conducción dinámica TD62783AP ahorra pines GPIO.
  • RTC integrado en STM32—no necesitas DS3231.
  • Módulos XL6009/MP2307 ofrecen alimentación USB sólida.
  • Calibración RTC alcanza ±142 pulsos/32 s de precisión.
  • Código compila directamente; librería segment_lcd simplifica el control VFD.

— Editorial Team

Advertisement 728x90

Leer después