Retour à l'accueil

Contrôle de phase PWM sur STM32 : Méthodes de synchronisation des temporiseurs

L'article explique les méthodes pour un contrôle précis des phases de signaux PWM sur les microcontrôleurs STM32 par le biais de la synchronisation matérielle des temporiseurs. Trois approches sont considérées avec une analyse de la précision, des limitations et des exemples de code. Des recommandations pour le diagnostic de phase à l'aide d'un oscilloscope sont fournies.

Contrôle précis de phase PWM sur STM32 : Implémentation sans perte
Advertisement 728x90

Contrôle précis de la phase PWM sur STM32 : Méthodes matérielles sans pertes

Les microcontrôleurs STM32 ne disposent pas d'un registre direct pour ajuster la phase des signaux PWM matériels. Ce problème est critique lors de la synchronisation de plusieurs canaux dans des tâches nécessitant des décalages temporels stricts. Nous allons vous montrer comment implémenter un contrôle précis de la phase avec un impact minimal sur les performances et sans émulation logicielle.

Pourquoi ajuster la phase PWM ?

Le PWM matériel sur STM32 permet de régler facilement la fréquence et le rapport cyclique, mais les bibliothèques standard ne fournissent pas de moyen direct pour décaler la phase. Cette limitation devient critique dans les scénarios suivants :

  • Émuler un encodeur en quadrature à l'aide de deux signaux PWM avec un décalage fixe
  • Générer des paires sin/cos pour des mélangeurs en quadrature (décalage de 90°)
  • Contrôler des moteurs BLDC triphasés (décalage de 120° entre les canaux)
  • Synchroniser les injecteurs d'essence ou les bobines d'allumage dans les moteurs à combustion interne
  • Générer des signaux LO dans les récepteurs SDR
  • Réduire l'EMI en décalant artificiellement les phases dans les circuits d'alimentation

Sans synchronisation matérielle, les phases des signaux sont déterminées par des facteurs aléatoires : temps d'initialisation du timer, vitesse d'exécution du code, fréquence du bus. Cela rend la synchronisation prévisible impossible.

Google AdInline article slot

Bases théoriques : Architecture maître-esclave

L'idée clé est d'utiliser un timer (maître) comme source de synchronisation de référence pour un autre (esclave). La phase du timer esclave est ajustée via la valeur du comparateur du timer maître. Lorsque cette valeur est atteinte, le compteur du timer esclave est réinitialisé, créant le décalage temporel désiré.

![](./images/image-5.png)

Il est important de comprendre que la phase est mesurée en unités relatives :

Google AdInline article slot
  • 0° — signaux en phase
  • 180° — antiphase
  • 360° — période complète (équivalente à 0°)

La précision du décalage est déterminée par la résolution du timer. Pour une période de 1 ms et une horloge de bus de 84 MHz, l'erreur peut être aussi faible que 11,9 ns (1/84e6).

Méthodes d'implémentation pratiques

Méthode 0 : Inversion de polarité (décalage de 180°)

L'approche la plus simple consiste à basculer le bit CCxP dans le registre TIMx_CCER. Il s'agit d'une opération atomique qui ne nécessite pas de ressources supplémentaires. L'inconvénient est qu'il n'y a que deux états fixes (0° et 180°). C'est adapté à la modulation BPSK mais ne résout pas le besoin d'un ajustement fluide.

Méthode 1 : Ajustement du compteur par logiciel

L'approche naïve consiste à écrire directement dans le registre CNT du timer esclave :

Google AdInline article slot
bool pwm_phase_set_counter_adjust(uint8_t num, int32_t phase_us) {
    bool res = false;
    PwmHandle_t *Node = PwmGetNode(num);
    if(Node) {
        int32_t compare_value = TimerPhaseUsToCompareValue(Node->PhaseComparator.timer, phase_us);
        int32_t counter_base = (int32_t) timer_counter_get(Node->PhaseComparator.timer);
        int32_t value = counter_base + compare_value;
        res = timer_counter_set(Node->TimChan.timer, (uint32_t) value);
    }
    return res;
}

Cette méthode présente une erreur allant jusqu'à 3 µs à 1 kHz (0,29 %) due au temps d'exécution du code. Principaux inconvénients :

  • Nécessite d'arrêter le timer pendant l'écriture
  • Perturbe l'intégrité du signal au moment de la correction
  • Surcharge le CPU avec des interruptions

Méthode 2 : Synchronisation matérielle via maître-esclave

La solution optimale utilise le mécanisme de synchronisation des timers intégré. La configuration inclut :

  • Configurer le timer maître (TIM8) en mode génération de déclencheur sur correspondance du comparateur OC1 (TIM_TRGO_OC1)
  • Configurer le timer esclave (TIM4) pour réinitialisation sur déclencheur interne (TIM_TS_ITR3)
  • Définir le mode esclave sur réinitialisation (TIM_SLAVEMODE_RESET)

La configuration HAL ressemble à ceci :

const TimerConfig_t TimerConfig[] = {
    { 
        .num = TIMER_NUM_LO_BASE,
        .role = TIMER_ROLE_MASTER,
        .master_out_trigger = TIMER_MASTER_OUT_TRG_OC1,
    },
    { 
        .num = TIMER_NUM_LO,
        .role = TIMER_ROLE_SLAVE,
        .slave_input_trigger = TIMER_SLAVE_IN_TRIG_INTERNAL_TRIGGER_3,
        .slave_mode = TIMER_SLAVE_MODE_RESET,
    },
};

Avantages de la méthode :

  • Implémentation entièrement matérielle sans interruptions
  • Précision du décalage jusqu'au cycle d'horloge du bus (11,9 ns à 84 MHz)
  • Pas de glitches dans le signal de sortie pendant l'ajustement dynamique
  • Charge CPU minimale (seulement écriture dans le registre du comparateur du timer maître)

Limitations :

  • Nécessite une paire de timers supportant la connexion maître-esclave
  • Maximum 4 timers esclaves par maître (en raison du nombre de comparateurs)
  • Certains timers (6,7,10,11,13,14) ne supportent pas le mode esclave

Diagnostic de la phase avec un analyseur logique

La vérification de la configuration correcte se fait avec un oscilloscope ou un analyseur logique. Pour les tests :

  • Régler le timer maître (TIM8_CH1) à 1 kHz, rapport cyclique de 50 %
  • Régler le timer esclave (TIM4_CH2) avec un décalage de phase de 90°
  • Connecter les sondes aux broches correspondantes

Résultat attendu :

  • À décalage nul, le front montant du signal maître s'aligne avec le début de la période de l'esclave
  • À décalage de 90° pour une période de 1 ms, le signal esclave est décalé de 250 µs

![](./images/image-17.png)

Point clé : l'erreur est mesurée en cycles d'horloge du bus. Pour STM32F407 à bus 84 MHz, l'étape minimale est de 11,9 ns. En pratique à 1 kHz, cela donne une précision de 0,012 %.

Points clés

  • Le choix de la méthode dépend des exigences de précision : pour une erreur de 0,01 %, utiliser la synchronisation matérielle ; pour 0,3 %, l'ajustement logiciel est acceptable
  • Vérifier la compatibilité des timers : toutes les paires ne supportent pas la connexion maître-esclave (voir tableau dans RM0090)
  • Éviter d'arrêter les timers : la méthode matérielle n'interrompt pas la génération du signal pendant les changements de phase
  • Tenir compte des limites des dispositifs esclaves : un maître ne peut se connecter à plus de 4 timers esclaves
  • Diagnostiquer la phase avec un oscilloscope : la vérification visuelle est obligatoire pour les systèmes critiques

— Editorial Team

Advertisement 728x90

Lire ensuite