资源描述
二相步进电机控制系统的设计(采用双极性控制)
二相步进电机控制系统的设计(采用双极性控制)
二相步进电机控制系统的设计(采用双极性控制)
课程设计任务书
学生姓名: 专业班级:
指导教师: 工作单位:
题 目: 二相步进电机控制系统的设计(采用双极性控制)
初始条件:
设计一个二相步进电机控制系统,电机有两组带中心抽头的线圈,要求系统具有如下功能:采用双极性(H桥)控制(不使用线圈的中心抽头),用K0-K1做为通电方式选择键,K0为四拍,K1为八拍, K2为启动/停止控制、K3方向控制、K4加速、K5减速;用4位LED数码管显示工作步数。用3个发光二极管显示状态:正转时红灯亮,反转时黄灯亮,不转时绿灯亮;
要求完成的主要任务:
1. 硬件设计:系统总原理图及各部分详细原理图
2. 软件设计:系统总体流程图、步进电机四拍,八拍各模块流程图、显示模块流程图等
3. 编写程序:能够完成上述任务并用仿真软件演示
4. 完成符合要求的设计说明书
时间安排:2013年6月24日~2013年7月4日
指导教师签名: 年 月 日
系主任(或责任教师)签名: 年 月 日
目 录
摘要 1
1 设计任务及要求的分析 2
2 方案比较及认证 2
2.1 单片机选型 2
2.2驱动模块选择 3
3 系统实现的原理说明 3
4 硬件设计说明 5
4.1 单片机系统原理分析 5
4.2 二相步进电机工作原理分析 7
4.3 L298驱动电路设计 9
4.4 四位LED数码管显示设计 11
5 软件设计说明 12
5.1总体流程分析与设计 12
5.2 设置电机转动模式流程分析与设计 13
5.3 显示模块流程分析与设计 14
6 调试记录及结果分析 15
6.1 总体硬件仿真设计 15
6.2调试与仿真结果分析 16
小结与心得体会 18
参考文献 19
附录1: 20
附录2: 20
摘要
步进电机广泛应用于对精度要求比较高的运动控制系统中,如机器人、打印机、软盘驱动器、绘图仪、机械阀门控制器等。目前,对步进电机的控制主要有由分散器件组成的环形脉冲分配器、软件环形脉冲分配器、专用集成芯片环形脉冲分配器等。分散器件组成的环形脉冲分配器体积比较大,同时由于分散器件的延时,其可靠性大大降低;软件环形分配器要占用主机的运行时间,降低了速度;专用集成芯片环形脉冲分配器集成度高、可靠性好,但其适应性受到限制,同时开发周期长、需求费用较高。
本控制系统的设计方案,以单片机为核心,辅以驱动电路,完成二相步进电机的控制。本次设计的硬件部分主要包括单片机系统、按键控制模块、步进电机驱动模块、数码显示模块等功能模块的设计,软件部分由几个模块控制子程序分别控制硬件模块的运行,最终实现对步进电机转动方向及转动模式(四拍,八拍)的控制,并且将步进电机的步进数动态显示在LED数码管上。
关键词:步进电机 单片机 控制 LED
二相步进电机控制系统的设计
1 设计任务及要求的分析
设计的步进电机控制系统要求有以下功能:
1. 二相步进电机采用双极性(H桥)控制;
2.用K1作为通电方式选择键,可选择四拍和八拍;
3. 用K2作为启动/停止控制键,闭合表示启动,断开表示停止;
4. 用K3作为正反转控制键,开关闭和表示反转,断开表示正转;
5. 用K4作为加速控制键,闭合时电机加速运转;
6. 用K5作为减速控制键,闭合时电机减速运转;
7. 用4位LED数码管显示工作步数;
8. 用3个发光二极管显示状态:正转时红灯亮,反转时黄灯亮,不转时绿灯亮。
本次设计需要对二相步进电机进行双极性控制,使其能在控制下进行正转、反转和停
止,同时利用数码管和二极管分别显示其工作步数和工作状态。由于控制功能较为复杂,所以本系统需要采用单片机以及驱动模块进行设计。
2 方案比较及认证
2.1 单片机选型
单片机以其体积小、功能齐全、价格低廉、可靠性高等优点,在各个领域都获得了广泛的应用,在我国,近几年单片机也得到了广泛的应用特别是在工业控制、智能仪表等方面。
单片机种类繁多,目前市场上常用的单片机有51系列,AVR系列与PIC系列等。
MCS-51系列运算与寻址能力强、存储空间大、片内集成外设丰富、功耗低等。其中大部分兼容芯片有Flash,价格便宜,常用于仪器仪表、测控系统、嵌入式系统开发。
ATMEL公司的AVR单片机是增强型RISC内载Flash的单片机,芯片上的Flash存储器附在用户的产品中,可随时编程,再编程,使用户的产品设计容易,更新换代方便.AVR单片机采用增强的RISC结构,使其具有高速处理能力,在一个时钟周期内可执行复杂的指令,每MHz可实现1MIPS的处理能力.AVR单片机工作电压为2.7~6.0V,可以实现耗电最优化.AVR的单片机广泛应用于计算机外部设备,工业实时控制,仪器仪表,通讯设备,家用电器,宇航设备等各个领域。
PIC系列单片机: PIC系列单片机的主要产品是PIC 16C系列和17C系列8位单片机,CPU采用RISC结构,分别仅有33,35条指令,采用Harvard双总线结构,运行速度快,低工作电压,低功耗,较大的输入输出直接驱动能力,价格低,一次性编程,小体积。适用于用量大,档次低,价格敏感的产品。在办公自动化设备,消费电子产品,电讯通信,智能仪器仪表,汽车电子,金融电子,工业控制不同领域都有广泛的应用,PIC系列单片机在世界单片机市场份额排名中逐年提高,发展非常迅速。
比较这三种类型的单片机,MCS-51系列单片机以抗干扰能力强、对环境要求不高、灵活性强等别的系统所不具备的优点被广泛使用。即使非电子计算机专业人员,通过学习一些专业基础知识以后也能依靠自己的技术力量,来开发所希望的单片机应用系统。由于本次设计的所要实现的功能并不复杂,鉴于成本考虑,选用便宜而常用的MCS-51系列较为合适。本次设计采用其中低功耗型80C51单片机。
2.2驱动模块选择
驱动模块常用有uln2003a和L298,考虑到二相步进电机需采用双极性控制,故电机的驱动模块使用芯片L298实现,接线简洁,稳定性好。
3 系统实现的原理说明
本次课程设计系统以单片机80C51为核心进行设计,单片机与按键、数码管、发光二极管、L298驱动模块相连接,人为操作按键,在程序控制下,单片机将通过驱动模块控制步进电机转动,并使数码管和发光二极管分别显示步进电机的工作步数和状态。
系统的总体原理框图如下所示:
按键设置
80c51
单片机
系统
L298驱动
模块
发光二极管显示状态
二相步进电机
四位数码管
图3-1系统总体原理框图
本系统以单片机80C51为核心的控制系统,由P1口进行开关按键的设置,具体为:P1.2接K5减速开关,开关闭合时作用,低电平有效;P1.3接K4加速开关,开关闭合时作用,低电平有效;P1.4接K3正/反转开关,高电平为正转,低电平为反转;P1.5接K2启动/停止开关,高电平为停止状态,低电平为启动状态; P1.6和P1.7接K0单刀双掷开关,用于控制工作模式的选择,P1.6接八拍,P1.7接四拍。
P3口与P0口外接4位LED数码管,显示步进步数,通过控制P3口的电平信号,达到片选的目的,进而实现4位数值的显示。P0口作为输出口外接LED的A~G以及DP。另外P2.4接绿色发光二极管,使其在电机停转时亮;P2.5接红色放光二极管,使其在电机正转时亮;P2.6接黄色发光二极管,使其在电机反转时亮。
P2外接驱动电路L298的4个输入端,具体为P2.0接IN1,P2.1接IN2,P2.2接IN3,P2.3接IN4。这样即可通过控制单片机的P2口输出电平来实现二相步进电机的启动,停止,正反转以及四拍,八拍运转。具体工作过程需通过对单片机编程来实现。
电路图如下所示
图 3-2 系统电路原理图
4 硬件设计说明
4.1 单片机系统原理分析
80C51是MCS-51系列单片机中CHMOS工艺的一个典型品种。其它厂商以8051为基核开发出的CMOS工艺单片机产品统称为80C51系列。
该系列单片机是采用高性能的静态80C51设计,由先进CMOS 工艺制造,并带有非易失性Flash 程序存储器 ,全部支持12 时钟和6 时钟操作,P89C51X2 和P89C52X2/54X2/58X2 分别包含128 字节和256 字节RAM、32 条I/O 口线、3 个16 位定时/计数器、6 输入4 优先级嵌套中断结构、1 个串行I/O 口、可用于多机通信 I/O 扩展或全双工UART以及片内振荡器和时钟电路。
其主要结构组成如下:
1.中央处理器(CPU)
2.内部数据存储器(内部RAM)
3.内部程序存储器(内部ROM)
4.定时器/计数器
5.并行I/O口
6.串行口
7.时钟电路
8.中断系统
9.外接晶体引脚
图4-1 80C51单片机管脚图
单片机管脚如图4-1所示,下面对其各个管脚进行必要的说明。
P0、P1、P2、P3口的电平与CMOS和TTL电平兼容。
P0口的每一位口线可以驱动8个LSTTL负载。在作为通用I/O口时,由于输出驱动电路是开漏方式,由集电极开路(OC门)电路或漏极开路电路驱动时需外接上拉电阻;当作为地址/数据总线使用时,口线输出不是开漏的,无须外接上拉电阻。
P1、P2、P3口的每一位能驱动4个LSTTL负载。它们的输出驱动电路设有内部上拉电阻,所以可以方便地由集电极开路(OC门)电路或漏极开路电路所驱动,而无须外接上拉电阻。
当CPU不对P3口进行字节或位寻址时,内部硬件自动将口锁存器的Q端置1。这时,P3口作为第二功能使用。
P3.0 :RXD(串行口输入);
P3.1 :TXD(串行口输出);
P3.2 :外部中断0输入;
P3.3 :外部中断1输入;
P3.4 :T0(定时器0的外部输入);
P3.5 :T1(定时器1的外部输出);
P3.6 :(片外数据存储器“写”选通控制输出);
P3.7 :(片外数据存储器“读”选通控制输出)。
EA/VPP : 访问程序存储器控制信号,当其为低电平时,对ROM的读操作限定在外部的程序存储器,当其为高电平时,对ROM的读操作是从内部存储器开始的,并可延至外部程序存储器。
ALE/PROG : 编程脉冲
PSEN : 外部程序存储器读选通信号,在读外部ROM时PSEN是低电平有效,以实现对ROM 的读操作。
RST/VPD : 复位信号,当输入信号延续2个周期以上的高电平有效,用以完成单片机复位初始化操作。
XTAL : 时钟晶振输入端。
本系统设计中所用P1~P3全部当做IO口用。
4.2 二相步进电机工作原理分析
步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机一般分为永磁式(PM)、反应式(VR)和混合式(HB)3种类型。目前,二相混合式步进电机的应用最为广泛。图4-3为二相六线式步进电机的工作原示意图。由图可知,它有2个绕组,且每个绕组都有一个中间抽头。因此,二相步进电机也就有了6根引线。当电机中的绕组通电后,其定子磁极产生磁场,将转子吸合到相应的磁极处。若绕组在控制脉冲的作用下,通电方向使定子在顺时针方向轮流产生磁场,则电机可顺时针转动;通电方向使定子在逆时针方向轮流产生磁场,则电机可逆时针转动。控制脉冲每作用一次,通电方向就变化一次,使电机转动一步,即一个步距角。脉冲频率越高,电机转动也就越快。
本次课设所使用的二相步进电机需要采用双极性的接法。双极性则是指步进电机线圈中电流的流动方向不是单向的,即绕组线圈中的电流有时沿某一方向流动,有时按相反方向流动。步进电机的双极性驱动电路如图4-4所示它使用8个晶体管来驱动2组相位。双极性驱动电路可以同时驱动四线式或六线式的二相步进电机。对于二相六线式步进电机而言, 2个绕组的中间抽头Vdd1和Vdd2都悬空。根据步进电机的工作原理,当控制器给驱动器发出脉冲信号时,驱动器经过环形分配器和功率放大后,电机绕组通电的顺序为,其4个状态按顺序周而复始进行变化,电机转动; 若通电时序就变为时,电机就逆向转动。步进电机运转时,当达林顿管Q1和Q4导通时,线圈中电流方向为A→;当达林顿管Q2和Q3导通时,线圈中电流方向为→A。可见,步进电机线圈中的电流方向在运转过程中是不断改变的。
图4-3 二相步进电机原理图
图4-4 双极性驱动电路
任务要求需要对二相步进电机进行四拍,八拍的控制。其两者的区别在于通电时序的不一样,四拍的通电方式为:,而八拍需要在此基础上进行细分,其通电方式为: 。由对应的通电方式,在结合图4-4,便可以得到对应的单片机管脚P2.0,P2.1,P2.2,P2.3的电平变化情况,绘制出步进电机的四拍,八拍控制方式表格。如下表4-1和表4-2所示:
表4-1 步进电机四拍控制通电方式
时序
单片机管脚位
通电的线圈
对应二进制数
转换16进制数
P2.3
P2.2
P2.1
P2.0
1
0
0
1
0
0010
02H
2
1
0
0
0
1000
08H
3
0
0
0
1
0001
01H
4
0
1
0
0
0100
04H
表4-2 步进电机八拍控制通电方式
时序
单片机管脚位
通电的线圈
对应二进制数
转换16进制数
P2.3
P2.2
P2.1
P2.0
1
0
0
1
0
0010
02H
2
1
0
1
0
1010
0AH
3
1
0
0
0
1000
08H
4
1
0
0
1
1001
09H
5
0
0
0
1
0001
01H
6
0
1
0
1
0101
05H
7
0
1
0
0
0100
04H
8
0
1
1
0
0110
06H
由上述所得表格,便可以通过控制单片机I/O口输出高低电平变化来实现步进电机的四拍,八拍运转。在编写程序时,设置好控制字,在I/O口做循环输出,便实现了单片机对步进电机的控制。由于单片机单独带负载能力较差,步进电机与单片机之间需要接入步进电机的驱动电路L298。
4.3 L298驱动电路设计
由课题任务要求可知,二相步进电机需采用双极性(H桥)控制,故考虑使用芯片L298来驱动步进电机。L298N为双全桥步进电机专用驱动芯片,内部包含4信道逻辑驱动电路,是一种二相和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,内含二个H-Bridge 的高电压、大电流双全桥式驱动器,接收标准TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机的IO端口来提供模拟时序信号。在接入步进电机时,OUTl,OUT2 ,OUT3,OUT4接二相步进电机的,,,,二相步进电机的对应管脚以图4-5为准,IN1~IN4接单片机的I/O口,用来控制单片机的正反转以及四拍,八拍通电方式。芯片的内部结构如下图4-5所示:
图4-5 L298内部结构图
由图4-5可以看出,L298内部集成有2个H桥路,对应的输入接口为:IN1位P2.0,IN2为P2.1,IN3为P2.2,IN4为P2.3。对应的输出接口为:OUT1接,OUT2接,OUT3接,OUT4接。PROTUS仿真图为:
图4-6 驱动电路PROTUS仿真图
4.4 四位LED数码管显示设计
任务要求需采用4位LED数码管显示工作步数,通过查阅相关资料,在仿真时采用型号7SEG-MPX4-CC共阴极数码管显示。其PROTUS仿真图如下所示:
图4-7 数码管显示仿真图
单片机的P0口接数码管输入管脚ABCDEFG以及DP(可以不用),P3口接4位数码管的片选端口1234,7段数码管对应的显示数值与输入信号的关系可以由下表得到。
表4-3 七段数码管显示功能表
单片机管脚输入
显示
十六进制
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
A
B
C
D
E
F
G
1
1
1
1
1
1
0
O
3FH
0
1
1
0
0
0
0
1
06H
1
1
0
1
1
0
1
2
5BH
1
1
1
1
0
0
1
3
4FH
0
1
1
0
0
1
1
4
66H
1
0
1
1
0
1
1
5
6DH
0
0
1
1
1
1
1
6
7DH
1
1
1
0
0
0
0
7
07H
1
1
1
1
1
1
1
8
7FH
1
1
1
1
0
1
1
9
6FH
由上表可以得到显示数字与单片机管脚输入信号的对应关系。只需要控制单片机的P0口输出信号即可显示数字,在程序设计中,定义7段显示数组为uchar seg[]={0x3f,0x06,
0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};即可使数码管显示数字。
5 软件设计说明
5.1总体流程分析与设计
软件模块的分析需要根据硬件电路的设计来进行,基于上述硬件电路的分析设计,对整个程序流程需要有个整体的思考与判断。由硬件电路的设计可以看出,程序需要实现以下几个功能:通过开关实现电机的启用与停止,正转与反转,加减速,以及四拍、八拍的运行方式;由4位LED数码管实现步进步数的显示;3个发光二极管显示电机的运行状态。程序设计的总体思想是单片机通过判断按键输入电平变化从而选择正反转,加减速,以及四八拍的工作方式。主程序流程图如图5-1所示。
图 5-1 主程序流程图
5.2 设置电机转动模式流程分析与设计
由硬件电路可知,电机的转动由开关K1~K5来控制,K1为单刀双掷开关,用于工作模式四八拍的选择,低电平有效;K2为单刀单掷开关,用于启动和停止的选择,开关闭合表示启动,此时为低电平,相反开关断开表示停止,此时为高电平;K3为单刀单掷开关,用于电机正反转的选择,开关闭合时表示电机正传,此时为低电平,相反开关断开表示电机反转,此时为高电平;K4为单刀单掷开关,用于电机加速的选择,开关闭合表示电机加速,此时为低电平;K5为单刀单掷开关,用于电机减速的选择,开关闭合表示电机减速,此时为低电平。我们通过80C51读入这六位控制字,存放在变量temp中。对应temp值如下表所示。
表5-1 控制字及与转动方式对应表
K1
K2
K3
K4
K5
temp
转动方式
0
1
0
1
0
1
54H
正向四拍加速
1
0
0
1
0
1
94H
正向八拍加速
0
1
0
0
0
1
44H
反向四拍加速
1
0
0
0
0
1
84H
反向八拍加速
0
1
0
1
1
0
58H
正向四拍减速
1
0
0
1
1
0
98H
正向八拍减速
0
1
0
0
1
0
48H
反向四拍减速
1
0
0
0
1
0
88H
反向八拍减速
0
1
0
1
1
1
5CH
正向四拍常速
1
0
0
1
1
1
9CH
正向八拍常速
0
1
0
0
1
1
4CH
反向四拍常速
1
0
0
0
1
1
8CH
反向八拍常速
对应程序段如下
void keyscan()
{
uchar temp;
while(k2) {mode=0;step=0;P2=0xef;} //停止,绿灯亮;
led_green=1; //启动,绿灯灭;
temp=P1&0xfc; //P1口取高六位有效;
switch(temp)
{
case 0x54: mode=1;break;//正向四拍加速运行;
case 0x94: mode=2;break;//正向八拍加速运行;
case 0x44: mode=3;break;//反向四拍加速运行;
case 0x84: mode=4;break;//反向八拍加速运行;
case 0x58: mode=5;break;//正向四拍减速运行;
case 0x98: mode=6;break;//正向八拍减速运行;
case 0x48: mode=7;break;//反向四拍减速运行;
case 0x88: mode=8;break;//反向八拍减速运行;
case 0x5c: mode=9;break;//正向四拍常速运行;
case 0x9c: mode=10;break;//正向八拍常速运行;
case 0x4c: mode=11;break;//反向四拍常速运行;
case 0x8c: mode=12;break;//反向八拍常速运行;
}
}
5.3 显示模块流程分析与设计
由硬件部分分析可知,Led数码管有4个管脚读入片选信号,8个管脚读入控制信号。本部分程序首先要对当前的步数值进行位数分离,将个、十、百、千位分别提取出来,然后通过片选信号选择位数读入控制字,依次进行显示。由于单片机的计算过程非常快,我们还设置了延时程序,并且与步进电机同步,显示一步的时间与步进电机走一步的时间相同,所以看起来各位是同时显示的。
对应程序段如下
void display(uint num)
{
uchar qian,bai,shi,ge,t;
qian=num/1000;
bai=(num/100)%10;;
shi=(num/10)%10;
ge=num%10; //分离出每一位;
for(t=num_speed;t>0;t--)
{
P0=seg[qian]; //千位;
wela1=0;
delayms(5);
wela1=1;
P0=seg[bai]; //百位;
wela2=0;
delayms(5);
wela2=1;
P0=seg[shi]; //十位;
wela3=0;
delayms(5);
wela3=1;
P0=seg[ge]; //个位;
wela4=0;
delayms(5);
wela4=1;
}
}
6 调试记录及结果分析
6.1 总体硬件仿真设计
硬件设计模块完成了对系统电路图的设计,软件模块由程序实现了各项功能;接下来需要将软件与硬件结合起来才能真正完成整个设计工作。我们采用的是PROTEUS仿真软件得到了系统的硬件图,参见附录1;使用Keil软件的集成环境调试程序,程序代码清单参见附录。在系统完成后测试系统,检查硬件和软件是否能够协调运行,并对系统出现的情况进行分析,看是否能够达到系统设计之初所设想的效果,如达不到则重新修改系统的硬件结构或者修改软件的程序部分,直到达到设计需要为止。本系统的设计思路为:首先从整体上划分出各功能模块,然后硬件和软件同时进行依次完成各个功能模块,最后将各个模块联系起来完成整个系统。
6.2调试与仿真结果分析
在硬件调试的过程中,遇到了很多问题。主要有:
键盘部分设计时,开始统一用了单刀双掷开关K1~K6来控制,在多次运行过程中发现这种设计存在一定问题,比如四八拍模式的选择,若是在运行电路前同时闭合了这两个开关,就会造成系统紊乱,故将其改换为一个单刀双掷开关,这样的话一次就只能选择一种模式运行。
在步进电机与驱动电路的连接中,需要准确的接好各个管脚,因为程序里的控制字对应着这些管脚电平的变化,不能随便接,单片机的输出口与驱动电路的输出口也需要一一对应,否则电机无法按正常的设计运转。
经过调试以及对仿真电路图及程序的改正,系统得以实现任务的要求,对步进电机进行控制,仿真成功。在此截取若干仿真图进行说明。
图6-1为电机正转时的仿真图,电机顺时针旋转,红灯亮。
图6-2为电机反转时的仿真图,电机逆时针旋转,黄灯亮。
图6-3为电机停止时仿真图,绿灯亮。
图6-1 步进电机正向常速运行仿真图
图6-2 步进电机反向常速运行仿真图
图6-3 步进电机反向加速运行仿真图
由仿真图可见,此系统实现了对步进电机的正反转以及停止的控制,能够利用数码管显示步数,通过发光二级管显示步进电机运行状态,此系统设计合理,满足设计要求。
小结与心得体会
本次计算机控制课程设计,和以往的课程设计一样,让我感到收获良多。首先,拿到题目之后我很快就确定了利用单片机来进行设计,考虑了AVR和80c51等单片机,由于此系统需要实现的功能简单,不需要过大的内存,所以由于成本原因选择了80c51进行设计。但是在protus仿真调试时还是出现了许多问题,程序调试时,发现了许多语法错误,例如缺少函数声明就直接调用,变量形式设错等。语法没有错误之后编译成单片机能识别的.hex文件,运行仿真却出现了步进电机转动正常但显示管记录步数不正常的情况。经仔细检查,发现是方式字的设置也出现了错误而导致数码管不能正常显示步数。仿真中也出现发光二极管亮度过低的情况,后将电阻调低后正常。本次课设经过多次调试改正错误,才得以仿真成功。
单片机是此次设计中非常重要的元器件,在做完成课程设计的过程中,我查阅了一些资料对其进行学习,了解了其内部结构、存储容量以及管脚功能等知识,感到受益匪浅。调试程序是一个复杂而精细的过程,很多错误都十分细小,在意想不到的地方,我和同学互相检查对方的程序,才发现了彼此的问题。
通过本次课程设计,我不仅加深了对课堂知识的理解,拓展了单片机方面的知识,掌握了protus软件的应用,更培养了科学的思维方式和动手能力,与同学的交流也多出了一份学术探讨的氛围,也锻炼了我的耐心和坚持,令我受益匪浅。
参考文献
[1] 于海生.《计算机控制技术》[M],北京:机械工业出版社,2007年
[2] 陈冬云.《ATmega128 单片机原理与开发指导》[M],北京:机械工业出版社,2005年
[3] 王彦平.《RPOTEL 99 电路设计指南》[M],北京:清华大学出版社,2000年
[4] 沈美明.《IBM-PC汇编语言程序设计》[M], 北京:清华大学出版社,2001年
[5] 沈精虎.《Protel99 入门与提高》[M], 北京:人民邮电出版社,2007年
附录1:
附图1 系统电路proteus仿真图
附录2:
/****************步进电机测试程序***************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit k2=P1^5;//启动/停止开关,为0时启动,为1时停止;
sbit k3=P1^4;//正反转控制开关,为1时正传,为0时反转;
sbit wela1=P3^0;//数码管位选1;
sbit wela2=P3^1;//数码管位选2;
sbit wela3=P3^2;//数码管位选3;
sbit wela4=P3^3;//数码管位选4;
sbit led_green=P2^4; //控制绿灯,显示停止;
sbit led_red=P2^5; //控制红灯,显示反转;
sbit led_yellow=P2^6;//控制黄灯,显示正传;
unsigned char pfour[]={0xd1,0xd4,0xd2,0xd8};//步进电机正传四拍数表;
unsigned char peight[]={0xd1,0xd5,0xd4,0xd6,0xd2,0xda,0xd8,0xd9};//步进电机正传八拍数表;
unsigned char nfour[]={0xb1,0xb8,0xb2,0xb4};//步进电机反转四拍数表;
unsigned char neight[]={0xb1,0xb9,0xb8,0xba,0xb2,0xb6,0xb4,0xb5};//步进电机反转八拍数表;
uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管显示数码;
uchar flag=0;//用来控制拍数循环;
uchar mode=0;//用来标志工作模式;
uchar num_speed;//用来表示速度;
uint step;//用来计算步数;
/******************函数声明部分**********************/
void delayms(uint);//延时函数;
void display(uint);//数码管显示函数;
void keyscan();//按键检测函数;
void motor();//电机运转函数;
/******************主函数**********************/
void main()
{
while(1)
{
keyscan();//按键读入设置的工作模式;
motor();//电机启动;
display(step);//显示步数;
}
}
/******************数码管显示函数*********************/
void display(uint num)
{
uchar qian,bai,shi,ge,t;
qian=num/1000;
bai=(num/100)%10;;
shi=(num/10)%10;
ge=num%10; //分离出每一位;
for(t=num_speed;t>0;t--)
{
P0=seg[qian]; //千位;
wela1=0;
delayms(5);
wela1=1;
P0=seg[bai]; //百位;
wela2=0;
delayms(5);
wela2=1;
P0=seg[shi]; //十位;
wela3=0;
delayms(5);
wela3=1;
P0=seg[ge]; //个位;
wela4=0;
delayms(5);
wela4=1;
}
}
/******************电机运转函数**********************/
void motor()
{
switch(mode)
{
case 1:P2=pfour[flag++];if(flag>=4) flag=0;step++;num_speed=10;break;
case 2:P2=peight[flag++];if(flag>=8) flag=0;step++;num_speed=10;break;
case 3:P2=nfour[flag++];if(flag>=4) flag=0;step++;num_speed=10;break;
case 4:P2=neight[flag++];if(flag>=8) flag=0;step++;num_speed=10;break;
case 5:P2=pfour[flag++];if(flag>=4) flag=0;step++;num_speed=65;break;
case 6:P2=peight[flag++];if(flag>=8) flag=0;step++;num_speed=65;break;
case 7:P2=nfour[flag++];if(flag>=4) flag=0;step++;num_speed=65;break;
case 8:P2=neight[flag++];if(flag>=8) flag=0;step++;num_speed=65;break;
case 9:P2=pfour[flag++];if(flag>=4) flag=0;step++;num_speed=40;break;
case 10:P2=peight[flag++];if(flag>=8) flag=0;step++;num_speed=40;break;
case 11:P2=nfour[flag++];if(flag>=4) flag=0;step++;num_speed=40;break;
case 12:P2=neight[flag++];if(flag>=8) flag=0;step++;num_speed=40;break;
default: ;
}
}
/******************按键检测函数**********************/
void keyscan()
{
uchar temp;
while(k2) {mode=0;step=0;P2=0xef;} //停止,绿灯亮;
led_green=1; //启动,绿灯灭;
temp=P1&0xfc; //P1口取高六位有效;
switch(temp)
{
case 0x54: mode=1;break;//正向四拍加速运行;
case 0x94: mode=2;break;//正向八拍加速运行;
case 0x44: mode=3;break;//反向四拍加速运行;
case 0x84: mode=4;break;//反向八拍加速运行;
case 0x58: mode=5;break;//正向四拍减速运行;
case 0x98: mode=6;break;//正向八拍减速运行;
case 0x48: mode=7;break;//反向四拍减速运行;
case 0x88: mode=8;break;//反向八拍减速运行;
case 0x5c: mode=9;break;//正向四拍常速运行;
case 0x9c: mode=10;break;//正向八拍常速运行;
case 0x4c: mode=11;break;//反向四拍常速运行;
case 0x8c: mode=12;break;//反向八拍常速运行;
}
}
/****************毫秒延时***************/
void delayms(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
本科生课程设计成绩评定表
展开阅读全文