Retour à l'accueil

Horloges sur VLI IV-11 et STM32F401 : schéma et code

Projet d'horloge de bureau utilisant VLI IV-11 avec microcontrôleur STM32F401CC. Contrôle d'indication dynamique implémenté, RTC matériel avec calibration et alimentation USB via modules DC-DC. Code complet et schéma pour reproduction.

Horloges rétro IV-11 sur STM32 : guide d'assemblage complet
Advertisement 728x90

Horloge de bureau avec tubes VFD IV-11 sur STM32F401 et convertisseurs DC-DC

Ce projet réalise une élégante horloge de bureau utilisant des tubes à affichage fluorescent à vide (VFD), plus précisément les IV-11. Le microcontrôleur STM32F401CC gère l'affichage dynamique de l'heure via un pilote 8 canaux comme le TD62783AP (ou compatible KID65783AP). L'alimentation provient de modules DC-DC modernes : le XL6009 monte à 45 V pour l'anode, tandis que le MP2307 abaisse les 5 V USB à un filament stable de 1,5 V. L'horloge temps réel (RTC) intégrée assure une précision parfaite sans module externe.

Exigences IV-11 : filament 1,5 V, anode ~50 V. Schéma conçu dans Altium Designer avec fichiers Gerber prêts pour production.

Composants et schéma

Pièces principales :

Google AdInline article slot
  • Microcontrôleur : STM32F401CC (carte Black Pill) avec RTC intégré.
  • Pilote d'affichage : TD62783AP pour commande haute tension des segments.
  • Alimentation :

- XL6009 : convertisseur élévateur 5 V → 45 V.

- MP2307 : régulateur abaisseur pour filament stable à 1,5 V.

  • Affichage : IV-11 VFD 4 chiffres avec multiplexage dynamique.
  • Commandes : Un seul bouton pour réglage heure (appui court : minutes ; appui long : heures).

Le schéma utilise les GPIO pour segments et chiffres, plus un timer pour anti-rebonds du bouton.

Google AdInline article slot

Firmware dans STM32CubeIDE

Le code exploite une bibliothèque segment_lcd pour un affichage dynamique fluide. Boucle principale : interroge le RTC, gère les boutons, formate la chaîne d'heure avec deux-points clignotants (période 2 s), et met à jour l'affichage.

Code complet :

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

// ... (autres fonctions : SystemClock_Config, MX_RTC_Init, MX_TIM10_Init, MX_GPIO_Init - voir original)

Configuration de l'horloge et du RTC

Horloge système : HSE 25 MHz → PLL 84 MHz (HCLK). LSE 32,768 kHz pour RTC. Prédiviseurs : asynchrone 127, synchrone 255. Étalonnage RTC : calibration lisse avec correction -142 impulsions sur 32 s.

Google AdInline article slot

Init au premier démarrage : fixe 12:00 le 02/12/2026, drapeau backup dans BKP_DR0 (0x32F2). TIM10 (10 kHz) gère le traitement des boutons.

GPIO : PB3-6,12-15 pour chiffres/segments (sortie push-pull, vitesse faible) ; PA2 pour bouton (entrée, sans pull-up).

Assemblage et débogage

  • Envoyez les Gerber au fabricant.
  • Flashez via STM32CubeIDE (ST-Link).
  • Branchez USB 5 V.
  • Réglez l'heure avec le bouton.

Astuces : Évitez les TD62783AP contrefaits — optez pour KID65783AP. Pour tubes IV-6, ajoutez une résistance pour abaisser le filament à 1,2 V.

Points forts

  • Pilote dynamique TD62783AP économise les broches GPIO.
  • RTC STM32 intégré — pas besoin de DS3231.
  • Modules XL6009/MP2307 assurent une alimentation USB ultra-stable.
  • Étalonnage RTC atteint ±142 impulsions/32 s de précision.
  • Code compile directement ; bibliothèque segment_lcd simplifie le contrôle VFD.

— Editorial Team

Advertisement 728x90

Lire ensuite