Powrót do strony głównej

Zegary na VLI IV-11 i STM32F401: schemat i kod

Projekt zegara biurkowego wykorzystuje VLI IV-11 z mikrokontrolerem STM32F401CC. Zaimplementowano dynamiczne sterowanie indykacją, sprzętowy RTC z kalibracją i zasilanie z USB przez moduły DC-DC. Pełny kod i schemat do odtworzenia.

Retro-zegary IV-11 na STM32: pełny przewodnik po montażu
Advertisement 728x90

Zegar stołowy z lampami VFD IV-11 na STM32F401 i przetwornicach DC-DC

Projekt realizuje zegar stołowy z wykorzystaniem lamp próżniowo-luminescencyjnych (VFD) IV-11. Mikrokontroler STM32F401CC zarządza dynamicznym wyświetlaniem czasu poprzez 8-kanałowy sterownik TD62783AP (lub odpowiednik KID65783AP). Zasilanie jest tworzone przez nowoczesne moduły DC-DC: XL6009 dla napięcia anodowego 45 V i MP2307 dla żarzenia 1,5 V z USB 5 V. Sprzętowy RTC mikrokontrolera zapewnia precyzyjny chód czasu bez zewnętrznych modułów.

Wymagania zasilania dla IV-11: żarzenie 1,5 V, anoda ~50 V. Schemat został zaprojektowany w Altium Designer, płytka wytworzona na podstawie plików Gerber.

Komponenty i schemat

Kluczowe elementy:

Google AdInline article slot
  • Mikrokontroler: STM32F401CC (Black Pill) ze sprzętowym RTC.
  • Sterownik wyświetlaczy: TD62783AP do wysokonapięciowego sterowania segmentami.
  • Zasilanie:

- XL6009: przetwornica podwyższająca 5 V → 45 V.

- MP2307: obniżająca dla precyzyjnego 1,5 V żarzenia.

  • Wyświetlanie: 4 cyfry IV-11, dynamiczne multipleksowanie.
  • Sterowanie: przycisk do ustawiania czasu (krótkie naciśnięcie — minuty, długie — godziny).

Schemat obejmuje GPIO dla segmentów i cyfr, timer do eliminacji drgań przycisku.

Google AdInline article slot

Oprogramowanie na STM32CubeIDE

Kod wykorzystuje bibliotekę segment_lcd do dynamicznego wyświetlania. Główna pętla: odczyt RTC, obsługa przycisków, formowanie ciągu czasu z miganiem kropki (okres 2 s), wyświetlanie na indykatorze.

Pełny kod:

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

// ... (pozostałe funkcje: SystemClock_Config, MX_RTC_Init, MX_TIM10_Init, MX_GPIO_Init - patrz oryginał)

Konfiguracja taktowania i RTC

Częstotliwość systemowa: HSE 25 MHz → PLL 84 MHz (HCLK). LSE 32,768 kHz dla RTC. Predzielniki: asynchroniczny 127, synchroniczny 255. Kalibracja RTC: smooth calibration z korekcją -142 impulsów na 32 s.

Google AdInline article slot

Inicjalizacja przy pierwszym uruchomieniu: ustawienie 12:00 12.02.2026, znacznik w BKP_DR0 (0x32F2). Timer TIM10 (10 kHz) do obsługi przycisków.

GPIO: PB3-6,12-15 — cyfry/segmenty (output PP, low speed); PA2 — przycisk (input, no pull).

Montaż i debugowanie

  • Załaduj Gerber do produkcji.
  • Wgraj oprogramowanie w STM32CubeIDE (ST-Link).
  • Podłącz USB 5 V.
  • Ustaw czas przyciskiem.

Specyfiki: unikaj podróbek TD62783AP, używaj KID65783AP. Dla IV-6 dodaj rezystor w obwodzie żarzenia (1,2 V).

Co ważne

  • Dynamiczne wyświetlanie przez TD62783AP minimalizuje liczbę GPIO.
  • Sprzętowy RTC STM32 eliminuje potrzebę DS3231.
  • Moduły DC-DC XL6009/MP2307 zapewniają stabilne zasilanie z USB.
  • Kalibracja RTC koryguje precyzję (±142 imp/32s).
  • Kod gotowy do kompilacji, biblioteka segment_lcd upraszcza sterowanie VFD.

— Editorial Team

Advertisement 728x90

Czytaj dalej