新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 步進電機定位控制系統(tǒng)的VHDL程序設(shè)計

        步進電機定位控制系統(tǒng)的VHDL程序設(shè)計

        作者: 時間:2017-06-05 來源:網(wǎng)絡 收藏

        定位控制系統(tǒng)程序與仿真

        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)復位信號
        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;
        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


        關(guān)鍵詞: 步進電機 VHDL 步進角

        評論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 溧阳市| 香格里拉县| 甘肃省| 安福县| 龙江县| 隆子县| 分宜县| 娱乐| 大连市| 辽中县| 增城市| 综艺| 湖南省| 宜章县| 尖扎县| 海安县| 闽侯县| 桂平市| 安乡县| 厦门市| 玉龙| 贡山| 盐边县| 始兴县| 池州市| 嘉义县| 双桥区| 永吉县| 油尖旺区| 康定县| 西和县| 新余市| 贵定县| 方山县| 垦利县| 平南县| 自贡市| 西充县| 巴南区| 隆安县| 北海市|