logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Realizacja układu PWM o dużej rozdzielczości na układzie GAL - czy to możliwe?

Marcin8051 15 Paź 2004 11:49 5720 20
REKLAMA
  • #1 914007
    Marcin8051
    Poziom 19  
    Posty: 512
    Pomógł: 6
    Ocena: 13
    Potrzebuje układ PWM o dużej rozdzielczości przynajmniej 64 który bedzie ystawiany boć przez podanie bitów wypełnienia na wejście równoległe a jeszcze lepiej jeśli bedzie startował z zerowym wypełnieniem i przez podanie np zbocza narastającego na nużke bedzie zwiekszał wypełnienie a na drógą zmniejszał. Czy jest to możliwe do zrealizowania na galu jeśli tak prosił bym o pomoc bo jestem w tym zielony.

    Widziałem taki układ wzrobiony w vhdl ale tamte scalaki są dość cieżkie do wstawienia do układu
  • REKLAMA
  • #2 914086
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    "... dużej rozdzielczości przynajmniej 64..." Co 64? Poziomy czy bity? Jeżeli ma mieć 64 poziomy (czyli w sumie 6 bitow to bardzo prosto zrobisz to na praktycznie dowolnym procesorze. Jedno ale, bo nie podałes też zżadnej częstotliwości z jaką chcesz to zmieniać. Ewentulanie weź procek z wbudowanym PWM sprzętowym (np. któryś AVR).
    Jeżeli chcesz mieć PWM 64 bity to kiepsko to widzę ( poziomów by było rzędu 10^19).
  • #3 914308
    Marcin8051
    Poziom 19  
    Posty: 512
    Pomógł: 6
    Ocena: 13
    chodzi mi o 64 poziomy czyli 6 bitów czestotliwość to minimum 10khz. Chciałem to zrobić na galu bo chyba sa mniejsze szanse że się powiesi i jest szybszy. Robiłem na 51 ale po pierwsze wyszło wolno a pozatym się wiesza.
  • REKLAMA
  • #4 914360
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    Trzeba by zrobić licznik 6 bitowy i komparator, jeżeli stan licznika jest mniejszy od liczby zadanej to na wyjście dajesz 1, a jezeli większy to na wyjście dajesz 0. Czyli powinno się spokojnie dać.
    No i pewnei będzie do tego potrzebny jakiś preskaler do licznika czy coś ale to już są szczegółowe problemy do rozwiązania.
  • #5 914854
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Na układzie GAL16V8 jak bym miał szacować, to może się uda zrobić z rozdzielczosicią 2 bitów.
  • #6 915206
    mzielin
    Poziom 22  
    Posty: 483
    Pomógł: 31
    Ocena: 16
    Da się jak najbardziej. Przy GAL16V8 tylko pięciobitowy, ale wykorzystując Xilinka, znacznie więcej. Tutaj masz link:
    http://www.hw.cz/products/gal_cd/pwm.htm
    Do tego wystarczy ATTiny15, spokojnie dostaniesz 8 bitów przy F>100 kHz
  • #7 915677
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    Na GALu raczej nie zrobisz zbyt wielkiego PWM.
    Do zrobienia calkiem niezlego PWM o dobrej rozdzielczosci doskonale nadaje sie n.p. XC9536 (XL) w obudowie PLCC44, a wiec latwej do uzycia dla amatora . Zrobisz na nim nawet kilka kanalow i to do czestotliwosci ( zaleznie od wersji ) nawet do 30MHz. Kostka taka kosztuje 1 dolara , a srodowisko ISE WebPack jest Free . Programator Jtag zrobisz sobie sam na 2X 74HC125. Procesory, nawet te ze sprzetowym PWM maja te wade, ze PWM jest troche skomplikowany ze wzgledu na uniwersalnosc jego budowy. Na CPLD mozesz sobie wykroic kilka kanalow PWM dokladnie takich jakie Ci sie spodobaja.
  • #8 916071
    PiRoman2
    Poziom 20  
    Posty: 337
    Pomógł: 22
    Ocena: 15
    Spokojnie zmieścisz w układzie GAL6001 (do kupinia tanio w "www.tvsat.com.pl"
  • REKLAMA
  • #9 918379
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    Wracajac do CPLD, wykonalem wlasnie podwojny 6-cio bitowy sterownik PWM dla Kolegi Marcin8051. Mozesz go zmiescic w ukladzie XC9536(XL) i jeszcze zostanie miejsce na taki trzeci kanal PWM, lub na debouncing przyciskow sterujacych. jesli uzyjesz XC9572(XL) to zmiescisz i debouncing i jeszcze z piec kanalow PWM. Przy kwarcu wiodacym 16MHZ uzyskasz czestotliwosc PWM wynoszaca 250kHz, a dla kwarcu 64MHZ uzyskasz 1MHz. ktory procek da Ci szesc kanalow PWM z taka czestotliwoscia za jedyne 2 dolary ( dla XC9572XL)?
    Ponizej zamieszczam dla zainteresowanych kod VHDL tego projekciku bez debouncingu klawiszy, ktory jest trywialny do zaimplementowania.
    
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    --------------------------------------------------------------------------------
    entity pwm is
        Port ( 
               clock : in std_logic;     -- zegar wyznaczajacy czestotliwosc PWM, n.p. dla 16MHz PWM bedzie 250kHz. 
               res : in std_logic;       -- kasuje liczniki i wyjscie pwm_out
               change1 : in std_logic;    -- rosnace zbocze zmienia wartosc licznika pwm_reg
               dir1 : in std_logic;       -- jesli = 0 to pwm_reg++, jesli = 1 to pwm_reg-- 
               pwm_out1 : out std_logic; -- wyjscie PWM
               change2 : in std_logic;    -- rosnace zbocze zmienia wartosc licznika pwm_reg
               dir2 : in std_logic;       -- jesli = 0 to pwm_reg++, jesli = 1 to pwm_reg-- 
               pwm_out2 : out std_logic); -- wyjscie PWM
    end pwm;
    --------------------------------------------------------------------------------
    architecture arch_pwm of pwm is
      signal pwm_cntr: std_logic_vector(5 downto 0);
      signal pwm_reg1: std_logic_vector(5 downto 0);
      signal pwm_reg2: std_logic_vector(5 downto 0);
    begin
      pwm_cntr_proc: process (clock,res)
      begin
        if res='1' then
          pwm_cntr<="000000";
        elsif rising_edge (clock) then
          pwm_cntr<=pwm_cntr + 1;
        end if;
      end process pwm_cntr_proc;
    --------------------------------------------------------------------------------
      pwm1_proc: process (change1, res) 
      begin
        if res='1' then 
          pwm_reg1<="000000";
        elsif rising_edge (change1) then
          if dir1='1' then  
            pwm_reg1<=pwm_reg1 + 1;
          else
            pwm_reg1<=pwm_reg1 - 1;
          end if;
        end if;
      end process pwm1_proc;
    ------------------------------------
      pwm1_out_proc: process (clock,res)
      begin
        if res='1' then
          pwm_out1<='0';
        elsif rising_edge (clock) then
          if (pwm_cntr > pwm_reg1) then
            pwm_out1<='1';
          else
            pwm_out1<='0';
          end if;
        end if;
      end process pwm1_out_proc;
    --------------------------------------------------------------------------------
      pwm2_proc: process (change2, res) 
      begin
        if res='1' then 
          pwm_reg2<="000000";
        elsif rising_edge (change2) then
          if dir2='1' then  
            pwm_reg2<=pwm_reg2 + 1;
          else
            pwm_reg2<=pwm_reg2 - 1;
          end if;
        end if;
      end process pwm2_proc;
    ------------------------------------
      pwm2_out_proc: process (clock,res)
      begin
        if res='1' then
          pwm_out2<='0';
        elsif rising_edge (clock) then
          if (pwm_cntr > pwm_reg2) then
            pwm_out2<='1';
          else
            pwm_out2<='0';
          end if;
        end if;
      end process pwm2_out_proc;
    end arch_pwm;
  • #10 918402
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    co w PWM w VHDL'u, przydało by się (a często konieczne) zabezpieczenie przed dekrementacją zera i inkrementacją 63
    jakoś nie podoba mie się scalak na 80 nogach z których wykorzystujemy 6
    jeśli zamiast guzików może być potencjometr to może tak: generator piły (może 555) na jedno wejście komparatora, na drugie suwak potencjometru podłączonego między + i masę? (potencjometr może być cyfrowy)
    zapytałbym jeszcze energoelektroników, podsuną gotowy scalaczek
  • REKLAMA
  • #11 918881
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    :arrow: Xitami,
    Przede wszystkiem kostka ma 44 piny, i na podwojny PWM uzywamy 8 z nich. Po odliczeniu zasilania i pinow Jtag pozostaje jeszcze okolo 24 piny. Aby nie marnowac ich mozna dolozyc sterownik wyswietlacza i dekoder klawiatury i jeszcze jakis piszczek, i juz mamy duzo lepsze wykorzystanie kostki. To tylko kwestia pomyslowosci. Ograniczen w inkrementacji i dekrementacji, jak i debouncingu klawiszy nie zawarlem celowo by potencjalny zainteresowany mial co robic, a ponadto nie wymagaj by w pol godziny zrobic caly projekt i go jeszcze przetestowac. To tylko przyklad, ktory mozna sobie dostosowac do wlasnych potrzeb.

    Wbrew pozorom niewielkie kostki cpld daja ogromne mozliwosci. Nie trzeba sie ich bac tylko dla tego ze nie sa procesorami. Nie jest to konkurencja tylko komplementacja mozliwosci procesorow.
  • #13 919014
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    I jeszcze pozwole sobie dodac, ze development kit zawiera plytke z kostka XC9572XL - 72 makrocele (3.3V), kostke z serii CoolRunnerII - 256 makrocel, soft do projektowania, ksiazke ( troche slabej jakosci, ale zawsze) i kabelek Jtag do programowania. Niestety soft dostarczany z kitem nie dziala bez update'u sciaganego z web'u. Jesli sie to juz sciagnie, wszystko dziala bardzo ladnie.
    Od Xilinx'a nie warto kupowac ani ukladow scalonych ani Kitu, bo doliczaja sobie 2 dolary za wrzucenie do paczki pojedynczego scalaka kosztujacego 1 dolar, a i koszty samej przesylki sa wyzsze niz koszt samego Kitu. Ten sam Kit i kostki Xilinx'a mozna zakupic po cenach nominalnych w firmie operujacej rowniez na terenie polski. By nie byc posadzonym o kryptoreklame, nazwe firmy podam wstecz: cemeM .
    Sa bardzo sympatyczni i solidni, choc szybkoscia faktycznie nie grzesza, ale to chyba wynika z tego iz sciagaja towar z za oceanu.
  • #14 919193
    Marcin8051
    Poziom 19  
    Posty: 512
    Pomógł: 6
    Ocena: 13
    Dziekuje za program niestety jestem w tym zupełnie zielony pytałem o gala bo widziałem prosty programator do nich ;).

    Czy mugłbym dostać opis pokolei co i skąd musze ściągnąć i zbudować żeby tego klocka zaprogramować ?

    Znalazłem program w vhdlu na pwm w eleptronice praktycznej 10/2003. Ae wystraszyłem sie bódowania programatora. Myślałem że na galu to mi troche łatwiej pujdzie.
  • #15 919274
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    Kabel do programowania CPLD, o ktorych wyzej dyskutowalismy jest - jak sadze - rownie prosty jak ten do GALow, a ponadto soft jest calkowicie FREE.
    ponizej jest pdf ze schematem kabla.
    Nie pamietam gdzie w sieci go znalazlem, wiec zalaczam jak znalazlem.
    Załączniki:
    • JTAG-Cable.pdf (18.62 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #16 922066
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    :arrow: xitami,
    Specjalnie dla Ciebie, ponizej jest wersja 6-bitowego sterownika PWM z "nieprzekrecalnymi" licznikami PWM, pelnym debouncingiem wejsc programujacych oraz trzema niezaleznymi kanalami.
    Wszystko to miesci sie w kostce XC9572(XL) i jeszcze zostalo miejsce na pare innych duperelkow jesli sa potrzebne. Koszt: okolo 2 dolarow.
    calosc pedzona jest kwarcem 16MHz a PWMy maja czestotliwosc 250kHz.
    Sorki za czasem mylace komentarze, ale juz nie chcialo mi sie ich porzadkowac.
    Pozdrawiam, yego.

    
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    -------------------------------------------------------------------------------
    entity debounce is
        Port ( db_clk     : in std_logic;     -- a 10 ms debounce clock
               db_res     : in std_logic;     -- 
               db_key_in  : in std_logic;     -- raw ( bouncing ) key input ; a key is active LO
               db_key_out : out std_logic);   -- debounced key out (pulsed ____------------_______  )
    end debounce;
    -------------
    architecture debounce_arch of debounce is
      signal k00: std_logic;
      signal k01: std_logic;
      signal k02: std_logic;
    begin
      debounce_proc: process (db_clk,db_res)
      begin
        if db_res='0' then
          k00<='0';
          k01<='0';
          k02<='0';
        elsif rising_edge (db_clk) then
          k02<=k01;
          k01<=k00;
          k00<=not db_key_in;
        end if;
      end process debounce_proc;
      db_key_out<=k00 and k01 and k02;
    end debounce_arch;
    -- ===============================================================================
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    --------------------------------------------------------------------------------
    entity pwm is
        Port ( pwm_cntr : in std_logic_vector ( 5 downto 0 );
               pwm_clk : in std_logic;       -- zegar PWM, n.p. dla 16MHz PWM bedzie 250kHz. 
               pwm_res : in std_logic;       -- kasuje liczniki i wyjscie pwm_out
    --           pwm_db_change : in std_logic;    -- rosnace zbocze zmienia wartosc licznika pwm_reg
               pwm_change : in std_logic;    -- klawisz change
    --           pwm_db_dir : in std_logic;       -- jesli = 0 to pwm_reg++, jesli = 1 to pwm_reg-
               pwm_dir : in std_logic;       -- klawisz dir
               pwm_cntr17 : in std_logic;       -- zergar 10ms 
               pwm_out : out std_logic);     -- wyjscie PWM
    end pwm;
    --------
    architecture arch_pwm of pwm is
    	COMPONENT debounce
    	PORT(
    		db_clk : IN std_logic;
    		db_res : IN std_logic;
    		db_key_in : IN std_logic;          
    		db_key_out : OUT std_logic
    		);
    	END COMPONENT;
    -----------------
      signal pwm_reg: std_logic_vector(5 downto 0);
      signal pwm_db_change : std_logic;
      signal pwm_db_dir : std_logic;
    begin
    	Inst_debounce1: debounce PORT MAP(
    		db_clk => pwm_cntr17,
    		db_res => pwm_res,
    		db_key_in => pwm_change,
    		db_key_out => pwm_db_change
    	);
    	Inst_debounce2: debounce PORT MAP(
    		db_clk => pwm_cntr17,
    		db_res => pwm_res,
    		db_key_in => pwm_dir,
    		db_key_out => pwm_db_dir
    	);
    
      pwm_proc: process (pwm_db_change, pwm_res) 
      begin
        if pwm_res='0' then 
          pwm_reg<="000000";
        elsif rising_edge (pwm_db_change) then
          if pwm_db_dir='1' then
            if pwm_reg /= 63 then  
              pwm_reg<=pwm_reg + 1;
            else
              pwm_reg<=pwm_reg;
            end if;
          elsif pwm_reg /= 0 then
            pwm_reg<=pwm_reg - 1;
          else
            pwm_reg<=pwm_reg;
          end if;
        end if;
      end process pwm_proc;
    -----------------------
      pwm_out_proc: process (pwm_clk,pwm_res)
      begin
        if pwm_res='0' then
          pwm_out<='0';
        elsif rising_edge (pwm_clk) then
          if (pwm_cntr > pwm_reg) then
            pwm_out<='1';
          else
            pwm_out<='0';
          end if;
        end if;
      end process pwm_out_proc;
    end arch_pwm;
    -- ===============================================================================
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    --------------------------------------------------------------------------------
    entity multipwm is
        Port ( 
               clock : in std_logic;     -- glowny zegar PWM, n.p. dla 16MHz PWM bedzie 250kHz. 
               reset : in std_logic;     -- kasuje liczniki i wyjscia pwm_out
               change1 : in std_logic;   -- rosnace zbocze zmienia wartosc licznika pwm_reg
               dir1 : in std_logic;      -- jesli = 0 to pwm_reg++, jesli = 1 to pwm_reg-- 
               out1 : out std_logic;     -- wyjscie PWM
               change2 : in std_logic;   -- rosnace zbocze zmienia wartosc licznika pwm_reg
               dir2 : in std_logic;      -- jesli = 0 to pwm_reg++, jesli = 1 to pwm_reg-- 
               out2 : out std_logic;     -- wyjscie PWM
               change3 : in std_logic;   -- rosnace zbocze zmienia wartosc licznika pwm_reg
               dir3 : in std_logic;      -- jesli = 0 to pwm_reg++, jesli = 1 to pwm_reg-- 
               out3 : out std_logic);     -- wyjscie PWM
    end multipwm ;
    --------------
    architecture arch_multipwm of multipwm is
      component pwm 
      port(  
               pwm_cntr : in std_logic_vector ( 5 downto 0 );
               pwm_clk : in std_logic;     -- zegar PWM, n.p. dla 16MHz PWM bedzie 250kHz. 
               pwm_res : in std_logic;       -- kasuje liczniki i wyjscie pwm_out
               pwm_change : in std_logic;    -- rosnace zbocze zmienia wartosc licznika pwm_reg
               pwm_dir : in std_logic;       -- jesli = 0 to pwm_reg++, jesli = 1 to pwm_reg-- 
               pwm_cntr17 : in std_logic;       -- zegar 10ms 
               pwm_out : out std_logic); -- wyjscie PWM
      end component;                    
      signal counter : std_logic_vector(17 downto 0);
    begin                                    -- one counter for all PWMs
      counter_proc: process (clock,reset)
      begin
        if reset='0' then
          counter<="000000000000000000";
        elsif rising_edge (clock) then
          counter<=counter + 1;
        end if;
      end process counter_proc;
    --------------------------------------------------------------------------------
    	Inst_pwm1: pwm PORT MAP(
    		pwm_cntr => counter(5 downto 0),
    		pwm_clk => clock,
    		pwm_res => reset,
    		pwm_change => change1,
    		pwm_dir => dir1,
          pwm_cntr17 => counter(17),
    		pwm_out => out1);
    ------------------------------------
    	Inst_pwm2: pwm PORT MAP(
    		pwm_cntr => counter(5 downto 0),
    		pwm_clk => clock,
    		pwm_res => reset,
    		pwm_change => change2,
    		pwm_dir => dir2,
          pwm_cntr17 => counter(17),
    		pwm_out => out2);
    ------------------------------------
    	Inst_pwm3: pwm PORT MAP(
    		pwm_cntr => counter(5 downto 0),
    		pwm_clk => clock,
    		pwm_res => reset,
    		pwm_change => change3,
    		pwm_dir => dir3,
          pwm_cntr17 => counter(17),
    		pwm_out => out3);
    ------------------------------------
    end arch_multipwm;
  • #17 922083
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    łe w VHDL'u
    łe tylko 250 kHz
    łe tylko 6-bitowe
    łe każdy sterowany osobno osobno
    łe wszystkie mają wspólny zegar, a może jeszcze guziczek który by robił z tego trzy fazy (120 stopni)
    lipa...... ;-)

    a teraz troszkę bardziej serio.
    bardzo dziękuję, do nauk bardzo przydają się proste przykłady.
    ja wybrałem veriloga (vhdl na mój gust za bardzo "rozgadany"), jaką to zajmuje część kości? czy wiesz może jaką maksymalną częstotliwością może to być napędzane?
    i jeszcze we fragmencie kodu czy ta potrzebne jest to po else (czemu?) czy tak wyszło?
    elsif pwm_reg /= 0 then
    . pwm_reg<=pwm_reg - 1;
    else
    . pwm_reg<=pwm_reg;
    end if;

    Pozdrowionka
  • #18 922490
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    Witaj,

    w zalaczniku znajdziesz pliki raportu z fittera (przemianuj summary.txt na summary.html ), gdzie jest podana zajetosc zasobow.

    Post Fit Timing mowi ze "Minimum period: 10.700ns (Maximum frequency: 93.458MHz)". Na wszelki wypadek zdzielilbym to przez 2 to moze wyjdzie realistyczna wartosc, tak wiec 50MHz zegara wydaje sie byc OK.

    Ten fragment kodu , ktory wytlusciles rzeczywiscie nie jest potrzebny, ale znalazl sie tam z kronikarskiego obowiazku i dla tego, ze nie zabiera zasobow, a czyni kod troche bardziej czytelnym.

    Co do jezyka, to nigdy nie mialem dosc czasu by nauczyc sie wszystkiego co bym chcial w takim stopniu jak bym chcial, stad tez uzywam VHDL a nie Verilogu. jak mawiaja wyspiarze "Noone's perfect" :((

    Pozdrawiam, yego.
    Załączniki:
    • multipwm.txt (6.98 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • summary.txt (7.31 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #20 924101
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    Nawet nie wiedzialem, ze bracia Pepiki robia takie fajne rzeczy, choc przyznac musze, ze 1000KCs (jakies 33 Euro) to troche duzo za plytke tej funkcjonalnosci i jakosci. Jak wyzej pisalem kit Xilinxa ma na sobie duzo wiecej, a kosztuje $49. Przy zamowieniu od firmy "cemem" :D nie placimy za dostawe, a wiec $49 to wszystko co placimy.
    Jednakowoz sam portal z Czech jest bardzo przyjemny, choc nic z niego nie kumam :(.
  • #21 924162
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    dawno dawno temu nie za siedmioma górami, siedmioma morzami tylko u nas w kraju, najlepszymi czasopismami dotyczącymi elektroniki i mikrokomputerów były czeskie (czerwone i niebieskie) i rosyjskie miesięczniki RADIO, okazuje się że jeszcze trochę rozumiem, oj jak miło powspominać, ale już kończę bo mi się woda na ziułka zagotowała. ;)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy możliwości realizacji układu PWM o wysokiej rozdzielczości (minimum 64 poziomy, czyli 6 bitów) z częstotliwością co najmniej 10 kHz na układzie GAL. Propozycje wskazują, że na typowym GAL16V8 można uzyskać jedynie niską rozdzielczość (około 2 bitów), co jest niewystarczające. Zalecane jest użycie układów CPLD, takich jak Xilinx XC9536(XL) lub XC9572(XL), które pozwalają na implementację 6-bitowego PWM z częstotliwościami rzędu 250 kHz do 1 MHz przy kwarcu 16 MHz lub 64 MHz. Wskazano, że CPLD oferują większą elastyczność, możliwość implementacji wielu kanałów PWM oraz dodatkowych funkcji, jak debouncing przycisków. Dostępne są darmowe narzędzia programistyczne (ISE WebPack) oraz proste programatory JTAG, które można zbudować samodzielnie. Przykładowy kod VHDL sterownika PWM z debouncingiem i obsługą kilku kanałów został udostępniony, co ułatwia rozpoczęcie pracy. Wskazano również na alternatywne rozwiązania sprzętowe, takie jak mikrokontrolery AVR z wbudowanym PWM, jednak ich stabilność i szybkość mogą być gorsze niż CPLD. Podsumowując, realizacja PWM o dużej rozdzielczości na GAL jest ograniczona, natomiast CPLD Xilinx stanowią praktyczne i ekonomiczne rozwiązanie dla tego typu aplikacji.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA