新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 步進電機定位控制系統的VHDL程序設計

        步進電機定位控制系統的VHDL程序設計

        作者: 時間:2017-06-05 來源:網絡 收藏

        定位控制系統程序與仿真

        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 (reset:in STD_LOGIC; --系統復位信號
        dir: in STD_LOGIC; --方向控制信號
        clk: in STD_LOGIC; --系統時鐘信號
        ini: in STD_LOGIC; --初始化使能信號
        manner: in STD_LOGIC_VECTOR (1 downto 0); --激磁方式的選擇開關
        angle: in INTEGER range 255 downto 0; --的倍數設定輸入
        baBA: out STD_LOGIC_VECTOR (3 downto 0)); --狀態輸出
        end step_motor;
        architecture stepmotor_arch of step_motor is
        signal count: INTEGER range 0 to 7; --計數器
        signal cntInc: INTEGER range -2 to 2; --設定累加器所需的累(加/減)計數值
        signal cc : integer range 0 to 3;
        signal cntIni: INTEGER range -1 to 0; --設定累加器所需的計數初值
        signal angleDnCount: INTEGER range 255 downto 0; --計算已經轉過的
        signal angleDnCntDec: INTEGER range 2 downto 1;
        begin
        process(dir, manner, angle)--, ini)
        begin
        --if ini='1' then
        cc=conv_integer(manner);
        if dir='0' then
        case cc is
        when 1 => -- 1-?相激勵
        --count=0;
        cntIni=0;
        cntInc=2;
        angleDnCntDec=2;--10;
        when 2 => -- 2-?相激勵
        --count=7;
        cntIni=-1;
        cntInc=2;
        angleDnCntDec=2;--10;
        when 3 => -- 1-2?相激勵
        --count=0;
        cntIni=0;
        cntInc=1;
        angleDnCntDec=1;--01;
        when 0 => --manner=00 autodetect
        if (angle rem 2) =1 then -- 2-?相激勵
        --count=7;
        cntIni=-1;
        cntInc=2;
        angleDnCntDec=2;--10;
        else -- 1-?相激勵
        --count=0;
        cntIni=0;
        cntInc=2;
        angleDnCntDec=2;--10;
        end if; --angle
        end case; --manner
        else -- if dir='1'
        case cc is
        when 1 => -- 1-?相激勵
        --count=0;
        cntIni=0;
        cntInc=-2;
        angleDnCntDec=2;--10;
        when 2 => -- 2-?相激勵
        --count=7;
        cntIni=-1;
        cntInc=-2;
        angleDnCntDec=2;--10;
        when 3 => -- 1-2?相激勵
        --count=0;
        cntIni=0;
        cntInc=-1;
        angleDnCntDec=1;--01;
        when 0 => --manner=00 autodetect
        if (angle rem 2) = 1 then -- 2-?相激勵
        cntIni=-1;
        cntInc=-2;
        angleDnCntDec=2;--10;
        else -- 1-?相激勵
        cntIni=0;
        cntInc=-2;
        angleDnCntDec=2;--10;
        end if; --angle
        end case; --manner
        end if; -- else dir=0
        --end if; -- ini
        end process;
        counting_reset: process(reset,ini, angle, clk)
        begin
        if reset='1' then
        count=0;
        angleDnCount=0;
        elsif clk'event and clk='1' then
        if ini='0' then
        count=0+cntIni;
        angleDnCount=angle;
        else
        count = count+cntInc;
        if angleDnCount > angleDnCntDec then
        angleDnCount = angleDnCount-angleDnCntDec;
        else
        angleDnCount = 0;
        end if;
        end if;
        end if;
        end process;
        baBA =0000 when angleDnCount=0 else
        0001 when count=0 else
        0011 when count=1 else
        0010 when count=2 else
        0110 when count=3 else
        0100 when count=4 else
        1100 when count=5 else
        1000 when count=6 else
        1001;-- when count>=7;
        end stepmotor_arch;

        本文引用地址:http://www.104case.com/article/201706/349030.htm


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宜川县| 沁源县| 阳东县| 望奎县| 都兰县| 淮滨县| 麻栗坡县| 乳山市| 武胜县| 苏尼特左旗| 阜新市| 泗水县| 昭平县| 上思县| 防城港市| 射洪县| 嘉鱼县| 保康县| 资源县| 万源市| 淅川县| 汪清县| 镶黄旗| 商洛市| 西充县| 张家港市| 隆化县| 靖西县| 汾阳市| 邵阳市| 女性| 来安县| 万山特区| 东平县| 临桂县| 腾冲县| 江达县| 平谷区| 财经| 太谷县| 阜南县|