3082
- 收藏
- 点赞
- 分享
- 举报
步进电机定位控制系统VHDL程序与仿真
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;
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;
我来回答
回答1个
时间排序
认可量排序
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片
相关问答
-
2008-10-02 20:27:32
-
2008-10-02 20:51:40
-
2008-10-02 20:25:24
-
2008-10-02 20:20:48
-
2008-10-02 20:52:33
-
2012-12-24 14:59:30
-
2008-10-02 20:42:12
-
2008-10-02 20:26:30
-
2013-11-20 20:07:27
-
2015-10-28 16:24:21
-
2015-10-28 09:44:52
-
2008-10-02 20:17:49
-
2008-10-02 20:17:06
-
2008-10-02 20:40:04
-
2018-11-22 09:56:05
-
2013-08-23 13:23:27
-
2015-09-26 10:45:38
-
2018-06-10 20:33:32
-
2019-02-26 13:16:26
无更多相似问答 去提问

点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认