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 파일 제공.
부품 및 회로도
주요 부품:
- 마이크로컨트롤러: STM32F401CC (Black Pill 보드) 내장 RTC 탑재.
- 디스플레이 드라이버: 고전압 세그먼트 제어를 위한 TD62783AP.
- 전원 공급:
- XL6009: 부스트 컨버터 5V → 45V.
- MP2307: 안정적인 1.5V 필라멘트용 벅 레귤레이터.
- 디스플레이: 동적 멀티플렉싱 4자리 IV-11 VFD.
- 제어: 단일 버튼으로 시간 설정 (짧은 누름: 분; 긴 누름: 시).
회로도는 세그먼트와 디지트에 GPIO를 사용하며, 버튼 디바운싱을 위한 타이머 포함.
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 펄스 부드러운 보정.
최초 부팅 초기화: 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
아직 댓글이 없습니다.