Thông báo

Collapse
No announcement yet.

điều khiển DC bước bằng VHDL

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • điều khiển DC bước bằng VHDL

    em viết chương trình điều khiển DC bước bằng VHDL, nhưng thầy nói lý luận chưa chặt chẽ nên không chạy được, mong các anh góp ý dùm em với
    [SIZE="2"]
    entity QUAYT_N is
    Port ( CLK : in STD_LOGIC;
    STAR : in STD_LOGIC;
    STOP : in STD_LOGIC;
    DAO : in STD_LOGIC;
    Q : out STD_LOGIC_VECTOR (3 downto 0));
    end QUAYT_N;

    architecture Behavioral of QUAYT_N is
    SIGNAL QT:STD_LOGIC_VECTOR (3 downto 0);
    begin
    PROCESS (STAR,STOP,CLK,DAO)
    VARIABLE DEM:INTEGER RANGE 0 TO 8;
    BEGIN
    IF STOP='1' THEN QT<="0011";
    ELSIF CLK='1' AND CLK'EVENT THEN

    IF STAR='1' THEN QT<= QT(2 DOWNTO 0) & QT(3);DEM:=DEM+1;
    IF DEM =1 THEN QT<= "0011";
    ELSIF DAO='1' THEN QT<= QT(0) & QT(3 DOWNTO 1);DEM:=DEM+1;
    IF DEM=0 THEN QT<="0011";

    END IF;
    END IF;

    END IF;
    Q<=QT;
    END IF;
    END PROCESS;
    end Behavioral;[/
    SIZE]

  • #2
    bạn ơi cho so đồ kết nối đi hoặc nói rõ giá trị Q xuất ra như thế nào thì DC chạy chữ. bạn cho luôn thông tin trong file .ucf

    Comment


    • #3
      cái này là chỉ thể hiện nguyên lý điều khiển thôi, mạch điều khiển. nếu cần nối dây với động cơ thì có khi phải thêm tầng công suất. VHDL bỏ lâu chưa xem lại nên không sure lắm.

      Comment


      • #4
        Em chỉ mới mô phỏng trên máy tính thôi, nhưng không chạy, nhưng em biết chỗ sai của mình rồi (sai rất ngớ ngẩn), cám ơn các anh giúp đỡ :-)))

        Comment


        • #5
          bạn thử xem đoạn mã này xem nó chạy ổn rồi đó.
          library IEEE;
          use IEEE.STD_LOGIC_1164.ALL;
          use IEEE.STD_LOGIC_ARITH.ALL;
          use IEEE.STD_LOGIC_UNSIGNED.ALL;

          entity step_motor is
          Port ( clk,rst,chieu,start : in std_logic;
          ra : out std_logic_vector(0 to 3));
          end step_motor;

          architecture Behavioral of step_motor is
          begin
          process(clk)
          variable a : std_logic_vector(0 to 1):="00";
          begin
          if (start='1') then
          if(rst='0') then
          ra <= "0000";
          elsif (clk'event and clk='1') then
          if (chieu='1') then a:=a+1; --chieu thuan
          else a:=a-1;
          end if;
          case a is
          when "00" => ra <="1000";
          when "01" => ra <="0100";
          when "10" => ra <="0010";
          when "11" => ra <="0001";
          when others => ra <="0000";
          end case;
          end if;
          else ra <= "0000"; -- an toan cho dong co
          end if; -- end start
          end process;
          end Behavioral;

          Comment


          • #6
            Nguyên văn bởi votuananhs Xem bài viết
            bạn thử xem đoạn mã này xem nó chạy ổn rồi đó.
            Bạn hãy làm :
            1100
            0110
            0011
            1001

            thì mới đúng nghĩa dk dc bước chứ

            Comment


            • #7
              Nguyên văn bởi mrgiang99 Xem bài viết
              Bạn hãy làm :
              1100
              0110
              0011
              1001

              thì mới đúng nghĩa dk dc bước chứ
              Có nhiều loại động cơ bước bạn ạ. Ứng với mỗi loại động cơ bước lại có một cách điều khiển khác nhau. Ở đây mình gửi tài liệu này mình tìm được trên mạng bạn đọc nó đi nhé.
              Attached Files

              Comment


              • #8
                học hỏi là chính

                Nguyên văn bởi votuananhs Xem bài viết
                bạn ơi cho so đồ kết nối đi hoặc nói rõ giá trị Q xuất ra như thế nào thì DC chạy chữ. bạn cho luôn thông tin trong file .ucf



                library IEEE;
                use IEEE.STD_LOGIC_1164.ALL;
                use IEEE.STD_LOGIC_ARITH.ALL;
                use IEEE.STD_LOGIC_UNSIGNED.ALL;

                entity DK_Step_Motor is
                Port ( CKin, start, reset, dir : in STD_LOGIC;
                speed : in STD_LOGIC_VECTOR (2 downto 0);
                Out_M,O_Aled,O_Kled : out STD_LOGIC_VECTOR (3 downto 0));
                end DK_Step_Motor;

                architecture Behavioral of DK_Step_Motor is
                component tao_CLK is
                Port ( Clk : in std_logic;
                tocdo:in std_logic_vector(2 downto 0);
                Clk_C, Clk_quet, Clk_dem : out std_logic);

                end component;

                component hienthi is
                Port ( clk_Q,rst_L,chieu_L,start_L,Clk_D : in STD_LOGIC;
                Kled,Aled : out STD_LOGIC_VECTOR (3 downto 0));
                end component;

                component Dongcobuoc24 is
                Port ( clk_M,rst_M,chieu_M,start_M : in std_logic;
                ra : out std_logic_vector(0 to 3));
                end component;
                signal C_tmp, quet_tmp, dem_tmp: std_logic;
                begin
                CK: tao_CLK port map (Clk => CKin,
                tocdo=>speed,
                Clk_C=>C_tmp,
                Clk_quet=>quet_tmp,
                Clk_dem => dem_tmp);
                Motorongcobuoc24 port map (Clk_M => C_tmp,
                Start_M => Start,
                chieu_M => Dir,
                Rst_M => Reset,
                ra => out_M);
                Led: hienthi port map (Clk_Q =>quet_tmp,
                Clk_D => dem_tmp,
                rst_L => reset,
                chieu_L => Dir,
                Start_L=> Start,
                Aled => O_Aled,
                Kled => O_Kled);
                end Behavioral;
                --////////////////////////////////////



                library IEEE;
                use IEEE.STD_LOGIC_1164.ALL;
                use IEEE.STD_LOGIC_ARITH.ALL;
                use IEEE.STD_LOGIC_UNSIGNED.ALL;

                entity tao_CLK is
                Port ( Clk : in std_logic;
                tocdo:in std_logic_vector(2 downto 0);
                Clk_C, Clk_quet, Clk_dem : out std_logic);
                end tao_CLK;

                architecture Behavioral of tao_CLK is
                signal temp_div:std_logic_vector(20 downto 0);
                signal demxung : integer range 0 to 401;
                signal Clk_motor :std_logic;
                begin
                process(clk,temp_div,tocdo)
                begin
                if(clk='1' and clk'event) then
                temp_div<=temp_div+1;
                end if;
                Clk_quet <= temp_div(15);
                CASE tocdo IS
                WHEN "000" =>Clk_motor<=temp_div(20);
                WHEN "001" => Clk_motor<=temp_div(19);
                WHEN "010" => Clk_motor<=temp_div(18);
                WHEN "011" => Clk_motor<=temp_div(17);
                WHEN "100" => Clk_motor<=temp_div(16);
                WHEN "101" => Clk_motor<=temp_div(15);
                WHEN OTHERS => Clk_motor<=temp_div(14);
                end case;

                if (Clk_motor'event and Clk_motor='1') then
                demxung <= demxung + 1;

                if demxung < 200 then
                Clk_dem <= '1';
                end if;

                if (demxung > 200 and demxung <400) then
                Clk_dem <= '0';
                end if;

                if demxung > 400 then
                demxung <= 0;
                end if;
                end if;
                Clk_C <= Clk_motor;
                end process;

                end Behavioral;


                --/////////////////////////////////

                library IEEE;
                use IEEE.STD_LOGIC_1164.ALL;
                use IEEE.STD_LOGIC_ARITH.ALL;
                use IEEE.STD_LOGIC_UNSIGNED.ALL;

                entity Dongcobuoc24 is
                Port ( clk_M,rst_M,chieu_M,start_M : in std_logic;
                ra : out std_logic_vector(0 to 3));
                end Dongcobuoc24;

                architecture Behavioral of Dongcobuoc24 is

                begin

                process (clk_M,rst_M,chieu_M,start_M)
                variable a : std_logic_vector(0 to 2):="000";
                begin
                if (start_M='1') then
                if(rst_M='0') then
                ra <= "0000";
                elsif (clk_M'event and clk_M='1') then
                if (chieu_M='1') then a:=a+1; --chieu thuan
                else a:=a-1;
                end if;
                case a is
                when "000" => ra <="1000";
                when "001" => ra <="1100";
                when "010" => ra <="0100";
                when "011" => ra <="0110";
                when "100" => ra <="0010";
                when "101" => ra <="0011";
                when "110" => ra <="0001";
                when "111" => ra <="1001";
                when others => ra <="0000";
                end case;
                end if;

                else ra <= "0000"; -- an toan cho dong co

                end if;
                end process;
                end Behavioral;


                --////////////////////////



                library IEEE;
                use IEEE.STD_LOGIC_1164.ALL;
                use IEEE.STD_LOGIC_ARITH.ALL;
                use IEEE.STD_LOGIC_UNSIGNED.ALL;


                entity hienthi is
                Port ( clk_Q,rst_L,chieu_L,start_L,Clk_D : in STD_LOGIC;
                Kled,Aled : out STD_LOGIC_VECTOR (3 downto 0));
                end hienthi;

                architecture Behavioral of hienthi is
                signal nghin : std_logic_vector(3 downto 0);-- bo dem hang nghin
                signal tram : std_logic_vector(3 downto 0);-- bo dem hang tram
                signal chuc : std_logic_vector(3 downto 0);-- bo dem hang chuc
                signal dv : std_logic_vector(3 downto 0);-- bo dem hang don vi
                signal quet_led : integer range 0 to 4;-- quet Anod led hien thi

                begin
                process(clk_D,rst_L,chieu_L,start_L)

                begin
                if Start_L ='1' then
                if rst_L = '1' then

                if(clk_D='1'and clk_D'event) then
                if chieu_L = '1' then
                dv<=dv +1;
                if(dv="1001") then
                dv <= "0000";
                chuc <= chuc +1;
                end if;
                if (chuc= "1001" and dv="1001")then
                chuc <= "0000";
                tram <= tram +1;
                end if;

                if (tram = "1001" and chuc= "1001" and dv="1001") then
                tram <= "0000";
                nghin <= nghin +1;
                end if;

                if (nghin = "1001" and tram = "1001" and chuc= "1001" and dv="1001") then
                nghin <= "0000";
                end if;

                else dv<=dv - 1;
                if(dv="0000") then
                dv <= "1001";
                chuc <= chuc - 1;
                end if;

                if (chuc= "0000" and dv="0000")then
                chuc <= "1001";
                tram <= tram -1;
                end if;

                if (tram = "0000" and chuc= "0000" and dv="0000") then
                tram <= "1001";
                nghin <= nghin - 1;
                end if;

                if (nghin = "0000" and tram = "0000" and chuc= "0000" and dv="0000") then
                nghin <= "1001";
                end if;
                end if;
                end if;
                else
                dv <= "0000";
                chuc <= "0000";
                tram <= "0000";
                nghin <= "0000";
                end if;
                end if;
                end process;

                --////////////// quet hien thi led 7 doan
                process(clk_Q,quet_led)
                begin

                if(clk_Q='1'and clk_Q'event) then
                quet_led <=quet_led+1;
                end if;

                case quet_led is
                when 0 =>
                aled <="1110";
                Kled <= "0000";
                Kled <= dv;

                when 1 =>
                aled <="1101";
                Kled <= "0000";
                Kled <= chuc;

                when 2 =>
                aled <="1011";
                Kled <= "0000";
                Kled <= tram;

                when 3 =>
                aled <="0111";
                Kled <= "0000";
                Kled <= nghin;
                when 4 =>
                quet_led <= 0;
                when others =>Kled <= "0000";

                end case;

                end process;

                end Behavioral;

                --////////////////// gan chan tren Spartan 3E
                #PACE: Start of Constraints generated by PACE

                #PACE: Start of PACE I/O Pin Assignments
                NET "speed<0>" LOC = "l13" ;
                NET "speed<1>" LOC = "l14" ;
                NET "speed<2>" LOC = "h18" ;
                NET "CKin" LOC = "c9" ;
                NET "dir" LOC = "e13" ;
                NET "reset" LOC = "c4" ;
                NET "start" LOC = "b11" ;

                NET "O_Aled<0>" LOC = "b4" ;
                NET "O_Aled<1>" LOC = "a4" ;
                NET "O_Aled<2>" LOC = "d5" ;
                NET "O_Aled<3>" LOC = "c5" ;

                NET "O_Kled<0>" LOC = "a6" ;
                NET "O_Kled<1>" LOC = "b6" ;
                NET "O_Kled<2>" LOC = "e7" ;
                NET "O_Kled<3>" LOC = "f7" ;

                NET "Out_M<0>" LOC = "a13" ;
                NET "Out_M<1>" LOC = "b13" ;
                NET "Out_M<2>" LOC = "a14" ;
                NET "Out_M<3>" LOC = "b14" ;


                #PACE: Start of PACE Area Constraints

                #PACE: Start of PACE Prohibit Constraints

                #PACE: End of Constraints generated by PACE

                Comment

                Về tác giả

                Collapse

                nangthuytinh Tìm hiểu thêm về nangthuytinh

                Bài viết mới nhất

                Collapse

                Đang tải...
                X