Teorie
Pulzně šířková modulace slouží k vytváření periodických pravoúhlých průběhů s konstantní frekvencí a nastavitelnou střídou. Základem řešení je čítač.
Obrázek ukazuje, že na výstupu je nastaven v okamžiku nulování čítače a nulován při dosažení rozhodovací úrovně. Počet bitů čítače pak rozhoduje o počtu kroků pro nastavení střídy a spolu s frekvencí čítaných impulzů o opakovací frekvenci PWM. Komparační hodnota pak nastavuje střídu.
Zadání
S použitím hradlového pole vytvořte obvod realizující PWM s následujícími parametry
- frekvence 20 kHz
- přesnost nastavení výstupního pulzu 1 %
- ovládání střídy pomocí dvou tlačítek, nahoru a dolů
- řízení pomocí generátoru 50 MHz
Zadání realizujte pomocí procesů jako jeden VHDL soubor.
Řešení
Takto zadání vyřešil student Ladislav Hojgr – žák E2. Z blokového schématu je zřejmé, že k realizaci jsou použity tři čítače. Jeden slouží k přednastavení rozhodovací úrovně pomocí tlačítek nahoru, dolů. Samozřejmě musí být vyřešena otázka zastavení při dosažení minimální a maximální úrovně. Druhý čítač je volně běžící a slouží k vytvoření PWM rámce. Třetí čítač je typu předdělička a slouží k taktování PWM. Komparátor generuje signál shody. Na výstupu je pak klopný obvod, který je nastaven s přetečením druhého čítače a nulován signálem z komparátoru.
Realizaci v hradlovém poli pak představuje soubor pwm.vhd, který najdete v downloadu. Z výše uvedeného zadání vyplývá, že volně běžící čítač musí čítat v rozsahu 0 – 99 (binárně) a předdělička musí poskytovat signál o frekvenci 2 MHz. Čítač přednastavení je obousměrný s rozsahem 0 – 100 (binárně). Zastavení na maximu a minimu je řešeno samostatnými procesy.
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity PWM is
Port ( CLK : in STD_LOGIC;
Plus,Minus : in STD_LOGIC;
vystup,synchron : out STD_LOGIC;
vyst_nastaveni : out STD_LOGIC_VECTOR (6 downto 0));
end PWM;
architecture Behavioral of PWM is
signal nastaveni : STD_LOGIC_VECTOR (6 downto 0) := "1000000";
signal citac : STD_LOGIC_VECTOR (6 downto 0) := "0000000";
signal max : STD_LOGIC := "1";
signal min : STD_LOGIC := "1";
signal vyst : STD_LOGIC := "0";
signal rovnost : STD_LOGIC := "0";
signal preteceni : STD_LOGIC :="0";
signal preddeleni : STD_LOGIC_VECTOR (4 downto 0) := "00000";
signal vyst_preddel : STD_LOGIC := "0";
signal cas_tlacitek : STD_LOGIC_VECTOR (20 downto 0) := "000000000000000000000";
signal scan_tlacitek : STD_LOGIC := "0";
begin
process (CLK) --Předdělička
begin
if CLK="1" and CLK"event then
preddeleni <= preddeleni + 1;
if preddeleni = "11000" then
preddeleni <= (others => "0");
vyst_preddel <= "1";
else
vyst_preddel <= "0";
end if;
end if;
end process;
process (CLK) --Skenování tlačítek
begin
if CLK="1" and CLK"event then
if vyst_preddel = "1" then
cas_tlacitek <= cas_tlacitek +1;
if cas_tlacitek = "111101000010010000000" then
scan_tlacitek <= "1";
cas_tlacitek <= (others => "0");
else
scan_tlacitek <= "0";
end if;
end if;
end if;
end process;
process (CLK) --Čítač přednastavení
begin
if CLK="1" and CLK"event then
if Plus ="1" and max ="1" and vyst_preddel = "1" and scan_tlacitek = "1" then
nastaveni <= nastaveni + 1;
end if;
if Minus ="1" and min ="1" and vyst_preddel = "1" and scan_tlacitek = "1" then
nastaveni <= nastaveni - 1;
end if;
end if;
end process;
process (CLK) --Detekce maxima
begin
if CLK="1" and CLK"event then
if nastaveni = "1100101" then
max <="0";
else
max <="1";
end if;
end if;
end process;
process (CLK) -- Detekce minima
begin
if CLK="1" and CLK"event then
if nastaveni = "0000000" then
min <="0";
else
min <="1";
end if;
end if;
end process;
process (CLK) --Volnoběžný čítač
begin
if CLK="1" and CLK"event then
if vyst_preddel = "1" then
citac <= citac + 1;
if citac = "1100100" then
citac <= (others => "0");
end if;
end if;
end if;
end process;
process (CLK) -- Detekce přetečení
begin
if CLK="1" and CLK"event then
if citac = "0000000" then
preteceni <= "1";
else
preteceni <="0";
end if;
end if;
end process;
process (CLK) -- Detekce rovnosti
begin
if CLK="1" and CLK"event then
if citac = nastaveni then
rovnost <= "1";
else
rovnost <= "0";
end if;
end if;
end process;
process (CLK) --Výst. klopný obvod
begin
if CLK="1" and CLK"event then
if preteceni = "1" then
vyst <= "1";
end if;
if rovnost = "1" then
vyst <= "0";
end if;
end if;
end process;
synchron <= preteceni;
vyst_nastaveni <= nastaveni;
vystup <= vyst;
end Behavioral;
Pozn: Oproti zadání je vytvořen ještě výstup synchron. Ten byl přidán až při praktických zkouškách na osciloskopu. Ukázalo se, že pro zobrazení výstupního signálu při nastavení blížícím se krajním hodnotám je nutná externí synchronizace.
Závěr
Využití PWM je velmi rozsáhlé. Příště bude využito pro řízení otáček elektromotoru, ale to již ukážu, jak se dá pomocí hradlového pole realizovat otáčkoměr. Pokud by si někdo chtěl tento program vyzkoušet, najde v downloadu i potřebný ucf soubor.
jiri.kral@ roznovskastredni.cz
Downloads&Odkazy
- První díl seriálu - Hrátky s hradlovými poli - 1
- Druhý díl seriálu - Hrátky s hradlovými poli - 2
- Třetí díl seriálu - Hrátky s hradlovými poli - 3
- Čtvrtý díl seriálu - Hrátky s hradlovými poli - 4
- Čtvrtý díl seriálu - Hrátky s hradlovými poli - 5
- Soubory ke stažení - Hratky_6.zip
- Domovské stránky http://rs232.hw.cz/
- Domovské stránky Xilinx http://www.xilinx.com/products/spartan3/boards/SP3kitSS.pdf
- Domovské stránky Digilent http://www.digilentinc.com