====== Pokročilá funkce digitálních výstupů: PWM ====== Zkratka PWM skrývá slova Pulse-Width Modulation, v překladu "pulzně-šířková modulace". Tato funkce slouží pro generování obdélníkového signálu dané frekvence a střídy na digitálním výstupu. Typicky se PWM používá pro regulaci komponent napájených stejnosměrným proudem způsobem, který by u analogové regulace nebyl možný. ;;# Patron \\ Neuron \\ Axon ;;# Jako příklad použijeme 24 V⎓ elektromotor. Aby motor dosáhl plných otáček, vyžaduje napětí 24 V⎓. Pro 10 % otáček mu bude logicky postačovat pouze 2,4 V⎓ napětí. Při takto nízkém napětí by se ale motor nerozběhl kvůli vlivu tření a zátěže. Pokud by se pak přeci jen rozběhl, měl by jen velmi nízký točivý moment. Jde o jednu ze slabin analogové regulace. PWM lze použít **pouze na digitálních výstupech**, které mohou generovat pouze 0 V⎓ nebo 24 V⎓ napětí. Pro možnost regulace proto PWM generuje dvouhodnotový obdélníkový signál o dané frekvenci, čehož dosahuje periodickým přepínáním výstupu mezi ''ON'' a ''OFF''. Parametrem regulace je **střída signálu**, tj. délka ''ON'' a ''OFF'' signálů v rámci jedné periody. Pokud je střída signálu reprezentována procenty a její hodnota je 50 %, výstupní signál stráví 50 % časového úseku ve stavu ''ON'' a zbytek ve stavu ''OFF''. Při střídě 66% bude poměr 66 % ''ON'' a 34 % ''OFF'' apod. ===== 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. rozliseni - 1 strida [mervis] = ------------------- * strida [%] 100 Střída v [Mervis] může nabývat pouze hodnot v rozsahu 0 až -1. Tyto hodnoty nastavíte v programu. === Příklad 1 === rozlišení = 101 kroků (0-100% po 1% krocích) střída [%] = 34 rozliseni - 1 101 - 1 strida [mervis] = ------------------- * strida [%] = ------------------- * 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 === rozliseni = 6 steps (0-100 % po 20 % krocích) strida [%] = 40 % rozliseni - 1 6 - 1 strida [mervis] = ------------------- * strida [%] = -------------- * 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) Proměnné **PWM_Cycle** a **PWM_Prescale** jsou vyjádřené 16-bitovými slovy, nastavit lze proto pouze integerové 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 ) 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 ) 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í. ===== Nastavení PWM v Mervisu ===== **PWM_Cycle** a **PWM_Prescale** jsou konfigurační proměnné modulu Unipi a nelze je změnit zevnitř programu. V **levém panelu** vyberte Unipi modul. V jeho vlastnostech můžete vidět proměnné **PWM_Cycle** a **PWM_Prescale**. Nastavte je podle výsledku svých výpočtů - pro účely tohoto tutoriálu nastavíme **PWM_Cycle** = 99 a **PWM_Prescale** = 119. Tím nastavíme frekvenci na 4 kHz při rozlišení 101. {{ :en:sw:01-mervis:pwm-01-selecting-module.png?direct |}} Provedli jsme změnu v prototypu zařízení, což znamená, že jde o změnu konfigurace modulu PLC. Postup nahrání konfigurace naleznete v tutoriálu [[cs:sw:01-mervis:unipi-configure-module-hidden|Konfigurace modulu Unipi]]. {{ :en:sw:01-mervis:pwm-06-searching-for-ports.png?direct |}} Nyní zapněte **Mód ladění** a ve sloupci **Hodnota PLC** uvidíte současnou hodnotu PWM pro digitální výstupy 1.01-1.04. Pokud jste ji již dříve nezměnili, uvidíte zde nuly. Změňte hodnotu **PWM_1.01** na 50 a potvrďte kliknutím na {{:files:dialog-confirm_button_2.png?nolink|}} či stisknutím klávesy **ENTER**. Pro ověření můžeme k DO 1.01 připojit osciloskop a zkontrolovat podobu signálu. {{ :en:sw:01-mervis:pic_425_2.gif?direct |}} Jak ukazuje osciloskop, frekvence je 4 kHz při střídě signálu 50 %. ===== K čemu je magická konstanta 4,8 * 10^7 ===== Při výpočtech hodnoty **PWM_Prescale** využíváme konstantu 4,8 * 10^7. 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.