홈으로 돌아가기

VLI IV-11과 STM32F401 시계: 회로도와 코드

마이크로컨트롤러 STM32F401CC와 VLI IV-11을 사용한 데스크톱 시계 프로젝트. 동적 표시 제어, 보정 포함 하드웨어 RTC, DC-DC 모듈을 통한 USB 전원 구현. 재현을 위한 전체 코드와 회로도.

STM32의 레트로 IV-11 시계: 전체 조립 가이드
Advertisement 728x90

STM32F401 기반 IV-11 VFD 튜브 데스크톱 시계

이 프로젝트는 진공 형광 표시관(VFD 튜브), 구체적으로 IV-11을 사용한 세련된 데스크톱 시계를 제작합니다. STM32F401CC 마이크로컨트롤러가 TD62783AP(또는 호환 KID65783AP) 같은 8채널 드라이버를 통해 동적 시간 표시를 처리합니다. 전원은 최신 DC-DC 모듈에서 공급받습니다: XL6009가 애노드용 45V로 부스트하고, MP2307이 USB 5V를 정밀한 1.5V 필라멘트 전원으로 스텝다운합니다. 온보드 하드웨어 RTC가 외부 모듈 없이 완벽한 시간을 유지합니다.

IV-11 사양: 1.5V 필라멘트, ~50V 애노드. Altium Designer로 설계되었으며 생산 준비 Gerber 파일 제공.

부품 및 회로도

주요 부품:

Google AdInline article slot
  • 마이크로컨트롤러: STM32F401CC (Black Pill 보드) 내장 RTC 탑재.
  • 디스플레이 드라이버: 고전압 세그먼트 제어를 위한 TD62783AP.
  • 전원 공급:

- XL6009: 부스트 컨버터 5V → 45V.

- MP2307: 안정적인 1.5V 필라멘트용 벅 레귤레이터.

  • 디스플레이: 동적 멀티플렉싱 4자리 IV-11 VFD.
  • 제어: 단일 버튼으로 시간 설정 (짧은 누름: 분; 긴 누름: 시).

회로도는 세그먼트와 디지트에 GPIO를 사용하며, 버튼 디바운싱을 위한 타이머 포함.

Google AdInline article slot

STM32CubeIDE 펌웨어

코드가 segment_lcd 라이브러리를 활용해 부드러운 동적 표시를 구현합니다. 메인 루프: RTC 폴링, 버튼 처리, 깜빡이는 콜론(2초 주기) 포함 시간 문자열 포맷팅, 디스플레이 업데이트.

전체 코드:

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

// ... (다른 함수: SystemClock_Config, MX_RTC_Init, MX_TIM10_Init, MX_GPIO_Init - 원본 참조)

시계 설정 및 RTC 구성

시스템 클럭: HSE 25 MHz → PLL 84 MHz (HCLK). RTC용 LSE 32.768 kHz. 프리스케일러: async 127, sync 255. RTC 보정: 32초당 -142 펄스 부드러운 보정.

Google AdInline article slot

최초 부팅 초기화: 2026/02/12 12:00 설정, BKP_DR0에 백업 플래그 (0x32F2). TIM10 (10 kHz)로 버튼 처리.

GPIO: PB3-6,12-15 디지트/세그먼트 (푸시풀 출력, 저속); PA2 버튼 (입력, 풀업 없음).

조립 및 디버깅

  • Gerber 파일 팹으로 전송.
  • STM32CubeIDE (ST-Link)로 플래시.
  • USB 5V 연결.
  • 버튼으로 시간 설정.

팁: 가짜 TD62783AP 피하고 KID65783AP 사용. IV-6 튜브의 경우 필라멘트 1.2V로 떨어뜨리는 저항 추가.

주요 특징

  • TD62783AP 동적 드라이브로 GPIO 핀 절약.
  • STM32 내장 RTC로 DS3231 불필요.
  • XL6009/MP2307 모듈로 안정적인 USB 전원 공급.
  • RTC 보정으로 32초당 ±142 펄스 정밀도.
  • 코드 즉시 컴파일; segment_lcd 라이브러리로 VFD 제어 간편.

— Editorial Team

Advertisement 728x90

다음 읽기