资源描述
江南大学单片机课程设计报告
———————————————————————————————— 作者:
———————————————————————————————— 日期:
2
个人收集整理 勿做商业用途
江南大学
物联网工程学院
课程设计报告
课程名称: 单片机原理及应用
设计题目:基于单片机的步进电机控制器设计
班 级:自动化
姓 名: 学 号:
指导教师:吴定会 评 分:
2013年 7 月 1 日
目 录
一、设计目的……………………………………………………………………………………….3
二、设计要求……………………………………………………………………………………….3
三、仪器设备……………………………………………………………………………………….3
四、硬件线路图及主要芯片说明…………………………………………………………….。3
1)28BYJ-48四相八拍步进电机………………………………………………………………4
2)ULN2003…………………………………………………………………………………………5
3)三极管8550…………………………………………………………………………………….6
4)PCB80C51BH—2P…………………………………………………………………………….。.7
5)DPY_7—SEG_DP………………………………………………………………………………..8
6)硬件线路图……………………………………………………………………………………。10
五、系统工作原理……………………………………………………………………………….11
六、程序框图……………………………………………………………………………………。.14
七、程序清单……………………………………………………………………………………。。15
八、设计体会……………………………………………………………………………………。.18
基于单片机的步进电机控制器设计
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的.
通常电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转一个角度。转子也随着该磁场转一个角度.每输入一个电脉冲,电动机转动一个角度前进一步。它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。改变绕组通电的顺序,电机就会反转。所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。
● 设计目的
通过具体小型测试系统设计,实践单片机系统设计及调试的全过程,以加深对单片机内部结构、功能和指令系统的理解,并进一步学习单片机开发系统的应用及一些外围芯片的接口和编程方法,初步掌握单片机系统的硬、软件设计技术及调试技巧。
● 设计要求
1) 电机转速可以平稳控制
2)通过键盘和显示器可以设置电机的转速
3)显示电机的速度趋势
● 仪器设备
1、STC89C52RC单片机芯片 一片
2、ULN2003驱动芯片 一片
3、MT03641BR八位共阳数码管芯片 一片
4、8550PNP 四个
5、不同阻值电阻 若干
6、30pF电容 两个
7、12M晶振 一个
8、按键 四个
9、28BYJ—48电机 一个
10、+5V电源 一个
● 硬件线路图及主要芯片说明
◇28BYJ-48四相八拍步进电机
主要技术参数
相数:四相
电压:5VDC
电流:92mA
电阻:130Ω
步距角:5.625°
空载牵出频率:800pps
空载牵入频率:500pps
减速比:1/64
牵入转矩:≥78.4mN。m
接线指示:A(橙)、B(黄)、C(蓝)、D(灰)、E(红,中点接+5V)
28BYJ—48图
A
AB
B
BC
C
CD
D
DA
0x01
0x03
0x02
0x06
0x04
0x0c
0x08
0x09
四相八拍相序表
如果需要电机正转,只需要从A—AB-B—BC-C—CD-D—DA依次通电即可,反转,则需要反过来依次通电。
◇ULN2003
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。输入5VTTL电平,输出可达500mA/50V。ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。 该电路的特点如下: ULN2003的每一对达林顿都串联一个2。7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。
ULN2003芯片引脚图
引脚1:CPU脉冲输入端,端口对应一个信号输出端。
引脚2:CPU脉冲输入端。
引脚3:CPU脉冲输入端。
引脚4:CPU脉冲输入端.
引脚5:CPU脉冲输入端。
引脚6:CPU脉冲输入端。
引脚7:CPU脉冲输入端。
引脚8:接地。
引脚9:该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极.用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。
引脚10:脉冲信号输出端,对应7脚信号输入端.
引脚11:脉冲信号输出端,对应6脚信号输入端。
引脚12:脉冲信号输出端,对应5脚信号输入端。
引脚13:脉冲信号输出端,对应4脚信号输入端。
引脚14:脉冲信号输出端,对应3脚信号输入端.
引脚15:脉冲信号输出端,对应2脚信号输入端。
引脚16:脉冲信号输出端,对应1脚信号输入端。
ULN2003的输出端可达500mA/50V。 输出端的二极管学名续流二极管,英文freewheel diode。如果ULN2003的达林顿管输入端输入低电平使其截止,其驱动的元件是感性元件,则电流不能突变,此时会产生一个高压;如果没有二极管,达林顿管会被击穿,所以这个二极管主要起保护作用. 由于ULN2003是集电极开路输出,为了让这个二极管起到续流作用,必须将COM引脚(pin9)接在负载的供电电源上,只有这样才能够形成续流回路。
ULN2003是一个非门电路,包含7个单元,单独每个单元驱动电流最大可达350mA,9脚可以悬空。
◇三极管8550
三极管8550是一种常用的普通三极管。 它是一种低电压,大电流,小信号的PNP型硅三极管。
8550三级管参数
类型:开关型;
极性:PNP;
材料:硅;
最大集电极电流(A):0。5 A; 直流电增益:10 to 60; 功耗:625 mW;
最大集电极发射电压(VCEO):25;
频率:150MHz
8550引脚图
◇ PCB80C51BH—2P
80C51单片机属于MCS-51系列单片机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点,增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源。采用40引脚双列直插式DIP(Dual In Line Package),内有128个RAM单元及4K的ROM。80C51有两个16位定时计数器,两个外中断,两个定时计数中断,及一个串行中断,并有4个8位并行输入口。80C51内部有时钟电路,但需要石英晶体和微调电容外接,本系统中采用12MHz的晶振频率。由于80C51的系统性能满足系统数据采集及时间精度的要求,而且产品产量丰富来源广,应用也很成熟,故采用来作为控制核心。
80C51引脚图
Vss(20脚):接地
VCC(40脚): 主电源+5V
XTAL1(19脚):接外部晶体的一端。在片内它是振荡电路反相放大器的输入端.在采用外部时钟时,对于HMOS单片机,该端引脚必须接地;对于CHMOS单片机,此引脚作为驱动端。
XTAL2(18脚): 接外部晶体的另一端.在片内它是一个振荡电路反相放大器的输出端,振荡电路的频率是晶体振荡频率.若需采用外部时钟电路,对于HMOS单片机,该引脚输入外部时钟脉冲;对于CHMOS单片机,此引脚应悬浮.
RST(9脚): 单片机刚接上电源时,其内部各寄存器处于随机状态,在该脚输入24个时钟周期宽度以上的高电平将使单片机复位(RESET)
PSEN(29脚): 在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。PSEN端同样可驱动8个LSTTL负载。我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作.
ALE/PROG(30脚):在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号.CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。PSEN端同样可驱动8个LSTTL负载。我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作.
EA/VPP(31脚): 当EA端输入高电平时,CPU从片内程序存储器地址0000H单元开始执行程序。当地址超出4KB时,将自动执行片外程序存储器的程序。当EA输入低电平时,CPU仅访问片外程序存储器。在对87C51EPROM编程时,此引脚用于施加编程电压VPP。
输入/输出引脚:
(1)P0.0-P0。7 (39脚—32脚)
(2)P1.0-P1.7 (1脚—8脚)
(3)P2.0—P2。7 (26脚-21脚)
(4)P3.0—P3。7 (10脚—17脚)
◇DPY_7-SEG_DP
四位数码管是一种半导体发光器件,其基本单元是发光二极管。能显示4个数码管叫四位数码管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
驱动方式
1、静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动.静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
2、数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划”a,b,c,d,e,f,g,dp”的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动.在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
◇硬件线路图
21
本程序包括按键处理程序、显示处理程序、中断处理程序、数据处理程序四个主要部分
◇按键处理程序
按键处理安排在主程序当中,使其处于不断检测状态,当有按键按下能够及时对其进行相应的处理。同时,对于按键还应该进行消抖处理,避免系统误动作。其主要程序如下:
if(k1==0){delay(5); //延时消抖
if(k1==0){TR0=~TR0;k++;} //启动/停止
}while(!k1); // 等待按键释放
if(k2==0){delay(5); //延时消抖
if(k2==0)time=time-150;} // 加速
while(!k2); // 等待按键释放
if(k3==0){delay(5); //延时消抖
if(k3==0)time=time+150;} //减速
while(!k3);// 等待按键释放
if(k4==0){delay(5); //延时消抖
if(k4==0)f++;} // 正/反转
while(!k4); // 等待按键释放
◇中断处理程序
中断程序中安排对P1口赋值及对定时器重新装入初值,每次进入中断程序时,先判断是否执行反转,如是,则送反转编码,否则,送正转编码.其主要程序如下:
void timer0()interrupt 1
{
if(f%2){P1=FF[j++];if(j==8)j=0;} // f为奇数时代表反转,则送反转编码到P1口
else {P1=ZF[j++];if(j==8)j=0;} // 否则送正转编码到P1口
TH0=(65536—time)/256;
TL0=(65536-time)%256; //重新装初值
}
◇显示处理程序
显示程序则通过对相应数码管的通断,然后送段码。以这种方式来控制其动态显示,同时需要主要每个数码管都应该延时亮一段时间.并且要对其消隐。以获得较好的显示效果。其主要程序如下:
void display(uchar a,uchar b,uchar c,uchar d)
{
if(f%2)
{P2=0xfe;
P0=0xbf; //f为奇数时代表反转,则第一个数码管显示“-”,否则不显示
delay(1);
P0=0xff;} //消隐
P2=0xfd;
P0=SM[a]; //显示十位
delay(1);
P0=0xff; //消隐
P2=0xfb;
P0=SM[b]&0x7f; //显示个位(带小数点)
delay(1);
P0=0xff; //消隐
P2=0xf7;
P0=SM[c]; //显示小数点后第一位小数
delay(1);
P0=0xff; //消隐
P2=0xef;
P0=SM[d]; //显示小数点后第二位小数
delay(1);
P0=0xff; //消隐
}
◇数据处理程序
通过对数据进行处理来获得电机的转速,可以先计算出1ms时电机的速度,然后通过改变时间间隔来计算电机的转速.其主要程序如下:
void dispose()
{
temp1=14648/time;
h=temp1/10; //十位
w=temp1%10; //个位
temp2=14648%time;
p=temp2/1000; // 小数点后第一位小数
q=temp2%1000*10/1000; // 小数点后第二位小数
}
数据处理
按键处理
显示
中断
处理
STC89C52R
系统基本框架
根据以上四个主要部分来把整个系统划分成相应模块,有利于提高系统的抗干扰能力。能较好的保证系统运行的可靠。
● 程序框图
上电
初始化
电机运转
按键按 下
中断处理
判断
处
理
显示
正常运转
定时时间到
中断返回
相应动作做用电机
减速
加速
停止
否
等待处理
是
● 程序清单
/* 本程序采用STC89C52RC单片机,以3641八位共阳数码管显示步进电机的转速
趋势,步进电机采用28BYJ—48DC5V型号(采用四相八拍方式),采用ULN2003驱
动,数码管则直接采用PNP三极管驱动,电机的调节则通过按键控制 */
#include<reg52.h> //头文件
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
uchar code ZF[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正转编码表
uchar code FF[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //反转编码表
uchar code SM[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码表
sbit k1=P3^2; //定义K1为启动/停止按键
sbit k2=P3^3; //定义K2为加速按键
sbit k3=P3^4; //定义K3为减速按键
sbit k4=P3^5; //定义K4为正/反转按键
uchar j=0;
uint time=12000; //time为每两拍之间的间隔时间
uint temp2;
uchar temp1,h,w,p,q,f;
/*1ms延时函数(12M晶振下)*/
void delay(uchar z)
{
uchar s,v;
for(s=0;s<z;s++)
for(v=0;v〈125;v++) ; //一个for循环8个机器周期(125*8*1us=1ms)
}
/*显示函数*/
void display(uchar a,uchar b,uchar c,uchar d)
{
if(f%2)
{P2=0xfe; P0=0xbf; //f为奇数时代表反转,则第一个数码管显示“-”,否则不显示
delay(1);
P0=0xff;} //消隐
P2=0xfd;
P0=SM[a]; //显示十位
delay(1);
P0=0xff; //消隐
P2=0xfb;
P0=SM[b]&0x7f; //显示个位(带小数点)
delay(1);
P0=0xff; //消隐
P2=0xf7;
P0=SM[c]; //显示小数点后第一位小数
delay(1);
P0=0xff; //消隐
P2=0xef;
P0=SM[d]; //显示小数点后第二位小数
delay(1);
P0=0xff; //消隐
}
/*数值处理函数*/
void dispose()
{
temp1=14648/time;
h=temp1/10; //十位
w=temp1%10; //个位
temp2=14648%time;
p=temp2/1000; // 小数点后第一位小数
q=temp2%1000*10/1000; // 小数点后第二位小数
}
/*主函数*/
void main()
{
uchar k;
TMOD=0x01;//定义定时器0工作方式1
EA=1; // 开总中断
ET0=1; // 开定时器0中断
TH0=(65536—time)/256;
TL0=(65536-time)%256; //装定时器初值
TR0=1; //开定时器0
while(1)
{
if(k1==0){delay(5); //延时消抖
if(k1==0){TR0=~TR0;k++;} //启动/停止
}while(!k1); // 等待按键释放
if(k2==0){delay(5); //延时消抖
if(k2==0)time=time-150;} // 加速
while(!k2); // 等待按键释放
if(k3==0){delay(5); //延时消抖
if(k3==0)time=time+150;} //减速
while(!k3);// 等待按键释放
if(k4==0){delay(5); //延时消抖
if(k4==0)f++;} // 正/反转
while(!k4); // 等待按键释放
dispose();
if(k%2)
display(0,0,0,0); //停止时显示00。00
else
display(h,w,p,q);//正常运转时调用显示函数
}
}
/*定时器0中断处理函数*/
void timer0()interrupt 1
{
if(f%2){P1=FF[j++];if(j==8)j=0;} // f为奇数时代表反转,则送反转编码到P1口
else {P1=ZF[j++];if(j==8)j=0;} // 否则送正转编码到P1口
TH0=(65536—time)/256;
TL0=(65536—time)%256; //重新装初值
}
● 设计体会
步进电机调速系统适用各种现场自动化控制,特别应用于小功率负载的控制;具有成本底,性能稳定,可靠性高等优点。步进电机作为执行元件,在科技的进步中起到了非常重要的作用,而步进电机调速系统可方便地应用与各种自动化控制系统与领域。创新设计是对大学所学课程的一个高度的综合。无论是基础知识还是专业知识都被设计统一起来,使零散的知识系统化,形成了一种能力,这也是创新设计所要达到的目的。这也为我们走入社会打下一个良好的基础,为走入社会对知识与理论的应用做了一个好的铺垫。人生的路是漫长而曲折的,在这漫长而曲折的道路上需要自己的不断努力与拼搏。作为即将离校的学生,走出校门就站在另一个人生起点上,还有很长的路要走,这必须有足够的勇气与自信去迎接挑战,克服困难,创造奇迹。特别对未来要充满期盼,充满希望,要微笑着走人生的每一步。
总之,通过这次课程设计,让我对单片机的应用有了更深层次的理解,也提高自己逻辑思维能力,感觉从中获得了许多有价值的知识,也增加了自己对单片机的热爱。
展开阅读全文