# 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.
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.

Důležité je pochopit, že fáze se měří v relativních jednotkách:
- 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:
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

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
Zatím žádné komentáře.