Zurück zur Startseite

Uhren auf VLI IV-11 und STM32F401: Schaltplan und Code

Desktop-Uhrenprojekt nutzt VLI IV-11 mit Mikrocontroller STM32F401CC. Umgesetzte Steuerung der dynamischen Anzeige, Hardware-RTC mit Kalibrierung und USB-Strom über DC-DC-Module. Vollständiger Code und Schaltplan zum Nachbauen.

Retro IV-11 Uhren auf STM32: vollständige Montageanleitung
Advertisement 728x90

Desktop-Uhr mit IV-11 VFD-Röhren auf STM32F401 und DC-DC-Wandlern

Dieses Projekt realisiert eine stilvolle Desktop-Uhr mit Vakuum-Fluoreszenz-Anzeigen (VFD-Röhren) – konkret die IV-11. Der Mikrocontroller STM32F401CC steuert die dynamische Zeitanzeige über einen 8-Kanal-Treiber wie den TD62783AP (oder kompatiblen KID65783AP). Die Stromversorgung erfolgt über moderne DC-DC-Module: XL6009 hebt auf 45 V für die Anode an, während MP2307 USB-5 V auf präzise 1,5 V für den Heizfaden herunterregelt. Die integrierte Hardware-RTC sorgt für exakte Zeit ohne externe Module.

IV-11-Anforderungen: 1,5 V Heizfaden, ~50 V Anode. Entwickelt in Altium Designer mit produktionsreifen Gerber-Dateien.

Bauteile und Schaltplan

Wichtige Komponenten:

Google AdInline article slot
  • Mikrocontroller: STM32F401CC (Black Pill Board) mit integrierter RTC.
  • Anzeigetreiber: TD62783AP für Hochvolt-Segmentsteuerung.
  • Stromversorgung:

- XL6009: Boost-Wandler 5 V → 45 V.

- MP2307: Buck-Regler für stabile 1,5 V Heizfadenversorgung.

  • Anzeige: 4-stellige IV-11 VFD mit dynamischem Multiplexing.
  • Bedienung: Ein einziger Taster zur Zeiteinstellung (kurzer Druck: Minuten; langer Druck: Stunden).

Der Schaltplan nutzt GPIO für Segmente und Ziffern plus einen Timer für Tasterentprellung.

Google AdInline article slot

Firmware in STM32CubeIDE

Der Code basiert auf einer segment_lcd-Bibliothek für flüssige dynamische Anzeige. Hauptschleife: Abfrage RTC, Tasterbehandlung, Formatierung der Zeichenkette mit blinkendem Doppelpunkt (2-Sekunden-Periode) und Display-Update.

Vollständiger Code:

#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);
  }
}

// ... (weitere Funktionen: SystemClock_Config, MX_RTC_Init, MX_TIM10_Init, MX_GPIO_Init - siehe Original)

Uhr-Einrichtung und RTC-Konfiguration

Systemtakt: HSE 25 MHz → PLL 84 MHz (HCLK). LSE 32,768 kHz für RTC. Vorteiler: async 127, sync 255. RTC-Kalibrierung: Smooth-Cal mit -142 Impulskorrektur über 32 s.

Google AdInline article slot

Erststart-Initialisierung: Setzt 12:00 am 02.12.2026, Backup-Flag in BKP_DR0 (0x32F2). TIM10 (10 kHz) für Tasterverarbeitung.

GPIO: PB3-6,12-15 für Ziffern/Segmente (Push-Pull-Ausgang, niedrige Geschwindigkeit); PA2 für Taster (Eingang, kein Pull).

Zusammenbau und Debugging

  • Gerbers an Fabrik senden.
  • Über STM32CubeIDE (ST-Link) flashen.
  • USB-5 V anschließen.
  • Mit Taster Zeit einstellen.

Tipps: Billige TD62783AP-Fakes meiden – KID65783AP wählen. Für IV-6-Röhren Widerstand für 1,2 V Heizfaden hinzufügen.

Wichtige Highlights

  • TD62783AP-Dynamik spart GPIO-Pins.
  • Integrierte STM32-RTC – kein DS3231 nötig.
  • XL6009/MP2307-Module liefern stabile USB-Stromversorgung.
  • RTC-Kalibrierung erreicht ±142 Impulse/32 s Genauigkeit.
  • Code kompilierbar out-of-the-box; segment_lcd-Bibliothek vereinfacht VFD-Steuerung.

— Editorial Team

Advertisement 728x90

Weiterlesen