Chào các anh!
Hôm trước em có hỏi về lập trình PWM nhưng mà em nhầm mất, cái đồ án của em là phải điều chế SPWM tựa sin để điều khiển động cơ AC 1 pha. anh chị nào biết cách làm để điều chế ra SPWM thì hướng dẫn giúp em với ạ. em sắp phải nộp rồi mà chưa điều chế ra được,của em dùng bộ đếm 9 bít.
EM cảm ơn!
Hình dạng xung cần điều chế được như thế này:
Các anh giúp em với, em điều chế mãi mà chả ra. dây là bài của em, các anh xem sai ở chỗ nào
Hôm trước em có hỏi về lập trình PWM nhưng mà em nhầm mất, cái đồ án của em là phải điều chế SPWM tựa sin để điều khiển động cơ AC 1 pha. anh chị nào biết cách làm để điều chế ra SPWM thì hướng dẫn giúp em với ạ. em sắp phải nộp rồi mà chưa điều chế ra được,của em dùng bộ đếm 9 bít.
EM cảm ơn!
Hình dạng xung cần điều chế được như thế này:
Các anh giúp em với, em điều chế mãi mà chả ra. dây là bài của em, các anh xem sai ở chỗ nào
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity taoxungPWM is
generic (
pwm_max : integer := 8
);
port
(
clk,reset,enable : in std_logic ;
dutyCycle : in std_logic_vector (3 downto 0);
PWM: out std_logic
);
end taoxungPWM;
architecture Behavioral of taoxungPWM is
begin
process (clk,reset,enable)
variable counter : integer range 0 to pwm_max-1;
variable counter1 : integer range 0 to pwm_max-1;
begin
if (reset='1' )then
PWM <= '0' ;
elsif(clk'event and clk = '1') then
if (enable = '1') then
if (counter1 < dutyCycle ) then
counter := counter +1;
if (counter = 1) then
PWM <='1' ;
end if;
if (counter = 2) then
PWM <='0';
end if;
if (counter = 3 ) then
PWM <='1';
end if;
if (counter = 4 ) then
PWM <='1';
end if;
if (counter = 5 ) then
PWM <='0';
end if;
if (counter = 6 ) then
PWM <='0';
end if;
if (counter = 7 ) then
PWM <='1';
end if;
if (counter = 8 ) then
PWM <='1';
end if;
elsif (counter1 > dutyCycle ) then
counter := counter - 1;
if (counter = 7 ) then
PWM <='1';
end if;
if (counter = 6 ) then
PWM <='0';
end if;
if (counter = 5 ) then
PWM <='0';
end if;
if (counter = 4 ) then
PWM <='1';
end if;
if (counter = 3 ) then
PWM <='1';
end if;
if (counter = 2 ) then
PWM <='0';
end if;
if (counter = 1 ) then
PWM <='1';
end if;
end if;
--/////////////////////
if (counter1 = pwm_max-1) then
counter :=0;
else
counter1 := counter1 + 1;
end if;
if (counter = pwm_max-1) then
counter :=0;
else
counter := counter+1;
end if;
end if;
end if;
end process ;
end Behavioral;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity taoxungPWM is
generic (
pwm_max : integer := 8
);
port
(
clk,reset,enable : in std_logic ;
dutyCycle : in std_logic_vector (3 downto 0);
PWM: out std_logic
);
end taoxungPWM;
architecture Behavioral of taoxungPWM is
begin
process (clk,reset,enable)
variable counter : integer range 0 to pwm_max-1;
variable counter1 : integer range 0 to pwm_max-1;
begin
if (reset='1' )then
PWM <= '0' ;
elsif(clk'event and clk = '1') then
if (enable = '1') then
if (counter1 < dutyCycle ) then
counter := counter +1;
if (counter = 1) then
PWM <='1' ;
end if;
if (counter = 2) then
PWM <='0';
end if;
if (counter = 3 ) then
PWM <='1';
end if;
if (counter = 4 ) then
PWM <='1';
end if;
if (counter = 5 ) then
PWM <='0';
end if;
if (counter = 6 ) then
PWM <='0';
end if;
if (counter = 7 ) then
PWM <='1';
end if;
if (counter = 8 ) then
PWM <='1';
end if;
elsif (counter1 > dutyCycle ) then
counter := counter - 1;
if (counter = 7 ) then
PWM <='1';
end if;
if (counter = 6 ) then
PWM <='0';
end if;
if (counter = 5 ) then
PWM <='0';
end if;
if (counter = 4 ) then
PWM <='1';
end if;
if (counter = 3 ) then
PWM <='1';
end if;
if (counter = 2 ) then
PWM <='0';
end if;
if (counter = 1 ) then
PWM <='1';
end if;
end if;
--/////////////////////
if (counter1 = pwm_max-1) then
counter :=0;
else
counter1 := counter1 + 1;
end if;
if (counter = pwm_max-1) then
counter :=0;
else
counter := counter+1;
end if;
end if;
end if;
end process ;
end Behavioral;
Comment