• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

    作者: 時間:2012-03-21 來源:網(wǎ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); --激磁方式的選擇開關
    angle: in INTEGER range 255 downto 0; --步進角的倍數(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ù)值
    signal cc : integer range 0 to 3;
    signal cntIni: INTEGER range -1 to 0; --設定累加器所需的計數(shù)初值
    signal angleDnCount: INTEGER range 255 downto 0; --計算已經(jīng)轉過的步進角
    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.czjhyjcfj.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;



    評論


    相關推薦

    技術專區(qū)

    關閉
    主站蜘蛛池模板: 高尔夫| 台前县| 正定县| 宁武县| 莱芜市| 习水县| 芷江| 泽州县| 六枝特区| 山阴县| 安化县| 韶山市| 镇原县| 黄梅县| 江门市| 南京市| 宕昌县| 金湖县| 务川| 枣阳市| 阆中市| 靖宇县| 乐平市| 渝中区| 久治县| 象州县| 东乡| 张家川| 长丰县| 南昌县| 大庆市| 二连浩特市| 柘荣县| 集贤县| 宁阳县| 罗源县| 南昌市| 商水县| 皮山县| 陆良县| 台前县|