新聞中心

        EEPW首頁 > EDA/PCB > 設(shè)計應(yīng)用 > 步進電機定位控制系統(tǒng)VHDL程序與仿真

        步進電機定位控制系統(tǒng)VHDL程序與仿真

        作者: 時間:2012-03-21 來源:網(wǎng)絡(luò) 收藏

        與仿真
        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; --系統(tǒng)復(fù)位信號
        dir: in STD_LOGIC; --方向控制信號
        clk: in STD_LOGIC; --系統(tǒng)時鐘信號
        ini: in STD_LOGIC; --初始化使能信號
        manner: in STD_LOGIC_VECTOR (1 downto 0); --激磁方式的選擇開關(guān)
        angle: in INTEGER range 255 downto 0; --步進角的倍數(shù)設(shè)定輸入
        baBA: out STD_LOGIC_VECTOR (3 downto 0)); --狀態(tài)輸出
        end step_motor;
        architecture stepmotor_arch of step_motor is
        signal count: INTEGER range 0 to 7; --計數(shù)器
        signal cntInc: INTEGER range -2 to 2; --設(shè)定累加器所需的累(加/減)計數(shù)值
        signal cc : integer range 0 to 3;
        signal cntIni: INTEGER range -1 to 0; --設(shè)定累加器所需的計數(shù)初值
        signal angleDnCount: INTEGER range 255 downto 0; --計算已經(jīng)轉(zhuǎn)過的步進角
        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;

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

        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;



        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 红桥区| 阳东县| 宝山区| 织金县| 南昌市| 秦皇岛市| 垫江县| 中超| 钟祥市| 铜鼓县| 汶上县| 连州市| 泸溪县| 天等县| 沐川县| 剑阁县| 惠来县| 龙海市| 盘锦市| 阿合奇县| 姚安县| 广州市| 翁牛特旗| 滦平县| 绥阳县| 安溪县| 霍城县| 平塘县| 瑞安市| 高雄市| 黄石市| 和政县| 弋阳县| 泾川县| 新昌县| 鹿邑县| 会理县| 六枝特区| 黔南| 安泽县| 和龙市|