fpganedir.com'da ara

fpganedir mail

   * Proje Hakkında

    * VHDL Kodu

VHDL Kod

PWM Üreteci

Programımızda, peryodu 20 ms olan bir adet   PWM sinyali üretmemiz gerekecek.

Biz  Geliştirme bourdumuzda 50 MHz’lik (20 ns) bir clk sinyali kullanacağımız. 20 ms periodunda bir sinyal üretmek için, programımızda 1 adet counter değişkeni tanımlayacağız ve Counter'ın üst sınırını ise (20ms/20ns) 1000 000 olarak belirleyeceğiz.

Counter üst sınırını  period adında bir sabitle tanımlayacağız.

constant period:integer:=1000000;
………………………..

process(clk,reset)
    begin
       if reset = '1' then
           pwm_reg<='0';
           counter<=0;
           duty_cycle<=0;
       elsif clk='1' and clk'event then
           pwm_reg<=pwm_next;
           counter<=counter_next;
          duty_cycle<=duty_cycle_next;
      end if;
end process;

counter_next<= 0 when counter = period else
                            counter+1;

DUTY CYCLE  Kontrolü

Kontrol sinyalimizin Duty Cycle'ı 1ms ile 2 ms olması gerekecek. Bundan dolayı programımızda dcycle_max ile dcycle_min adında iki sabit tanımlayacağız.

Pulse genişliğini PWM’in period zamanında değiştireceğiz. Bunun içinde programda tick adında bir değişken tanımlayacağız.

signal tick:std_logic;
………………………
tick<= '1' when counter= 0 else
'0';

Pulse'nin her anahtar basımında değişimi, programımızda tanımladığımız Duty_in adında bir sabit kadar olacak. Aynı zamanda Duty_in Motorumuzun dönüş hızını belirleyecek.

Servo Motor Dönüş Hızı

Biz programımızı servo motorun bir tam devrini 5 ms'de tamamlayacak şekilde ayarladık. Programımızda

Motor hız(s) = ((dcycle_max- dcycle_min)*period) / duty_in denklemini kullanırsak,

Duty_in= ((100000-50000)*20 ms)/5 s= 200 olarak  hesaplarız.

Bütün Kod

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity servo_pwm is
    Port ( clk           : in  STD_LOGIC;
               reset      : in  STD_LOGIC;
               button_l : in  STD_LOGIC; 
               button_r : in  STD_LOGIC;
               pwm       : out  STD_LOGIC);
   end servo_pwm;

architecture Behavioral of servo_pwm is
      constant period:integer:=1000000;
      constant dcycle_max:integer:=100000;
      constant dcycle_min:integer:=50000;
      constant duty_in:integer:=200;
      signal pwm_reg,pwm_next:std_logic;
      signal duty_cycle,duty_cycle_next:integer:=0;
      signal counter,counter_next:integer:=0;
      signal tick:std_logic;
    begin
    --register
         process(clk,reset)
              begin
                   if reset = '1' then
                        pwm_reg<='0';
                        counter<=0;
                        duty_cycle<=0;
                   elsif clk='1' and clk'event then
                         pwm_reg<=pwm_next;
                         counter<=counter_next;
                         duty_cycle<=duty_cycle_next;
                   end if;
             end process;

counter_next<= 0 when counter = period else
                           counter+1;
tick<= '1' when counter= 0 else
             '0';

--Duty Cycle değişimi
   process(button_l,button_r,tick,duty_cycle)
        begin
             duty_cycle_next<=duty_cycle;
              if tick='1' then
                   if button_l ='1' and duty_cycle >dcycle_min then
                          duty_cycle_next<=duty_cycle-duty_in;
                   elsif button_r ='1' and duty_cycle < dcycle_max then
                          duty_cycle_next<=duty_cycle+duty_in;
                  end if;             
            end if;                           
      end process;
--Buffer
pwm<=pwm_reg;    
pwm_next<= '1' when counter < duty_cycle else
                         '0';   
end Behavioral;

 

 

Anasayfa | Fpga | VHDL | VHDL Sözlüğü | Embedded Sistem | Android | Sayısal Tasarım | Simulasyon | PCB | Örnekler | Forum | İletişim
Copyright © 2010-2013 FPGAnedir. All Rights Reserved.