Jste zde

Hrátky s hradlovými poli – 6

V tomto pokračování začnu prvním z několika dílů, které ukáži úspěšné ročníkové práce našich studentů. Tentokrát to bude řešení PWM.

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

  1. frekvence 20 kHz
  2. přesnost nastavení výstupního pulzu 1 %
  3. ovládání střídy pomocí dvou tlačítek, nahoru a dolů
  4. ří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.

library IEEE;
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.

Jiří Král
jiri.kral@ roznovskastredni.cz

Downloads&Odkazy

Hodnocení článku: