====== Výpočet hodnot parametrů pro PWM ====== {{ :files:img_warning-line_b.png?nolink |}} {{ :en:hw:08_safety-instructions_pseudo-ISO-7010-info.png?nolink |(i)}} **Poznámka:** \\ V tomto návodu se počítají hodnoty **PWM_Cycle** a **PWM_Prescale**, které používá Mervis. Pokud s mervis nepracujete, potom se v tomto návodu dozvíte pouze o základních principech PWM na Unipi zařízeních. ===== Výběr frekvence ===== Jedním z parametrů, který je třeba nastavit, je frekvence PWM, která musí odpovídat Vašemu regulovanému systému. Čím pomalejší Váš systém je, tím nižší musí frekvence být a opačně. Vysvětleno na příkladu bojleru - ohřev velké nádrže s vodou na požadovanou teplotu zabere dlouhý časový úsek, vysoká frekvence regulace proto není potřeba. Zde budou stačit pouhé desetiny či setiny hertzu. Pro regulace LED diody ale budeme potřebovat frekvenci alespoň 100 Hz, nižší frekvence by totiž byly viditelné pouhým okem. Dalším parametrem ke zvážení je prvek, který je mezi stavy ''ON'' a ''OFF'' přepínán. Pokud jde o mechanické relé, vysoká frekvence by jej mohla zničit. U SSR relé, MOSFETu či IGBT tranzistoru lze naopak použít kilohertzové až megahertzové frekvence (nezapomeňte důkladně prostudovat technické parametry dané komponenty). U produktů Unipi je frekvence určována nastavením rozlišení. Viz níže. ===== Rozlišení PWM ===== Druhým parametrem PWM je **rozlišení**. Tato hodnota indikuje, **na kolik kroků** chceme regulaci rozdělit. Pokud je rozlišení 3, můžeme nastavit tři hodnoty střídy - 0 %, 50 % a 100 %. U rozlišení 11 pak můžeme střídu v rozsahu 0-100 % nastavovat po 10 % krocích. Maximální možné rozlišení u kontrolérů Unipi činí 65536 kroků. ===== Střída signálu ===== Střída signálu, jak bylo řečeno výše, reprezentuje samotnou hodnotu regulace. Nejčastěji se setkáte se střídou vyjádřenou v procentech času ''ON'' v souvislosti s jeho periodou. V Mervisu je ale **střída signálu vyjádřena hodnotou rozlišení**. Ukážeme si, jak tuto hodnotu vypočítat. rozlišení - 1 Střída [mervis] = ------------------- * střída [%] 100 {{ :files:img_warning-line_b.png?nolink |}} {{ :en:hw:09_safety-instructions_pseudo-ISO-7010-attention.png?nolink |(!)}} **Upozornění:** \\ Střída v [Mervis] může nabývat pouze hodnot v rozsahu <0 až (rozlišení - 1)>. Tyto hodnoty nastavíte v programu. === Příklad 1 === Rozlišení = 101 kroků (0-100% po 1% krocích) Střída [%] = 34 rozlišení - 1 101 - 1 Střída [mervis] = ------------------- * střída [%] = ------------------- * 34 = 34 100 100 Pro rozlišení 101 kroků a žádanou střídu 34 % je třeba v Mervisu nastavit střídu na hodnotu **34**. To bylo poměrně jednoduché, nyní proto zkusíme něco složitějšího. === Příklad 2 === Rozlišení = 6 kroků (0-100 % po 20 % krocích) Střída [%] = 40 % rozlišení - 1 6 - 1 Střída [mervis] = ------------------- * střída [%] = -------------- * 40 = 2 100 100 Pro rozlišení 6 kroků a žádanou střídu 40 % je třeba v Mervisu nastavit hodnotu střídy na **2**. ===== Výpočet konfiguračních parametrů Mervisu ===== **Frekvenci** a **rozlišení** nelze nastavit přímo v Mervisu. Proměnné pro konfiguraci PWM v Mervisu jsou označeny jako **PWM_Cycle** a **PWM_Prescale**, a jejich hodnoty je třeba vypočítat podle žádaného **rozlišení** a **frekvence**. PWM_Cycle = resolution - 2 4.8 * 10^7 PWM_Prescale = ------------------------------- - 1 frekvence * ( rozlišení - 1) {{ :files:img_warning-line_b.png?nolink |}} {{ :en:hw:08_safety-instructions_pseudo-ISO-7010-info.png?nolink |(i)}} **Poznámka:** \\ Proměnné **PWM_Cycle** a **PWM_Prescale** jsou vyjádřené 16-bitovými slovy, nastavit lze proto pouze hodnoty 0 - 65535. Pokud je výsledkem Vašeho výpočtu reálné číslo, je třeba jej buď zaokrouhlit nebo změnit parametry **frekvence** či **rozlišení**. Alternativně je možné hodnoty **rozlišení** a **frekvence** získat z hodnot **PWM_Cycle** a **PWM_Prescale** pomocí následujících rovnic: Rozlišení = PWM_Cycle + 2 4.8 * 10^7 Frekvence = ---------------------------------------- ( PWM_Cycle + 1) * (PWM_Prescale + 1) === Příklad 1 === Rozlišení = 11 (střída signálu 0-100 % s 10 % kroky) Frekvence = 4 kHz PWM_Cycle = rozlišení - 2 = 11 - 2 = 9 4.8 * 10^7 4.8 * 10^7 PWM_Prescale = ------------------------------- - 1 = --------------------- - 1 = 1199 frekvence * ( rozlišení - 1) 4000 * ( 11 - 1 ) === Příklad 2 === Rozlišení = 41 (krok 2,5%) Frekvence = 0.1 Hz PWM_Cycle = rozlišení - 2 = 41 - 2 = 39 4.8 * 10^7 4.8 * 10^7 PWM_Prescale = ------------------------------- - 1 = ------------------- - 1 = 119999999 frekvence * ( rozlišení - 1) 0.1 * (41 - 1 ) {{ :files:img_warning-line_b.png?nolink |}} {{ :en:hw:09_safety-instructions_pseudo-ISO-7010-attention.png?nolink |(!)}} **Upozornění:** \\ Jak můžete vidět, při daném **rozlišení** a **frekvenci** je hodnota **PWM_Prescale** větší než možné maximum 65535. Musíme proto zvětšit hodnotu **frekvence**, **rozlišení** či **oboje**. === Příklad 3 === Rozlišení = 10001 (krok 0,01 %) Frekvence = 0.1 Hz PWM_Cycle = rozlišení - 2 = 10001 - 2 = 9999 4.8 * 10^7 4.8 * 10^7 PWM_Prescale = ------------------------------- - 1 = ------------------------- - 1 = 47999 frekvence * ( rozlišení - 1) 0.1 * (10001 - 1 ) {{ :files:img_warning-line_b.png?nolink |}} {{ :en:hw:08_safety-instructions_pseudo-ISO-7010-info.png?nolink |(i)}} **Poznámka:** \\ Při zvýšeném rozlišení získáme nižší frekvenci a obráceně. Pro vysokofrekvenční PWM musíme obětovat část rozlišení. ===== K čemu je magická konstanta 4,8 x 10^7 ===== Při výpočtech hodnoty **PWM_Prescale** využíváme konstantu 4,8 x 107. Konstanta představuje 48 MHz zdroj pro interní časovače/čítače, které se společně s PWM_Prescale a PWM_Count starají o nastavení požadované frekvence.