电机控制系统Word下载.docx
《电机控制系统Word下载.docx》由会员分享,可在线阅读,更多相关《电机控制系统Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
总共具有5种不同的元件,分别负责不同的功能:
十进制BCD码减法计数器是用于控制系统的计时,时序电路负责存储电机的工作方式,信号翻译器负责将时序电路的信号翻译为电机可识别信号,编码器负责将输入的时间转换为2个4位编码给2个数码管显示。
具体原理图如下图2-1:
图2-1电机控制原理图
2.1.2电机控制系统设计内容
设计六个模块来实现一个简单的电机控制系统,主要可以控制电机工作的时间和工作方式并将剩余工作时间显示出来。
整个系统的输入端口一共有三个,分别是开关控制输入端口、工作时间输入端口和时钟频率输入端口。
输出端有三个分别是正转输出端口、反转输出端口和暂停输出端口。
同时有两个七段数字显示器。
时间数据由工作时间输入端口存储到十进制BCD码减法计数器中并显示在七段数码管显示器中。
通过开关控制输入端口开始程序将开始信息传到时序电路中启动时序电路。
时序电路将输出方法传递到信号翻译器中翻译并给出最终输出信号。
2.2模块设计
共设计6个模块分别如下:
1.(b2d)顶层文件:
引用各个模块组成电机控制系统。
2.(counter)十进制BCD码减法计数器:
实现输入的为分钟数,每隔60秒计数器减1。
3.(decoder)信号翻译器:
将时序电路的信号翻译为暂停,正转,反转信号。
4.(settime)预置时间与编码寄存电路:
将输入的1-10分钟编为2个4位的BCD码。
5.(shixu)时序电路:
控制电机按20秒正转,停十秒。
20秒反转,停十秒的顺序运行。
6.(showtime)数码管显示器:
实现数码管显示。
第3章系统的程序说明和仿真
3.1顶层文件
K为工作时间的输入端口,输入的一个10位的二进制数。
START为此程序的启动输入端口。
当从K端口输入工作时间时,数据会传递到十进制BCD码减法计数器中,并由十进制BCD码减法计数器将K译码传递到数码管显示器中显示是数码管上。
当START端口为高电平时则为程序的开始,十进制BCD码减法计数器开始倒数,时序电路启动并将信号传递到信号翻译器,翻译器开始工作传递最终控制信号到电机中。
同时十进制BCD码减法计数器中置TIME_REMAINH每次改变都会通过数码管显示器显示在七段数码管上表示剩余时间。
仿真图形如下图3-1:
图3-1电机控制系统仿真图
3.2十进制BCD码减法计数器
十进制BCD码减法计数器主要实现的功能为定时功能。
输入时间信号后开始倒数计时,到计数器为零时停止。
其中START为开始的输入端口,CLK为时钟输入端口,MIME_REMAIN为输出时间数据到数码管的输出端口,K为输入时间数据的输入端口。
TIME_IS_UP为电机工作状态的输出端口。
通过将K中的数字装入TIME_REMAINH中开始并开始计时,置TIME_second为60并开始每一秒减一,TIME_second为零时从新开始并置TIME_REMAINH减一。
一直循环到TIME_REMAINH为零时结束程序,并置TIME_IS_UP为0表示电机停止运行。
仿真图形如下图3-2:
图3-2十进制BCD码减法计数器仿真图
3.3信号翻译器
从时序电路中传来的信号并不能直接用于驱动直流电机的运转,必须通过信号翻译器将这两个输入信号翻译成三个分别为RUN(正转),REV(反转),PAUSE(暂停)的信号再输出给直流电机来控制电机。
其中Q1和Q2是从时序电路来的控制信号,RUN为正转输出信号,REV为反转输出信号,PAUSE为暂停输出信号.这是一个简单的译码器,当Q1和Q2输入为00,01,10时分别输出为001,010,100,其他为000。
通过CASE语句翻译Q1和Q2的输出情况,其他的时候输出000表示出错。
仿真图形如下图3-3:
图3-3.信号翻译器仿真图
3.4预置时间与编码寄存电路
预置时间与编码寄存电路,将输入的1-10分钟编为2个4位的BCD码。
K为时间输入端口,LOAD为时钟输入端口,O为2个4位的BCD码的输出端口。
仿真图形如下图3-4:
图3-4.预置时间与编码寄存电路仿真图
3.5时序电路
时序电路是不同功能实现的基础,通过调整程序中正转和反转的持续时间和顺序达到调整电机运转方式的功能。
其中Q1和Q2为输出信号量送至信号翻译器中。
CP为时钟输入端口。
RD和EN为程序开始的信号输入端口。
由于运作方式已经内置在程序中,调整输出方式只能修改程序中的相应数据。
程序开始后会依次执行正传,反转,暂停并循环。
直到结束。
仿真图形如下土3-5:
图3-5.时序电路仿真图
3.5数码管显示器
数码管显示器将输入的从0-9的4位二进制数,以七段译码器的方式输出。
可以使用一个7位向量来分别表示中的七段数码管,如图3-6所示:
a
bc
d
ee
g
图3-6七段LED与向量元素的对应图
各个LED的选通表示不同的字母,该程序采用数据流描述方式。
Cp信号为时钟信号,remain_time信号为输入的数字,Q1为低位输出,Q2为高位输出,A,B,C,D,E,F,G分别对应7个数码管。
进程是以输入信号为敏感量的。
通过CASE语句将输入信号翻译成输出信号。
定义输入信号作为进程的敏感量触发进程,将输入信号赋值给内部数值信号,通过CASE语句翻译0-9七段译码的输出情况,其他的时候输出-1表示出错。
仿真图形如下图3-7所示:
图3-7数码管显示器仿真图
第四章课程设计总结
通过7天的课程设计,我设计并完成了电机控制系统的设计,并用MAX-PLUS2仿真出了波形图。
通过这次的课程设计,我学习到了很多的知识,不仅巩固了上课老师讲到的知识,也学到到了老师所没讲过的知识。
能够灵活的运用书本中的知识并与实际进行联系,解决一些实际生活中遇到的问题。
在这次课程设计,我遇到了很多困难,我通过同学和老师的帮助,一步步的客服了它们,并且很好的完成了本次课程设计。
参考文献
[l]侯伯亨《基于QuartusⅡ的FPGA/CPLD设计》电子工业出版社2001
[2]潘松《CPLD系统设计技术入门与应用》电子工业出版社2004
[3]边际年《EDA技术基础》湖南大学出版社2000
[4]沈明山《EDA技术及可编程器件应用实训》科学出版社1999
[5]朱正伟《EDA技术及应用》清华大学出版社2000
……………
附录
程序清单
--十进制BCD码减法计数器,libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycounteris
port(clk,start:
instd_logic;
k:
inSTD_LOGIC_VECTOR(7downto0);
time_remain:
BUFFERSTD_LOGIC_VECTOR(7DOWNTO0);
time_is_up:
outstd_logic
);
endcounter;
architecturertlofcounteris
begin
process(clk)
--variabletime_second:
integer:
=60;
variabletime_second:
=0;
begin
if(clk'
eventandclk='
1'
)
then
--endif;
--if(time_second>
0andstart='
)
--thentime_second:
=time_second-1;
--elsetime_second:
=59;
--endif;
if(start='
0'
time_remain<
=k;
--time_second:
time_second:
else
if(time_second=0)
thenif(time_remain(3downto0)>
0)
then--time_remain(3downto0)<
=time_remain(3downto0)-start;
time_remain(3downto0)<
=time_remain(3downto0)-1;
time_second:
elseif(time_remain(7downto4)>
then--time_remain(7downto4)<
=time_remain(7downto4)-start;
time_remain(7downto4)<
=time_remain(7downto4)-1;
time_remain(3downto0)<
="
1001"
;
endif;
else--if(time_second=0andtime_second=1)
if(time_remain=0)thentime_is_up<
='
elsetime_is_up<
endprocess;
endrtl;
--将时序电路的信号翻译
libraryieee;
entitydecoderis
port(
Q1,Q2:
instd_logic;
REV,RUN,PAUSE:
outstd_logic--rev,run,pause);
enddecoder;
architecturertlofdecoderis
--signalchoose:
std_logic_vector(1downto0);
begin
--choose
(1)<
=q1;
choose(0)<
=q2;
--process(choose)
--begin
--casechooseis
--when"
00"
=>
REV<
RUN<
PAUSE<
10"
01"
--whenothers=>
--endcase;
--endprocess;
=Q2;
=Q1;
=not(Q1ORQ2);
entityencodeis
bcd:
instd_logic_vector(3downto0);
a,b,c,d,e,f,g:
outstd_logic
);
endencode;
architecturertlofencodeis
signaltemp:
std_logic_vector(6downto0);
table
bcd=>
temp;
"
0000"
1111110"
;
0001"
0110000"
0010"
1101101"
0011"
1111001"
0100"
0110011"
0101"
1011011"
0110"
1011111"
0111"
1110000"
1000"
1111111"
1111011"
endtable;
a<
=temp(6);
b<
=temp(5);
c<
=temp(4);
d<
=temp(3);
e<
=temp
(2);
f<
=temp
(1);
g<
=temp(0);
--预置时间与编码寄存电路
libraryieee;
entitysettimeis
port(load:
instd_logic_vector(9downto0);
o:
outstd_logic_vector(7downto0)
endsettime;
architecturertlofsettimeis
signalp1:
std_logic_vector(7downto0);
process(load)
if(load'
eventandload='
casekis
when"
1000000000"
p1<
00000001"
0100000000"
00000010"
0010000000"
00000011"
0001000000"
00000100"
0000100000"
00000101"
0000010000"
00000110"
0000001000"
00000111"
0000000100"
00001000"
0000000010"
00001001"
0000000001"
00010000"
whenothers=>
00000000"
endcase;
o<
=p1;
--时序电路。
entityshixuis
port(cp,en,rd:
q1,q2:
outstd_logic);
endshixu;
architecturertlofshixuis
process(cp)
--variablewash_time:
integerrange0to19;
--variablewait_time:
integerrange0to9;
variablestate:
std_logic;
variablewash_time:
integer:
=21;
variablewait_time:
=9;
begin
--if(en='
--wash_time:
19'
--wait_time:
9'
--state:
--endif;
if(en='
thenwash_time:
=21;
Q1<
Q2<
--停机状态
elseif(cp'
eventandcp='
thenif(rd='
thenif(wash_time>
thenwash_time:
=wash_time-1;
wait_time:
=9;
if(wait_time>
0)--thenwait_time:
=wait_time-1;
elsewash_time:
=20;
state:
=notstate;
if(wash_time=0)
thenQ1<
elseif(state='
)thenQ1<
elseQ1<
endif;
entityshowtimeis
port(remain_time:
instd_logic_vector(7downto0);
cp:
outstd_logic;
endshowtime;
architecturertlofshowtimeis
signalbcd:
std_logic_vector(3downto0);
signalchoose:
if(cp'
thenchoose<
=notchoose;
if(choose='
thenq1<
q2<
bcd<
=remain_time(7downto4);
elseq1<
=remain_time(3downto0);
endprocess;
process(bcd)
casebcdis
when"
temp<
="
whenothers=>
temp<