资源描述
江南大学
物联网工程学院
课程设计汇报
课程名称: 单片机原理及应用
设计题目: 基于单片机步进电机控制器设计
班 级:
姓 名: 学 号:
指导老师: 评 分:
年 月 日
基于单片机步进电机控制器设计
摘要:本设计是用80C52单片机作为关键部件进行逻辑控制及信号产生,用单片机技术和C语言编程设计来进行步进电机控制。经过人手动按开关实现步进电机开启和停止、步进电机正转反转,加速及减速等功效,另外还有LCD数码管进行实时显示功效。同时本文也经过了proteus软件仿真,在仿真结果中能看出近似真实效果。经过proteus仿真,结果表明,系统实现了要求。该系统电路简单,可靠性强,运行稳定。
关键词:步进电机 单片机 LCD proteus仿真
1课题关键研究内容和要求
本设计采取单片机80C52来作为整个步进电机控制系统运动控制关键部件。所选步进电机是四相五线,因为步进电机需要高功率驱动,单片机不能和步进电机直接相连,所以我们需要采取了电机驱动芯片ULN连接步进电机和单片机。为了显示步进电机转速,我用数码管来显示速率。再加上部分独立按键来实现步进电机调速、改变转向功效。这么就组成了一个基础步进电机控制系统。系统具体功效和要求以下:
1、电机转速能够平稳控制;
2、经过键盘和显示器能够设置电机转速;
3、能显示电机运动趋势;
2所需仪器设备
所需器件
备注
所需器件
备注
STC89C52单片机
一片
12M晶振
一个
ULN驱动芯片
一片
按键
五个
八位共阳数码管芯片
一片
异步电机
一个
不一样阻值电阻
若干
+5V电源
一个
30pF电容
两个
3系统总体设计
本设计硬件电路包含独立按键控制模块、步进电机驱动模块、数码管显示模块和单片机最小系统四部分。单片机最小系统由时钟电路和复位电路组成,确保单片机正常运行;独立按键控制模块由开关和按键组成,当按下按键时,该系统就根据该按键控制功效运作;显示模块关键是为了显示电机工作状态和转速;驱动电路关键是对单片机输出脉冲进行功率放大,从而驱动电机转动。
因为步进电机受电脉冲控制,所以要求电脉冲信号产生,放大全部依靠电子元件来实现。而步进电机需要较大功率,而电子电路产生功率较弱,所以必需设计功率放大电路。此方法步进电机控制系统包含以下三个部分:信号产生电路,信号分配电路,功率放大电路。
在单片机引脚配置中,我选择是用P0口和P2口控制数码管显示,其中P0口控制数码管段,P2口控制数码管位。P1.0-P1.3控制电机驱动,P3.2-P3.5为按键输入。
图1 系统设计示意图
4硬件设计
4.1步进电机介绍
步进电机是将电脉冲信号转变为角位移或线位移开环控制元步进电机件。在非超载情况下,电机转速、停止位置只取决于脉冲信号频率和脉冲数,而不受负载改变影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定方向转动一个固定角度,称为“步距角”,它旋转是以固定角度一步一步运行。能够经过控制脉冲个数来控制角位移量,从而达成正确定位目标;同时能够经过控制脉冲频率来控制电机转动速度和加速度,从而达成调速目标。
图2 异步电机连线示意图
通常电机转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。该磁场会带动转子旋转一角度,使得转子一对磁场方向和定子磁场方向一致。当定子矢量磁场旋转一个角度。转子也伴随该磁场转一个角度。每输入一个电脉冲,电动机转动一个角度前深入。它输出角位移和输入脉冲数成正比、转速和脉冲频率成正比。改变绕组通电次序,电机就会反转。所以可用控制脉冲数量、频率及电动机各相绕组通电次序来控制步进电机转动。异步电机控制接线图为图2所表示。
步进电机有以下特点:(1)步进电机角位移和输入脉冲成正比,没有累计误差。(2)步进电机和驱动电路组成系统,简单而又廉价。(3)易于控制,能快速开启和停止,方便控制方向和转速。(4)步进电机不能直接使用交流直流电源。
4.2单片机介绍
采取STC89C52单片机是新一代高速/低功耗/超强抗干扰单片机,指令代码完全兼容传统8051单片机,12 时钟/机器周期和 6 时钟/机器周期能够任意选择。其关键特征以下:
(1)增强型 8051 单片机,6 时钟/机器周期和 12 时钟/机器周期能够任意选择,指令代码完全兼容传统 8051.
(2)工作电压:5.5V~3.3V(5V 单片机)/3.8V~2.0V(3V 单片机)
(3)工作频率范围:0~40MHz,相当于一般 8051 0~80MHz,实际工作频率可达 48MHz
(4)用户应用程序空间为 8K 字节
(5)片上集成 512 字节 RAM
(6) P1/P2/P3/P4 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。
(7) ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可经过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片
(8) 含有 EEPROM 功效
(9) 含有看门狗功效
(10) 共 3 个 16 位定时器/计数器。即定时器 T0、T1、T2
(11) 外部中止 4 路,下降沿中止或低电平触发电路,Power Down 模式可由外部中止低电平触发中止方法唤醒
(12) 通用异步串行口(UART),还可用定时器软件实现多个 UART
图3 STC89C52芯片引脚图
4.3单片机最小系统
单片机最小系统通常由时钟电路和复位电路组成。经过时钟电路提供单片机多种微操作基准,经过复位电路使单片机片内存放器初始化。由图4能够看出,时钟电路是在引脚XTAL1和XTAL2外部接一个十二兆晶振,同时在晶振两脚分别接了30pF电容。晶振作用是产生震荡时钟脉冲。电容起稳定震荡频率,快速起震作用。
复位电路使由独立按键,10k欧电阻和一个10Uf电容组成。复位电路使单片机从一个确定状态开始运行。
图4 单片机最小系统示意图
4.4电机驱动设计
此次设计用ULN来驱动步进电机,电路图图2所表示。经过单片机P1.0~P1.3输出脉冲到ULN1B~4B口,信号放大后从1C~4C出口分别输出到电机ABCD四相。
ULN输入只需要5V电平,不过输出能够高达50V,所以它含有工作电压高,电路增益高,能够提供大功率负载特点,适应于多种功率驱动电路。图5所表示为ULN引脚示意图。
图5 ULN引脚图
4.5显示电路设计
为了能看出步进电机转速,我们用显示电路数码管显示电机速度,关键是利用了单片机P0口接一个两位共阳极数码管。数码管a、b、c、d、e、f、g、dp分别接P0.0~P0.7口.数码管公共角3,4分别接p2.2,p2.3。
同时为了看出显示出电机正反转,利用数码管来显示出电机转动,同电机转速一样,利用单片机P0口接一个共阳极数码管。数码管a、b、c、d、e、f、g、dp分别接P0.0~P0.7口。数码管公共角1分别接p2.0。数码管部分连接电路图图6所表示。
图6 数码管连接图
4.6总体设计电路
把各个部分电路图组合成总电路图,以下图所表示:
图7 总体设计电路图
5软件部分
5.1主程序
经过上述分析我们发觉要实现系统功效,我们要设计一下多个模块程序:主程序,延时程序,按键子程序,数码管显示程序。为了实现操作灵活性,随时能够加速减速,我们采取定时器中止。当通电后,单片机首先检测正反转键是否按下,然后检测加减速按键是否也按下,同时数码管显示速度等级。当按一下正转或反转按键时候,电机开始转动。按下停止键电机立马停止转动。
进入主程序显示初始化状态,主程序由键盘程序、显示程序、步进电机驱动程序三部分组成,主程序首先初始化各变量,步进电机驱动各引脚均输出高电平,然后调用键盘程序,并作判定,有键按下,则调用键盘程序,并显示出状态。当我们给系统供入5V电压时,由复位电路给系统进行初始化。然后便开始实施按键查询等候对应操作,当有按键按下时,程序便调用并实施对应子程序,下图为主步骤图:
图8 主程序框图
5.2显示子程序
转速显示是给用户最直观概念,知道电机转快慢,知道电机目前转速,而需要怎样速度,再对它进行加减速。而这个显示是调用显示子程序。
显示程序则经过对对应数码管通断,然后送段码。以这种方法来控制其动态显示,同时需要关键每个数码管全部应该延时亮一段时间。而且要对其消隐。以取得很好显示效果。具体步骤图图9
图9 显示子程序框图
5.3 具体程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9代码
unsigned char code table1[]={0x03,0x06,0x0c,0x09};//正转
unsigned char code table2[]={0x09,0x0c,0x06,0x03};//反转
uint maichong;
uchar speed;
uchar flag;
sbit key_reset=P3^0;
sbit key_z=P3^1;
sbit key_f=P3^2;
sbit key_jia=P3^3;
sbit key_jian=P3^4;
void delay(uchar x)//延时
{ uchar i,j;
for(i=0;i<x;i++)
for(j=100;j>0;j--);}
void reset(void)
{flag=2;
speed=0;}
void display()
{
uchar A1,A2,A3,A4;
if(flag==0)
A1=0xc0; //显示0
else if(flag==1)
A1=0xf9;//显示1
else
A1=0x3f;//显示—
A2=0x3f;
A3=speed/10;
A4=speed%10;
P0=A1;//第一个数码管显示正反转
P2=0x01;
delay(1);
P2=0x00;
P0=A2;//第二个自定义显示—
P2=0x02;
delay(1);
P2=0x00;
P0=table[A3];//第三个显示转速等级十位
P2=0x04;
delay(1);
P2=0x00;
P0=table[A4];//第四个显示转速等级个位
P2=0x08;
delay(1);
P2=0x00;
}
void key()//按键判定
{
if(key_reset==0)
{
delay(5);
if(key_reset==0)
reset();}
if(key_z==0)
{
delay(5);
if(key_z==0)
{flag=0;speed=10;
while(key_z==0);}}
if(key_f==0)
{
delay(5);
if(key_f==0)
{
flag=1;
speed=10;
while(key_f==0);}}
if(key_jia==0)
{
delay(5);
if(key_jia==0)
{
speed++;
if(speed==21)
speed=20;
while(key_jia==0);}}
if(key_jian==0)
{
delay(5);
if(key_jian==0)
{
speed--;
if(speed<=0)
speed=0;
while(key_jian==0);}} }
void dispose()//控制电机旋转快慢
{if(speed==0)
flag=2;
else
maichong=240-speed*20;}
void zhuandong(void)
{uint i,j;
if(speed>0&&speed<=20)
{for(j=0;j<4;j++)//正反转实施
{if(flag==0)
P1=table1[j];
else
P1=table2[j];
for(i=0;i<maichong;i++)
display();}}}
void main()
{reset();
display();
for(;;)
{key();
dispose();
if(flag==2)
display();
else
zhuandong();
}}
6仿真和调试
6.1 仿真调试操作步骤
此次仿真软件采取是proteus,编程工具采取是keil,原理图设计采取是protel具体操作以下:
1) 在protel中画出系统电路图;
2) 编写程序并在keil中编译并生成hex文件;
3)在proteus中画出系统仿真电路图;
4) 把在keil中编译生成HEX文件载入proteus中89C52芯片中;
5) 运行仿真。
6.2仿真结果
这次设计比较成功,在经过了器件选择,软件仿真及调试后,步进电机能根据预先要求,实现按键控制电机复位、正转、反转、加速、减速五个操作。并对应地在LED上显示出象征性数字,从而直观地观察到电机转速改变。
仿真结果以下图所表示:
当点下proteusplay键时候,此时数码管显示速度为零,电机不转。
按下开启按键时,再按下正转或反转按键,系统开始开启,图显示为正转,初始速度被被设置为10,第一位0表示电机正,若电机反正则显示为1.
接下来假如再控制加减按键,能够实现对电机速度调整,并在数码管有个直观转速等级显示。
7总结
经过这次课程设计,让我对单片机有了一个更深入认识,对单片机应用愈加熟练,而且对步进电机有了一定了解,提升了我硬件和软件设计能力,从中学到了很多知识。在调试过程中,我明白了很多设计时细节问题,为以后设计打下基础。在设计过程中,查阅了相关资料,并将它们和自己实际问题相结合,锻炼了自己独立处理问题能力。
即使完成了设计,但因为对多种电机了解不够深入,查阅资料不够齐全,所以设计东西存在很多偏差和不足,比如:电机转速控制不够正确;转速测量不严密,只是象征性地显示转速。即使存在部分问题,不过我学习单片机热情不会改变,在以后学习过程中我将尽可能拓宽自己知识面,分析问题时尽可能做到面面俱到,设计出愈加好作品。
在整个过程中我明白了多个道理:首先,做学问要一丝不苟,要以科学态度对待问题,不能存在侥幸心理,出现了任何偏差全部不要轻视;其次,做任何事情之前,全部要有充足准备,正所谓“磨刀不误砍柴工”,这么话做事情才有效率;最终,做事要有耐心和毅力,不要碰到困难就退缩,要迎难而上,只有坚持下来人才是最终取得胜利人。
展开阅读全文