基于单片机的步进电机转速控制Word文档格式.docx
《基于单片机的步进电机转速控制Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的步进电机转速控制Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
步进电机是一种将电脉冲转化为角位移的执行机构。
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;
同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
本次课程设计就是通过改变脉冲频率来调节步进电机的速度的,并且通过数码管显示其转速的级别。
另外通过单片机实现它的正反转,步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。
2系统方案及原理
2.1系统设计方案
该步进电机调速系统主要具有电机启停、调速、正反转控制和显示功能,现将该步进电机调速控制系统实现的所有功能的具体步骤整理如下:
(1)步进电机启停功能。
单片机预设初值,预设初值脉冲发送给驱动器,驱动步进电机按预设的最低速运行。
(2)步进电机调速功能。
将产生的不同频率和脉宽的脉冲信号输入到驱动器中,驱动电机在单位时间内转动若干个步角距。
(3)步进电机转向控制。
通过改变步进电机绕组的通电相序,改变转子的转向,从而实现步进电机的正反转控制功能。
(4)复位功能。
通过复位单片机,使单片机输出的脉冲复位为预设初值,从而使步进电机复位为预设最低速度运行。
(5)显示功能。
通过在四位一体数码管中显示设定步进电机目前的转速和转向。
2.2自动浇花系统原理
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。
使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
正常情况下,步进电机转过的总角度和输入的脉冲数成正比;
连续输入一定频率的脉冲时,电动机的转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。
系统是单片机控制,整个设计的电压是5v,所以电机的电压也要选择5v可以驱动的,所以本实验选择28BYJ-48步进电机作为设计对象,步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。
当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。
每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
当通电状态的改变完成一个循环时,转子转过一个齿距。
原理框图如图1。
图1步进电机控制系统原理框图
3市场调研及硬件设计
3.1市场调研
认真分析了题目所要求的功能后,进行了系统设计。
对方案进行了仿真实验,并对所需的器件进行了市场调研,通过不同的途径,包括淘宝店、天猫购物、实体店,对比分析后,最优方案是通过淘宝店购买元器件。
主要的元器件罗列如表1。
表1硬件电路板主要元器件
序号
名称
型号
数目
单价(元)
1
数码管
3641BS共阳
1.60
2
电容
100uf/25V
0.04
10uf/25V
30pf/50V
0.01
3
电源接口
DC-013直插
0.03
4
轻触开关
6*6*5直插式
5
电阻
10K
0.02
1K
8
6
发光二极管
LED
0.05
7
步进电机
28BYJ48
3.25
三极管
8550
0.06
9
单片机
STC89C51RC
2.80
10
电机驱动
ULN2003
0.75
11
插座
DIP40
0.25
DIP16
0.15
12
晶振
DS12.000MHz
0.21
通过硬件电路搭建后,完成实物电路板的焊接过程,实物图见附录A。
3.2电路原理图
从控制系统的大小和复杂度出发,必须考虑单片机的基本参数和增强功能。
前者往往需要考虑芯片的速度,ROM容量,I/O引脚数量和工作电压(1.8V/3V/5V)等,后者则包括是否拥有看门狗,双指针,双串口,实时时钟,CAN接口,SPI接口,USB接口等附加模块。
本设计中受控对象只有超声波、声光报警,复杂度低,采用低端的通用的单片机芯片就能够满足要求。
P0口为四位一体数码管的段选。
P1.0为步进电机启停按键定义,P1.1为步进电机正反转按键定义,P3.0为步进电机加速按键定义,P3.1为步进电机减速按键定义,P2.0、P2.1、P2.2、P2.3为四位一体数码管的位选。
P2.7、P2.6、P2.5、P2.4为脉冲信号输入端定义,原理图如图2。
图2系统原理图
4硬件调试及分析
4.1Proteus软件仿真
在实物制作前,需要首先在Proteus仿真软件中对电路进行设计(即对硬件电路图进行合理的搭配,如图2),通过仿真软件测试电路与编译的程序相配合,检查外围电路设计是否合理,程序编译是否正确,以及软件和硬件是否能够正常配合工作,实现设计中的要求,若仿真电路没有问题,就可以在实际电路中对实物进行焊接制作。
我选择单片机仿真软件Proteus8.2仿真以及Keil4编译。
源程序见附录B。
4.2按键电路
按键操作在四位一体数码管上显示步进电机的转速和转向,有启停按键,正反转按键以及加减速按键,如图3。
图3按键电路图
4.3显示电路
检测到土壤湿度湿度和预先设置的上下限值,显示在液晶显示屏上,如图4。
图4步进电机一档速正转
4.4驱动电路
STC89C51RC的P2口作为驱动电路的控制引脚,P2输入高电平时,对应的输出为0,LED灯亮,步进电机转动,水泵工作;
P2口输入低电平时,对应输出为1,LED灯熄灭,步进电机停止转动,如图5。
图5驱动电路
5总结
在把理论设计转换成实物的整个过程,如:
电路设计、分析计算、画电路图、焊接电路、检查调试、软件流程控制设计分析、编写调试软件、烧写软件到整个软硬件系统的调试,最后直到系统完成。
其中整个系统的前期准备是首先必须做到位的,如控制什么、用什么控制、得到什么结果,进而对各部分应选择具体的芯片作进一步的考虑,以使系统得到最优的表现。
通过本课题,一方面我在查阅资料的基础上,了解STC89C51单片机控制的一些基本技术,掌握其控制系统的分析方法与实现方法,能对单片机外围电路设计进行系统学习与掌握;
另一方面,在设计步进电机控制系统的硬件电路,控制程序和相应的电路图时,应充分运用说学知识,善于思考,琢磨,分析。
我们的学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。
学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。
这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。
参考文献
[1]王思明,张金敏,苟军年.单片机原理及应用系统设计[M].北京:
科学出版社,2012.
[2]周润景,刘晓霞.基于PROYEUS的电路设计、仿真与制板[M].北京:
电子工业出版社,2013.8.
[3]潭浩强.C语言程序设计.清华大学出版社[M].2005.07.
[4]张毅刚,MCS-51单片机应用设计[M].哈尔滨工业大学出版社.2004.
[5]刘乐喜.微机计算机接口技术及应用[M].华中科技大学出版社.2005.08.
[6]冯博琴.微型计算机原理与接口技术[M].清华大学出版社.2004.
附录A实物图
附录B源程序
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineledP0//数码管段选
#definehahaP2
sbits1=P1^0;
sbits2=P1^1;
sbits3=P3^0;
sbits4=P3^1;
//按键定义,s1正转,s2反转,s3加1,s4减1
sbitwei3=P2^3;
sbitwei2=P2^2;
sbitwei1=P2^1;
sbitwei0=P2^0;
//数码管位选定义
sbita=P2^7;
sbitb=P2^6;
sbitc=P2^5;
sbitd=P2^4;
//脉冲信号输入端定义
ucharcodedisplay[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//共阳数码管驱动信号0---9,不显示
ucharcodetime_counter[10][2]={{0xda,0x1c},{0xde,0xe4},{0xe1,0xec},{0xe5,0xd4},{0xe9,0xbc},//9.7----1ms
{0xed,0xa4},{0xf1,0x8c},{0xf5,0x74},{0xf9,0x5c},{0xfc,0x18}};
ucharcodequdong[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};
ucharnum1=0;
//控制取励磁信号变量
ucharnum2=8;
uchark=1;
//加减档位控制,1为最小档
bitflag1=0;
//初始正转,正反转标志
ucharbuf[4]={0,10,10,1};
//数码管显示缓存,正转,不显示,不显示,显示1档位,高----低
//================================定时器0/1初始化函数================================
voidT0_T1_init()
{
TMOD=0x11;
//定时器0/1均工作于方式1,16位计时方式
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
//定时器0,定时4ms用于数码管扫描显示
TH1=time_counter[k-1][0];
TL1=time_counter[k-1][1];
//定时器1,定时10ms用于步进电机转速控制
TR0=1;
TR1=1;
ET0=1;
ET1=1;
//开定时器中断
EA=1;
//开总中断
}
//================================ms级延时函数=======================================
voiddelay1m(uintx)
uinti,j;
for(i=0;
i<
x;
i++)//连数x次,约xms
for(j=0;
j<
120;
j++);
//数120次,约1ms
}
//================================主函数=============================================
voidmain()
T0_T1_init();
buf[1]=10;
//不显示
while
(1)
{
if(s1==0)
{
delay1m(3);
if(s1==0)
{
flag1=0;
//正转
buf[0]=0;
//最高位显示0
haha=0x00;
//停止
{
k--;
if(k==0)
k=10;
}
buf[2]=k/10;
buf[3]=k%10;
}
flag1=1;
//反转
buf[0]=1;
//最高位显示1
}
while(!
s2);
}
if(s3==0)//速度加1档
if(s3==0)
k++;
if(k>
10)
{
k=1;
buf[2]=k/10;
buf[3]=k%10;
}
s3);
if(s4==0)//速度减1档
if(s4==0)
s4);
}
//==================================定时器0中断函数,用于数码管扫描显示====================================
voidtime0_interrupt()interrupt1
staticnum=0;
switch(num)
case0:
wei3=1;
wei2=1;
wei1=1;
wei0=0;
led=display[buf[3]];
break;
case1:
wei1=0;
wei0=1;
led=display[buf[2]];
case2:
wei2=0;
led=display[buf[1]];
case3:
wei3=0;
led=display[buf[0]];
}
num++;
if(num==4)num=0;
//==================================定时器1中断函数,用于脉冲频率控制=====================================
voidtime1_interrupt()interrupt3
{
staticnum1=0;
staticnum2=0;
TH1=time_counter[k-1][0];
//定时器1,定时1用于步进电机转速控制
if(flag1==0)//正转
switch(num1)
case0:
a=1;
b=0;
c=0;
d=0;
case1:
b=1;
case2:
a=0;
case3:
c=1;
case4:
case5:
d=1;
case6:
case7:
num1++;
if(num1==8)num1=0;
else//反转
switch(num2)
num2++;
if(num2==8)num2=0;