QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,包括:
可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;芯片<电路)平面布局连线编辑;LogicLock增量设计方法,用户可建立并优化系统,然后添加对原始系统的性能影响较小或无影响的后续模块;功能强大的逻辑综合工具;完备的电路功能仿真与时序逻辑仿真工具;定时/时序分析与关键路径延时分析;可使用SignalTapII逻辑分析工具进行嵌入式的逻辑分析;支持软件源文件的添加和创建,并将它们链接起来生成编程文件;使用组合编译方式可一次完成整体设计流程;自动定位编译错误;高效的期间编程与验证工具;可读入标准的EDIF网表文件、VHDL网表文件和Verilog网表文件;能生成第三方EDA软件使用的VHDL网表文件和Verilog网表文件。
4系统组成
4.1四相步进电机工作原理
步进电机是利用数字信号控制的电机装置,步进电机每次接收到一组脉冲数字信号,便旋转一个角度,称为步进角。
不同规格的步进电机的步进角不同,与电动机内部的线圈数量有关。
线圈中的供应电流决定线圈所产生的磁场方向。
4相步进电机有两组线圈A和B,如图4.1所示,A、B两组垂直摆放线圈的电流方向的排列组合,最多可以产生8种磁场方向,分别是0º、45º、90º、135º、180º、225º、270º、315º。
图4.1四相步进电机
由表4.1可以知,假设电动机转子刻度在0º的位置,想让其转180º,可以使端口信号依次按0001,0011,0010,0110到0100变化。
注意:
四相电动机有1相激磁法、2相激磁法和1-2相混合激磁法3种激磁方式。
不同的激磁方式,端口信号的顺序是不同的。
表4.1四相步进电机的8个方向和电流以及电压信号的关系
该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图4.2是该四相反应式步进电机工作原理示意图。
图4.2四相步进电机步进示意图
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即A-AB-B-BC-C-CD-D-DA-A。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图4.3的a、b、c所示。
图4.3a单四拍图4.3b双四拍图4.3c八拍
4.2系统组成
图4.4系统组成
5模块设计
5.1FPGA模块图及信号说明
图5.1FPGA模块图
reset:
系统内部复位信号,’1’时有效;
dir:
步进电机正反转的方向控制开关,0:
逆时针,1:
顺时针;
clk:
由FPGA内部提供的4MHz的时钟信号;
ini:
赋初值的使能开关,’0’时有效;
manner:
激磁方式的选择开关(两位>,00:
自动检测角度输入,决定激磁方式01:
1-相激磁。
10:
2.相激磁。
11:
1-2.相激磁.
angle:
步进角的倍数设定输入键.
baba:
将内部计数器的count[3downto0]的数值编码输出
5.2系统模块构成
系统主要由步进电机方向设定电路模块、步进电机步进移动与定位控制模块和编码输出模块构成。
前两个模块完成电机旋转方向设定,激磁方式设定和定位角度的换算等工作,后一个模块用于对换算后的角度量编码输出。
5.3各模块间整体共享的电路内部传递信号
count:
内部电路计数累加器,用来产生输出所需对应的状态;
cntinc:
设定累加器所需的累加/减计数值;
sntini:
设定累加器所需的计数初值;
angledncount:
设定步进角所需处理的次数;
Angledncntdec:
设定步进角所需累减计数值;
5.4电机方向设定电路模块
该模块设定了步进电机的旋转方向以及电机在任一方向上所需的初值与累加/减值。
dir为0时,步进电机工作于逆时针旋转模式,累加值为正数。
manner选择激磁方式00、01、10、11分别对应默认激磁方式、1-相激磁方式、2.相激磁方式和1-2.相激磁方式。
如表5.1。
manner
cntini
cntinc
angledncntdec
00
angle=2n+1时–1
angle=2n时0
2
2
01
0
2
2
10
-1
2
2
11
0
1
1
表5.1dir为0时
dir为1时,步进电机工作于顺时针旋转模式,累加值为负数。
manner选择激磁方式00、01、10、11分别对应默认激磁方式、1-相激磁方式、2.相激磁方式和1-2.相激磁方式。
如表5.2。
manner
cntini
cntinc
angledncntdec
00
angle=2n+1时–1
angle=2n时0
-2
2
01
0
-2
2
10
-1
-2
2
11
0
-1
1
表5.2dir为1时
5.5步进电机步进移动与定位控制模块
该模块的主要功能是利用赋初值ini将数值传到该模块中并配合输入的clk作为同步控制信号,进行步进电机的步进移动与定位控制。
步进电机定位功能通过一个减法器实现:
在每个clk脉冲上升缘,设定步进角倍数angledncount减去不同激磁方式下设定的累减记数值angledncntdec,判断差值小于设定的累减记数时,步进电机旋转到预定角度停止输出驱动端口信号,实现步进电机的定位功能。
驱动端口信号利用累加器实现。
5.6编码输出模块
该模块的功能是将count与angledncount产生的数值经过编码,并通过baba[3downto0]输出到步进电机。
6程序设计与仿真
libraryIEEE。
useIEEE.std_logic_1164.all。
useIEEE.std_logic_arith.all。
useIEEE.std_logic_unsigned.all。
entitystep_motoris
port(reset:
inSTD_LOGIC。
--系统复位信号
dir:
inSTD_LOGIC。
--方向控制信号
clk:
inSTD_LOGIC。
--系统时钟信号
ini:
inSTD_LOGIC。
--初始化使能信号
manner:
inSTD_LOGIC_VECTOR(1downto0>。
--激磁方式的选择开关
angle:
inINTEGERrange255downto0。
--步进角的倍数设定输入
baBA:
outSTD_LOGIC_VECTOR(3downto0>>。
--步进电机状态输出
endstep_motor。
architecturestepmotor_archofstep_motoris
signalcount:
INTEGERrange0to7。
--计数器
signalcntInc:
INTEGERrange-2to2。
--设定累加器所需的累<加/减)计数值
signalcc:
integerrange0to3。
signalcntIni:
INTEGERrange-1to0。
--设定累加器所需的计数初值
signalangleDnCount:
INTEGERrange255downto0。
--计算已经转过的步进角
signalangleDnCntDec:
INTEGERrange2downto1。
begin
process(dir,manner,angle>--,ini>
begin
--ifini='1'then
cc<=conv_integer(manner>。
ifdir='0'then
caseccis
when1=>--1-相激励
--count<=0。
cntIni<=0。
cntInc<=2。
angleDnCntDec<=2。
--"10"。
when2=>--2-相激励
--count<=7。
cntIni<=-1。
cntInc<=2。
angleDnCntDec<=2。
--"10"。
when3=>--1-2相激励
--count<=0。
cntIni<=0。
cntInc<=1。
angleDnCntDec<=1。
--"01"。
when0=>--manner="00"autodetect
if(anglerem2>=1then--2-相激励
--count<=7。
cntIni<=-1。
cntInc<=2。
angleDnCntDec<=2。
--"10"。
else--1-相激励
--count<=0。
cntIni<=0。
cntInc<=2。
angleDnCntDec<=2。
--"10"。
endif。
--angle
endcase。
--manner
else--ifdir='1'
caseccis
when1=>--1-相激励
--count<=0。
cntIni<=0。
cntInc<=-2。
angleDnCntDec<=2。
--"10"。
when2=>--2-相激励
--count<=7。
cntIni<=-1。
cntInc<=-2。
angleDnCntDec<=2。
--"10"。
when3=>--1-2相激励
--count<=0。
cntIni<=0。
cntInc<=-1。
angleDnCntDec<=1。
--"01"。
when0=>--manner="00"autodetect
if(anglerem2>=1then--2-相激励
cntIni<=-1。
cntInc<=-2。
angleDnCntDec<=2。
--"10"。
else--1-相激励
cntIni<=0。
cntInc<=-2。
angleDnCntDec<=2。
--"10"。
endif。
--angle
endcase。
--manner
endif。
--elsedir=0
--endif。
--ini
endprocess。
counting_reset:
process(reset,ini,angle,clk>
begin
ifreset='1'then
count<=0。
angleDnCount<=0。
elsifclk'eventandclk='1'then
ifini='0'then
count<=0+cntIni。
angleDnCount<=angle。
else
count<=count+cntInc。
ifangleDnCount>angleDnCntDecthen
angleDnCount<=angleDnCount-angleDnCntDec。
else
angleDnCount<=0。
endif。
endif。
endif。
endprocess。
baBA<="0000"whenangleDnCount=0else
"0001"whencount=0else
"0011"whencount=1else
"0010"whencount=2else
"0110"whencount=3else
"0100"whencount=4else
"1100"whencount=5else
"1000"whencount=6else
"1001"。
--whencount>=7。
endstepmotor_arch。
7仿真结果
图7.1编译结果
图7.2时序仿真部分结果
图7.3时序仿真结果
8实验总结
本文所设计的步进电机控制系统实现简单,编程容易,所设计系统实现了对电机模组的预定控制,较好的完成了设计要求。
采用Verilog和FPGA设计,能够缩短设计周期,并使设计易于调试、实现。
在系统需升级时,仅需对FPGA模块再设计,成本较低。
从仿真结果来看,利用FPGA芯片严谨的基于硬件的编程语言和精确的时间控制特点,准确地实现了精确定位功能,并利用直接频率合成理论中的相位累加器的原理同时实现了对步进电机的运行速度的精确控制。
实践证明,这种方法定位准确,控制速度精确,是一种行之有效的方案。
参考文献
[1]通信原理樊昌信张甫翊徐炳祥吴成柯著国防工业出版社2009.1
[2]EDA技术使用教程—VHDL版潘松黄继业编著科学出版社2018.6
本科生课程设计成绩评定表
姓名
性别
专业、班级
课程设计题目:
步进电机定位控制系统设计
课程设计答辩或质疑记录:
1、步进电机的拍数是指什么?
答:
拍数指完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数。
以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即A-AB-B-BC-C-CD-D-DA-A。
2、各个输入信号的作用是什么?
答:
reset:
系统内部复位信号,’1’时有效;
dir:
步进电机正反转的方向控制开关,0:
逆时针,1:
顺时针;
clk:
由FPGA内部提供的4MHz的时钟信号;
ini:
赋初值的使能开关,’0’时有效;
manner:
激磁方式的选择开关(两位>,00:
自动检测角度输入,决定激磁方式01:
1-相激磁。
10:
2.相激磁。
11:
1-2.相激磁.
angle:
步进角的倍数设定输入键.
成绩评定依据:
最终评定成绩<以优、良、中、及格、不及格评定)
指导教师签字:
年月日