Zpět na domů

Řízení fáze PWM na STM32: metody synchronizace časovačů

Článek vysvětluje metody přesného řízení fází PWM-signálů na mikrokontrolérech STM32 prostřednictvím hardwarové synchronizace časovačů. Jsou zváženy tři přístupy s analýzou přesnosti, omezení a příklady kódu. Uvedena doporučení pro diagnostiku fáze pomocí osciloskopu.

Přesné řízení fáze PWM na STM32: realizace bez ztrát
Advertisement 728x90

# Přesné řízení fáze PWM na STM32: hardwarové metody bez ztrát

Na mikrokontrolérech STM32 chybí přímý registr pro regulaci fáze hardwarového PWM signálu. Tento problém je kritický při synchronizaci více kanálů v úlohách vyžadujících striktní časové posuny. Vysvětlíme, jak realizovat přesné řízení fáze s minimálním vlivem na výkon a bez softwarové emulace.

Proč regulovat fázi PWM?

Hardwarový PWM na STM32 umožňuje snadno nastavovat frekvenci a duty cycle, ale standardní knihovny neposkytují přímý způsob posunu fáze. Toto omezení se stává kritickým v následujících scénářích:

  • Emulace kvadraturního enkodéru přes dva PWM signály s fixním posunem
  • Tvorba páru sin/cos pro kvadraturní směšovače (posun 90°)
  • Řízení třífázových BLDC motorů (posun 120° mezi kanály)
  • Synchronizace benzinových vstřikovačů nebo zapalovacích svíček ve spalovacích motorech
  • Generování LO signálu v SDR přijímačích
  • Snížení EMI díky umělému rozladění fází v napájecích obvodech

Bez hardwarové synchronizace je fáze signálů určena náhodnými faktory: časem inicializace timerů, rychlostí provádění kódu, frekvencí sběrnice. To znemožňuje předvídatelnou synchronizaci.

Google AdInline article slot

Teoretický základ: master-slave architektura

Klíčový nápad spočívá v použití jednoho timeru (master) jako referenčního zdroje synchronizace pro druhý (slave). Fáze slave timeru se reguluje přes hodnotu komparátoru master timeru. Při dosažení této hodnoty se sčítač slave timeru resetuje, čímž vznikne zadaný časový posun.

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

Důležité je pochopit, že fáze se měří v relativních jednotkách:

Google AdInline article slot
  • 0° — signály ve fázi
  • 180° — antifáze
  • 360° — plný perioda (ekvivalent 0°)

Přesnost posunu je určena rozlišovacím schopností timeru. Pro periodu 1 ms a taktovou frekvenci sběrnice 84 MHz může být chyba až 11,9 ns (1/84e6).

Praktické metody realizace

Metoda 0: Inverze polarity (posun 180°)

Nejjednodušší způsob — změna bitu CCxP v registru TIMx_CCER. Jedná se o atomovou operaci nevyžadující další zdroje. Nevýhoda — pouze dva fixní stavy (0° a 180°). Vhodné pro BPSK modulaci, ale neřeší úkol plynulé regulace.

Metoda 1: Softwarová úprava sčítače

Naivní přístup předpokládá přímé zápis do registru CNT slave timeru:

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

Tato metoda vykazuje chybu až 3 µs při frekvenci 1 kHz (0,29 %) kvůli času provádění kódu. Hlavní nevýhody:

  • Vyžaduje zastavení timeru během zápisu
  • Narušuje integritu signálu v okamžiku korekce
  • Zatěžuje CPU přerušeními

Metoda 2: Hardwarová synchronizace přes master-slave

Optimální řešení — využití vestavěného mechanismu synchronizace timerů. Nastavení zahrnuje:

  • Konfiguraci master timeru (TIM8) v režimu generování triggeru podle shody komparátoru OC1 (TIM_TRGO_OC1)
  • Nastavení slave timeru (TIM4) na reset podle interního triggeru (TIM_TS_ITR3)
  • Nastavení slave módu na reset (TIM_SLAVEMODE_RESET)

Konfigurace přes HAL vypadá takto:

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,
    },
};

Výhody metody:

  • Plně hardwarová realizace bez přerušení
  • Přesnost posunu až na takt sběrnice (11,9 ns při 84 MHz)
  • Žádné rušení výstupního signálu při dynamické nastavě
  • Minimální zátěž CPU (pouze zápis do registru komparátoru master timeru)

Omezení:

  • Vyžaduje pár timerů s podporou master-slave propojení
  • Maximálně 4 slave timery na jeden master (kvůli počtu komparátorů)
  • Některé timery (6,7,10,11,13,14) nepodporují slave režim

Diagnostika fáze pomocí logického analyzátoru

Kontrola správnosti nastavení se provádí osciloskopem nebo logickým analyzátorem. Pro test:

  • Nastavit master timer (TIM8_CH1) na 1 kHz, 50 % duty cycle
  • Nastavit slave timer (TIM4_CH2) s fázovým posunem 90°
  • Připojit sondy k odpovídajícím pinům

Očekávaný výsledek:

  • Při nulovém posunu se čelo master signálu shoduje s počátkem periody slave
  • Při 90° posunu se pro periodu 1 ms slave signál posune o 250 µs

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

Klíčový moment: chyba se měří v taktech sběrnice. Pro STM32F407 se sběrnicí 84 MHz je minimální krok 11,9 ns. V praxi při 1 kHz to dává přesnost 0,012 %.

Co je důležité

  • Výběr metody závisí na požadavcích na přesnost: pro chybu 0,01 % použijte hardwarovou synchronizaci, pro 0,3 % je přijatelná softwarová úprava
  • Kontrolujte kompatibilitu timerů: ne všechny páry podporují master-slave propojení (viz tabulku v RM0090)
  • Vyhněte se zastavování timerů: hardwarová metoda nepřerušuje generování signálu při změně fáze
  • Zohledněte omezení slave zařízení: na jeden master lze připojit max. 4 slave timery
  • Diagnostikujte fázi osciloskopem: vizuální kontrola je povinná při nastavování kritických systémů

— Editorial Team

Advertisement 728x90

Číst dál