基于EDA的直流电机测速.docx
- 文档编号:24196169
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:15
- 大小:65.88KB
基于EDA的直流电机测速.docx
《基于EDA的直流电机测速.docx》由会员分享,可在线阅读,更多相关《基于EDA的直流电机测速.docx(15页珍藏版)》请在冰豆网上搜索。
基于EDA的直流电机测速
电子信息工程综合应用设计(报告)
(课程设计)
题目直流电动机测速实验
二级学院电子信息与自动化学院
专业电子信息工程
班级
学生姓名
学号
指导教师
时间2011.12.26.至2012.1.13
直流电动机测速实验
【摘要】:
本文章介绍的是以EP1C6试验箱为核心的直流电机测速系统。
系统已EP1C6作为驱动芯片,通过控制占空比来实现直流电机的驱动及其速度的调节,通过按键来个定的直流电机转速的信息,并由霍尔元件感应测试其速度,经数码管显示出来。
本设计采用vhdl语言,使用quartus进行编程。
最终实现直流电机的控制。
【关键字】EDA;直流电机;PWM;VHDL
引言
工程实践中,经常会遇到各种需要测量转速的场合,例如在发动机,电动机,机床主轴等旋转设备的实验运转和控制中,常需要分时或连续测量,显示其转速及瞬间速度。
同时随着社会的发展,各种智能化的产品日益走人寻常百姓家。
为了实现产品的便携性、低成品及对电源的限制,小型直流电机的应用以及电机转速的精确控制的需求相当广泛。
整个系统以EP1C6实验箱为核心,通过按键输入一个转速,通过调整占空比来实现转速向预设的值靠近。
一、设计要求
1.用数码管显示直流电机转速
2.控制直流电机转速
3.控制直流电机保持在一个恒定值
二、设计目的
a)掌握直流电机的工作原理。
b)了解开关型霍尔传感器的工作原理和使用方法。
c)掌握电机测速的原理。
三、设计方案原理
1、总体方案
本设计分为直流电机测速控制模块、直流电机测速有时钟是能的十进制计数器模块、译码显示输出模块、PWM产生控制模块
2、分模块介绍
(1)模块一:
直流电机测速控制模块
通过把1M时钟信号分频为1hz信号,当clk<6时,产生6秒钟计数,当clk=6时锁存信号=1,clk=7时清0信号=1。
模块一:
实验原理图
(2)模块二:
直流电机测速有时钟使能的十进制计数器模块
每当有一个时钟信号CLK'EVENTANDCLK='1'时cqi加1,当cqi=9时,在加1,cqi=0,从而达到10进制计数。
每当出现1111时再加1,就变为0000,同时进位信号为1.
模块二:
实验原理图
模块三:
译码显示输出模块
译码显示模块分为位选信号和8位数码管显示信号。
位选信号为3位有8种组合,通过000到111来选不同位,8位数码管显示信号有8位分别定义1~9的显示
模块三:
实验原理图
(3)模块四:
pwm产生控制模块
程序把占空比为1000分频,预先设定了占空比为500.通过控制占空比从而达到控制直流电机转速的目的,在这个模块中我们让数码管显示的速度DOUT与一个预先设定的速度DOUT1比较如果DOUT 模块四: 实验原理图 3、总体设计框图 四、设计过程介绍 1、设计过程 1、测速显示 当电机旋转时,带动转盘是的磁钢片一起旋转,当磁钢片旋转到霍尔器件的上方时,可以导致霍尔器件的输出端高电平变为低电平。 当磁钢片转过霍尔器件上方后,霍尔器件的输出端又恢复高电平输出。 这样电机每旋转一周,则会使霍尔器件的输出端产生一个低脉冲,我们就可以通过检测单位时间内霍尔器件输出端低脉冲的个数来推算出直流电机在单位时间内的转速。 电机的转速通常是指每分钟电机的转速,也就是单位为rpm,实际测量过程中,为了减少转速刷新的时间,通常都是5~10秒刷新一次。 如果每6秒钟刷新一次,那么相当于只记录了6秒钟内的电机转数,把记录的数据乘10即得到一分钟的转速。 最后将这个数据在数码管上显示出来。 为了使显示的数据能够在数码管是显示稳定,在这个数据的输出时加入了一个16位的锁存器,把锁存的数据送给数码管显示,这样就来会因为在计数过程中,数据的变化而使数码管显示不断变化。 2、pwm产生控制 通过控制占空比,从而达到控制直流电机控制。 用按键先预设一个速度值,让电动机的实际转速与预设值比较,如果不相等,就调节占空比使之达到预设值。 2、设计过程中出现的几个问题及解决方法 (1)问题一不了解直流电机转动原理 解决办法 通过在图书馆资料学习以及不懂得地方问老师 (2)问题二不会控制直流电机转速 解决办法 通过学习了解了控制占空比就可以控制直流电机转速 五、调试过程介绍 1、调试过程 把程序下载到实验箱,观察实验现象,如果不对就修改程序,重复前面的操作,直到成功 2、调试过程中出现的问题及其解决方法 (1)问题一数码管显示的速度跳动很大 解决方法 通过把占空比从100分频调到1000,这样占空比没变化1速度的变化就会减少 (2)问题二显示的速度在你预设的速度间波动很大 解决方法 由于直流电机测速采用的是6秒钟计数,所以要把控制信号的时钟频率也变为6秒,通过分频把1M时钟变为6秒,让计数频率与控制频率一致 六、总结 通过了这次课程设计,学会了vhdl语言,虽然以前也学过EDA,但是没有深入了解vldl语言,对编程更是不行,通过这三个星期的学习,能熟练的读懂程序,并且还具备了一些VHDL编程能力以及VHDL硬件描述语言的思维方法。 在这次试验中我们这组做了一个直流电机测速及其控制。 从一开始什么都不懂,到最后自己不仅能修改程序,在系统的设计方面也有了自己的一些想法。 这次课程设计基本还算成功。 为什么说基本呢,是因为要求的功能都能实现。 唯一不足的也是实验未完成的地方就是按键消抖部分。 其实我也尝试消抖但没成功,这是最大的缺点。 没有消抖,按键按一下就会跳动很大。 如果消抖解决了那么我们的课题就非常成功了,总之在这次课程设计学到了很多东西,也得到了老师很多的帮助与指导,我对eda技术也有了更多的兴趣,希望还能设计,接受下一次挑战。 参考文献: [1]潘松,黄继业.EDA技术与VHDL(第2版).北京: 清华大学出版社.2007年1月[2]潘松,黄继业.EDA技术实用教程(第3版).科学出版社[3]王振红.VHDL数字电路设计与应用实践教程.北京: 机械工业出版社.2003年6月 [4]包明.EDA技术与可编程逻辑器件的应用.北京: 北京航空航天大学出版社.2006年8月[5]江国强.EDA技术习题与实验.哈尔滨: 哈尔滨工程大学电子工业出版社.2005年1月[6]刘昌华.数字逻辑EDA设计与实践.北京: 国防工业出版社.2007年10月[7]江思敏.VHDL数字电路及系统设计.北京: 机械工业出版社.2006年8月[8]王道宪.VHDL电路设计技术.北京: 国防工业出版社.2004年1月 [9]廖常初.可编程序控制器应用技术(第三版)[M].重庆: 重庆大学出版社.2000年[10]俞一鸣.Altera可编程逻辑器件的应用与设计[M].北京: 机械工业出版社.2007年[11]周景润.基于Quartus的FPGA数字系统设计[M].北京: 电子工业出版社.2007年[12]孟庆辉.EDA技术实用教程[M].北京: 国防工业出版社.2008年 附录一原件清单 1、带有quartus的电脑一台 2、EP1C6试验箱一个 附录二源程序 直流电机测速控制产生 libraryieee; useieee.std_logic_1164.all; useieee.std_logic_arith.all; useieee.std_logic_unsigned.all; ------------------------------------------------------- entityteltclis port(Clk: instd_logic;--时钟输入1Mhz ena: outstd_logic;--允许计数 clr: outstd_logic;--计数器清零信号产生 load: outstd_logic--锁存、显示输出允许 ); endteltcl; ------------------------------------------------------ architecturebehaveofteltclis signalclk1hz: std_logic;--1HZ时钟信号 signalcount: std_logic_vector(2downto0);--6秒计数 signalclr1: std_logic;--清零信号 signalena1: std_logic;--允许计数信号 signalload1: std_logic;--允许计数信号 signalcq1,cq2,cq3,cq4: INTEGERRANGE0TO15;--计数数据 begin process(clk)--1HZ信号产生 variablecnttemp: INTEGERRANGE0TO999999; begin IFclk='1'ANDclk'eventTHEN IFcnttemp=999999THENcnttemp: =0; ELSE IFcnttemp<500000THENclk1hz<='1'; ELSEclk1hz<='0'; ENDIF; cnttemp: =cnttemp+1; ENDIF; endif; endprocess; process(Clk1hz)--6秒计数 begin if(Clk1hz'eventandClk1hz='1')then count<=count+1; ifcount<6then ena1<='1';load1<='0';clr1<='0'; elsifcount=6then load1<='1';ena1<='0';clr1<='0'; elsifcount=7then ena1<='0';load1<='0';clr1<='1'; endif; endif; ena<=ena1;load<=load1;clr<=clr1; endprocess; endbehave; 直流电机测速有时钟使能的十进制计数器产生 LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; ENTITYCNT10IS PORT(CLK: INSTD_LOGIC;--计数时钟信号 CLR: INSTD_LOGIC;--清零信号 ENA: INSTD_LOGIC;--计数使能信号 CQ: OUTINTEGERRANGE0TO15;--4位计数结果输出 CARRY_OUT: OUTSTD_LOGIC);--计数进位 ENDCNT10; ARCHITECTUREARTOFCNT10IS SIGNALCQI: INTEGERRANGE0TO15; BEGIN PROCESS(CLK,ENA)IS BEGIN IFCLR='1'THENCQI<=0;----计数器异步清零 elsIFCLK'EVENTANDCLK='1'THEN IFENA='1'THEN iFCQI=10THENcqi<=1; ELSECQI<=cqi+1; ENDIF;----等于9,则计数器清零 ENDIF; ENDIF; ENDPROCESS; PROCESS(CQI)IS BEGIN IFCQI=10THENCARRY_OUT<='1';----进位输出 ELSECARRY_OUT<='0'; ENDIF; ENDPROCESS; CQ<=CQI; ENDART; 直流电机测速译码输出 LIBRARYIEEE; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitydisplayis port(in7,in6,in5,in4,in3,in2,in1,in0: instd_logic_vector(3downto0); lout7: outstd_logic_vector(7downto0); SEL: OUTSTD_LOGIC_VECTOR(2DOWNTO0); clk: instd_logic ); enddisplay; architecturephtaoofdisplayis signals: std_logic_vector(2downto0); signallout4: std_logic_vector(3downto0); begin process(clk) begin if(clk'eventandclk='1')then if(s="111")then s<="000"; elses<=s+1; endif; endif; sel<=s; endprocess; process(s) begin casesis when"000"=>lout4<=in6; when"001"=>lout4<=in5; when"010"=>lout4<=in4; when"011"=>lout4<="0000"; when"100"=>lout4<=in3; when"101"=>lout4<=in2; when"110"=>lout4<=in1; when"111"=>lout4<="0000"; whenothers=>lout4<="XXXX"; endcase; caselout4is when"0000"=>lout7<="00111111"; when"0001"=>lout7<="00000110"; when"0010"=>lout7<="01011011"; when"0011"=>lout7<="01001111"; when"0100"=>lout7<="01100110"; when"0101"=>lout7<="01101101"; when"0110"=>lout7<="01111101"; when"0111"=>lout7<="00000111"; when"1000"=>lout7<="01111111"; when"1001"=>lout7<="01100111"; when"1010"=>lout7<="00111111"; when"1111"=>lout7<="01000000"; whenothers=>lout7<="XXXXXXXX"; endcase; endprocess; endphtao; PWM产生及其控制 libraryieee; useieee.std_logic_1164.all; useieee.std_logic_arith.all; useieee.std_logic_unsigned.all; ENTITYPWMIS PORT( clock: INSTD_LOGIC; --duty_cycle: INSTD_LOGIC_VECTOR(6DOWNTO0); DOUT: INSTD_LOGIC_VECTOR(15DOWNTO0); DOUT1: INSTD_LOGIC_VECTOR(15DOWNTO0); pwm_out: OUTSTD_LOGIC ); END; ARCHITECTUREARTOFPWMIS SIGNALPWM_OUT_IO: STD_LOGIC; SIGNALCOUNT: STD_LOGIC_VECTOR(15DOWNTO0); SIGNALCLK1HZ: STD_LOGIC; SIGNALDUTY_CYCLE_IO: STD_LOGIC_VECTOR(9DOWNTO0): ="0111110100"; BEGIN PWM_OUT<=PWM_OUT_IO; process(clock) variablecnttemp: INTEGERRANGE0TO999999; begin IFRISING_EDGE(CLOCK)THEN IFcnttemp=999999THENcnttemp: =0; ELSE IFcnttemp<90000THENclk1hz<='1'; ELSEclk1hz<='0'; ENDIF; cnttemp: =cnttemp+1; ENDIF; endif; endprocess; PROCESS(CLOCK) BEGIN IFRISING_EDGE(CLOCK)THEN if(COUNT<"1111101000000000")then COUNT<=COUNT+1; else COUNT<="0000000001000000"; endif; ENDIF; ENDPROCESS; PROCESS(clock) BEGIN IFRISING_EDGE(clk1hz)THEN IF(DOUT DUTY_CYCLE_IO<=DUTY_CYCLE_IO+1; ELSEIF(DOUT>DOUT1)THEN DUTY_CYCLE_IO<=DUTY_CYCLE_IO-1; ELSE DUTY_CYCLE_IO<=DUTY_CYCLE_IO; ENDIF; ENDIF; ENDIF; endprocess; PROCESS(CLOCK) BEGIN IFRISING_EDGE(CLOCK)THEN IFCOUNT(15DOWNTO6)<=DUTY_CYCLE_IOTHEN PWM_OUT_IO<='1'; ELSE PWM_OUT_IO<='0'; ENDIF; ENDIF; ENDPROCESS; END;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 EDA 直流电机 测速