小车运动控制的VHDL描述设计_第1页
小车运动控制的VHDL描述设计_第2页
小车运动控制的VHDL描述设计_第3页
小车运动控制的VHDL描述设计_第4页
小车运动控制的VHDL描述设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Part 1:设计简介及背景知识控制对象由两台小型二相步进电机驱动的小车控制目标通过档位键盘(对应信号为dang3.0)和控制键盘(对应信号kong2.0)实现小车以两级速度前进、前左转、前右转、倒车、左倒车和右倒车。本设计采用自顶向下的设计方法,分为三个模块(见下页图),队员分工设计。第一模块:脉冲分频(缓慢启动,实体名fen)第三模块:脉冲分配器部分(分配给不同的电机,实体名:fenpei )第二模块:分频部分(不同档位的不同频率,实体名dangwei)各模块的相关说明步进电机的转速和输入脉冲信号的频率成正比,所以可以通过第二模块产生不同的分频信号控制其转速。本设计采用二相双四拍的电机工作

2、模式,故须在第三模块实现相应的脉冲分配。第三模块同时将脉冲导向不同的电机,实现方向控制。步进电机启动时不能加太高的频率,否则会啸叫、震动、丢步,无法实现快速、稳定的启动,所以在第一模块对输入的时钟脉冲sr_clk进行处理,再输入下一级以实现控制信号启动部分的过渡。步进电机的输入脉冲顺序相反时(相当于反接线时),会反转,因此可以通过在第三模块对输出反顺序赋值实现反转控制。关于仿真的说明步进电机的工作频率在KHZ级,此频率下可忽略芯片内部演示带来的影响,故一下的仿真大多为功能仿真。参考资料基于VHDL语言与Quartus软件的可编程逻辑器件应用与开发 郑燕,赫建国,党剑华编著基于Quartus I

3、I的FPGA/CPLD设计 李洪伟,袁斯华编著 VHDL语言设计技术 陈耀和著 数字电子技术基础(第二版) 杨颂华 冯毛官 孙万蓉 初秀琴 胡力山编著步进电机综述 北京市自动化技术研究所,一机部电器科学研究 新版机器人技术手册(日) 日本机器人学会编 宗光华 Part 2:各模块代码及详解第一模块 :脉冲分频一、模块功能对信号的起始部分的降频(因启动时需频率较低来过渡),输出最终的控制脉冲clk。通过对脉冲计数分先后在同一输出clk上实现8、4、2、1(即原频)的输出,以达到缓慢启动。二、原程序及相关说明library ieee;entity fen isport( sr_CLK:IN std

4、_logic; kong:in std_logic_vector(2 downto 0); clk:OUT std_logic );end fen;architecture div of fen is signal Q:std_logic_vector(2 downto 0);-自定义变量用于计数分频转接输出等。 signal C:std_logic; signal D:std_logic; signal E:std_logic; signal R:std_logic_vector(7downto 0):="00000000" beginprocess(sr_CLK) be

5、gin if sr_CLK'EVENT AND sr_CLK='1' then if(Q="111")then Q<="000" else Q<=Q+1; end if; end if; end process;C<=Q(2);-8分频 D<=Q(1);-4分频 E<=Q(0);-2分频PROCESS(sr_CLK,kong) -计数,在前96个脉冲使用某低速,在其后的脉冲使用某中速,在97个脉冲之后使用据横速度 BEGIN if sr_CLK'event and sr_CLK='1&

6、#39; then case kong is when"011"|"101"|"110"=> if(R<"10000000")then R <= R + 1; else R <= R; end if; when others=> R <="00000000" end case; end if; end process; process(R,C,D,E,sr_CLK) begin if(R="00000000")then clk<=&#

7、39;0' elsif(R="00000001")then clk<= C; elsif(R<"00100001")and(R>"00000001")then-第1脉冲上升沿开始八分频 clk<= C; elsif(R="00100001")then clk<= D; elsif(R<"01000001")and(R>"00100001")then-第33脉冲上升沿开始四分频 clk<= D; elsif(R="

8、;01000001")then clk<= E; elsif(R<"01100001")and(R>"01000001")then-第65脉冲上升沿开始二分频 clk<= E; elsif(R>="01100001")then-第97脉冲上升沿开始原频 clk<=sr_CLK; end if; end process; end div;三、仿真波形1、 当控制键kong为011时仿真波形为2、 当控制键kong为101时仿真波形为3、 当控制键kong为110时仿真波形为4、 当控制键ko

9、ng为111时仿真波形为四、遇到的问题(1)在仿真时遇到分频出现重叠使波形不是完整的8、4分频,为什么?答:主要原因在于设置时脉冲个数未控制好。(2)在波形仿真时出现一个三分频,为什么?答:应为二分频和厡频输出的叠加。(3)原程序编译通过,功能仿真(Functional) 和时序仿真(Timing)都能出现,但最优仿真却出不来,为什么?(Error: Can't continue timing simulation using fast timing model because delay annotation information for design is missin

10、g)第二模块:分频部分一、功能描述:1、输入有两个:档位键盘输入的档位信号dang:in std-logic-vector(3 downto 0),是个四位的位型矢量;时钟信号clk。dang 键盘按 “空、前一、前二、倒” 为顺序,当某个键被按下则由“1”变为“0”,不按下时保持“1”;2 输出有一个:clkc 初级时钟;3 功能:(1)当dang 为“0111”时 为空挡 ,输出的 clkc全为“0“空”(2)当dang 为“1011”时 为前一档,输出的 clkc为 clk 一半频率的时钟;“前一”(3)当dang 为“1101”时 为前二档,输出的 clkc 为 clk ,不做任何处理

11、;“前二”(4)当dang 为“1110”时 为倒档,输出和前一档的完全一样;“倒”(5)其他所有情况都和空挡完全一样。二、程序:library ieee;entity dangwei is port(dang:in std_logic_vector(3 downto 0); clk:in std_logic; clkc:out std_logic);end entity;architecture arc_dangwei of dangwei issignal count:std_logic:='0'(定义count的初始值为低电平)beginprocess(clk)begin

12、if(dang="1101") thenclkc<=clk;elsif(clk'event and clk='1') thenif(dang="1011" or dang="1110") thencount<=not count;clkc<=not count;elseclkc<='0'end if;end if;end process;end arc_dangwei;三、仿真波形:(1)dang=“1101”时的输出波形:(2)dang=“1011”和“1110”时的输

13、出波形: (3)dang输出为“0000”时:(4)整体输出波形:<1> 功能仿真波形 <2>时序仿真波形四、操作过程中出现的问题(1)有没有可行的语句来控制wait until clk'event and clk='1'的作用范围,可以让其在我们设想的范围内起作用,而不是控制整个process?编写程序的初衷是用case语句实现,并用wait until clk'event and clk='1'实现边沿触发,来达到二分频和对clkc赋值的操作,但是受边沿触发的影响,导致赋值操作时实际输出波形如下图示:(2)程序仿真出现

14、在时钟下降沿时钟信号不能控制输出波形的情况该如何解决?如图所示:第三模块:脉冲分配器部分1、 设计基本要求 脉冲分配器部分要控制的步进电机为两相,其中有三个输入clkz、dang、kong信号,有八个输出z0z3、y0y3信号,且z0z3对应左电机(小车左轮),y0y3对应右电机(小车右轮)。将clkz分配为四个相互错开的进程内部信号signal V,并在dang、kong信号的作用下完成对步进电机不同工作方式的控制,进而实现对二轮小车运动方式的控制。2、 设计流程设计脉冲分配器部分流程如下:实体名:fenpei (“分配”)输入有三个:clkz:时钟信号dang :in std-logic-

15、vector(3 downto 0),是个四位的位型矢量kong: in std-logic-vector(2 downto 0), 是个三位的位型矢量dang 键盘按 “空档、前进档一、前进档二、倒档 ”为顺序排列,当某个键被按下则由“1”变为“0”,不按下时保持“1”kong 键盘按 “两轮都工作、仅左轮工作、仅右轮工作 ”为顺序排列,当某个键被按下则由“1”变为“0”,不按下时保持“1”输出有八个:输出到左轮(z)的z0、z1、z2、z3输出到右轮(y)的y0、y1、y2、y3功能说明:首先将输入的clkz 分配成四个信号v0、v1、v2、v3,用于电机驱动的错开的四相脉冲。然后,1.当

16、 dang 为“1110”(倒档)条件下: 当 kong 为“011”时,将v0v3分别赋给z0z3,以及y0y3;“左右轮都工作” 当 kong 为“101”时,将v0v3只赋给z0z3,y0y3全赋零;“仅左轮工作” 当 kong 为“110”时,将v0v3只赋给y0y3, z0z3全赋零;“仅右轮工作” 当 kong 为其他时,zl和yl均赋全零;“左右轮都不工作” 2.当 dang为“1011”或“1101”(前进档1,前进档2)条件下:当 kong 为“011”时,将v3v0分别赋给z0z3,以及y0y3;“左右轮都工作” 当 kong 为“101”时,将v3v0只赋给z0z3,y0

17、y3全赋零;“仅左轮工作” 当 kong 为“110”时,将v3v0只赋给y0y3, z0z3全赋零;“仅右轮工作” 当 kong 为其他时,z0z3和y0y3均赋全零;“左右轮都不工作” 3.当 dang为其他时,z0z3和y0y3均赋全零;“左右轮都不工作”3、 设计方法 利用VHDL语言描述脉冲分配器,代码如下:library ieee; -包含库entity fenpei is -实体(fenpei)说明port( clkz : in std_logic; -时钟输入dang : in std_logic_vector(3 downto 0); -车轮工作方式第一选择信号(4位键盘输入

18、)kong : in std_logic_vector(2 downto 0); -车轮工作方式第二选择信号(3位键盘输入)w :out std_logic_vector(3 downto 0); -4位控制信号输出 z3,z2,z1,z0,y3,y2,y1,y0 : out std_logic); -左(z)右(y)车轮控制信号输出end fenpei;architecture arc_fenpei of fenpei is -结构体说明 signal A:std_logic_vector(1 downto 0); -定义内部信号 signal V:std_logic_vector(3 do

19、wnto 0);begin process(clkz) begin if clkz'event and clkz='1' then -时钟上升沿有效 if(A="11")then A<="00" else A<=A+1; end if; end if; case A is when"00"=>V<="0110" -产生周期序列0011 when"01"=>V<="0011" when"10"=&g

20、t;V<="1001" when"11"=>V<="1100" end case; end process;process(dang,kong,V) begin case dang is when"1110"=> -倒档 if kong="011"then -(倒档)左右轮都工作 z3<=V(3); z2<=V(2); z1<=V(1); z0<=V(0); y3<=V(3); y2<=V(2); y1<=V(1); y0<

21、=V(0); elsif kong="101"then -(倒档)仅左轮工作 z3<=V(3); z2<=V(2); z1<=V(1); z0<=V(0); y3<='0' y2<='0' y1<='0' y0<='0' elsif kong="110"then -(倒档)仅右轮工作 z3<='0' z2<='0' z1<='0' z0<='0' y3<

22、;=V(3); y2<=V(2); y1<=V(1); y0<=V(0); else -(倒档)左右轮都不工作 z3<='0' z2<='0' z1<='0' z0<='0' y3<='0' y2<='0' y1<='0' y0<='0' end if; when"1011"|"1101"=> -前进档1或前进档2 if kong="011&quo

23、t;then -(前进档)左右轮都工作 z3<=V(0); z2<=V(1); z1<=V(2); z0<=V(3); y3<=V(0); y2<=V(1); y1<=V(2); y0<=V(3); elsif kong="101"then -(前进档)仅左轮工作 z3<=V(0); z2<=V(1); z1<=V(2); z0<=V(3); y3<='0' y2<='0' y1<='0' y0<='0' elsif

24、 kong="110"then -(前进档)仅右轮工作 z3<='0' z2<='0' z1<='0' z0<='0' y3<=V(0); y2<=V(1); y1<=V(2); y0<=V(3); else -(前进档)左右轮都不工作 z3<='0' z2<='0' z1<='0' z0<='0' y3<='0' y2<='0' y

25、1<='0' y0<='0' end if; when others=> -其余档, 左右轮都不工作 z3<='0' z2<='0' z1<='0' z0<='0' y3<='0' y2<='0' y1<='0' y0<='0' end case; end process; w<=V;end arc_fenpei;4、 仿真结果下面是脉冲分配器部分功能仿真和时序仿真

26、结果,各部分的功能见图中标示:五、问题讨论 在脉冲分配模块的源程序中,当把控制信号输出z3z0,y3y0 : out std_logic改为Z,Y:out std_logic_vector(3 downto 0)时,输出结果出错。为什么?六、结论脉冲分配器部分使用VHDL语言设计了一种步进电机控制器。根据仿真波形的分析,基本达到了设计初期的要求,能够完成步进电机在不同控制档位下工作模式的选择,实现了步进电机正转、反转、停止的要求,进而实现了对两轮小车的运动方式的控制。Part 3:顶层设计及仿真一、过程顶层设计采用原理图输入。复制到工程文件夹中。在创建的.bdf文件中调用各个元件并连线、设定输入输出端口。最后,编译,仿真。这种设计方法结构清晰,输入方便,也更容易修改各模块间的逻辑关系。二、遇到的问题开始时只将.bsf文件复制在了工程文件夹中,在编译过程中出现了Error

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论