资源描述
摘要
8051单片机控制步进电机进行简单的转速控制,包括启停变换转速控制等。利用利用DP-51PRO.NET单片机实验箱以模拟电压提供电机转速设定值,使用并行模数转换芯片ADC0809 进行电压信号的采集和数据处理转换得到速度给定的数字量,通过单片机的P1 口控制步进电机的控制端,使其按一定的控制方式进行转动。调节步进电机转速,使其与给定值相当,最后,利用ZLG7290模块驱动LED数码管显示速度设定值。通过这个单片机控制系统的设计来掌握A/D转换的原理,了解步进电机的工作原理,掌握它的转速控制方式和调速方法,并且掌握LED显示原理和ZLG7290模块的使用方法,用LED数码管显示模数转换的结果,设计电路的硬件接线图和实现上述要求的程序。最后实现通过改变模拟电压就可以改变步进电机的转速控制,并且在LED数码管上显示步进电机的转速这一功能。
关键词:51单片机 调速 步进电机 LED显示
绪论
在进行51单片机的学习和实验过程中曾利用51单片机对步进电机进行过简单的控制,包括利用DP-51PRO.NET单片机试验箱对步进电机进行转角控制,方向控制等。即按照设定的转动角度步进电机进行动作,来实现步进电机的实时控制,通过设定的方向来实现步进电机的方向反转控制等,并利用利用ZLG7290模块驱动LED数码管显示步进电机的设定值与步进电机实际所转过过的角度,同时显示步进电机的旋转方向等。
这次所进行的步进电机转速控制系统是对步进电机的另一种控制,即实现步进电机的转速控制而不是单单的转动角度控制,并且是通过模拟量输入来时时的控制步进电机的转速。并且通过数码管来显示出所设定的步进电机的转速。
第一章 系统程序及分析
1.1对步进电机控制系统的设计要求进行设计,主程序程序如下:
#include<reg51.h>
#include"VIIC_C51.h"
#include"zlg7290.h"
sbit PA=P1^0;
sbit PB=P1^1;
sbit PC=P1^2;
sbit PD=P1^3;
sbit SDA=P1^7;
sbit SCL=P1^6;
sbit RST=P1^4;
sbit KEY_INT=P1^5;
unsigned char xdata *port;
unsigned char count,count1=0,c[3],n;
/*****************ADC0809*******************************************/
int1()interrupt 2
{count=*port;
*port=0;
}
/*******************************************************************/
/*****************延迟函数*****************************************/
delay(unsigned int t)
{unsigned int i;
for(i=0;i<t;i++)
{TMOD=0X11;
TH0=-500/256;
TL0=-500%256;
TR0=1;
while(TF0!=1);
TF0=0;
}
}
/*****************脉冲函数********************************************/
time1()interrupt 3
{
if(count==0X00)
count1=4;
TH1=-3*1000000/(256*count);
TL1=-3*1000000%(256*count);
switch(count1)
{ case 0:{PA=1;PB=1;PC=0;PD=0;}break;
case 1:{PA=0;PB=1;PC=1;PD=0;}break;
case 2:{PA=0;PB=0;PC=1;PD=1;}break;
case 3:{PA=1;PB=0;PC=0;PD=1;}break;
default:{PA=0;PB=0;PC=0;PD=0;}
}
count1++;
if(count1>=4)
{count1=0;
}
}
/************************主函数*******************************************/
main()
{ RST=0;
delay(1);
RST=1;
delay(10);
port=0x7ff8;
EA=1;
ET1=1;
ET0=1;
TMOD=0X11;
TH1=-100000/256;
TL1=-100000%256;
TR1=1;
EX1=1;
IT1=1;
*port=0;
while(1)
{
c[0]=count/100;
c[1]=count%100/10;
c[2]=count%10;
for(n=0;n<3;n++)
ZLG7290_SendCmd(0x60+(2-n),c[n]);
}
}
1.2程序分析:
程序的开头包含了3个头文件,第一个头文件<reg51.h>中对所有的特殊功能寄存器进行了SFR定义,只要引用了<reg51.h> 就可以直接引用特殊功能寄存器名。第二个头文件"VIIC_C51.h"是使用IIC总线所要求的头文件,第三个头文件"zlg7290.h"是使用zlg7290驱动模块所要求的头文件。
单片机使用的是12兆晶振,它的P1.0~P1.3口是送出驱动步进电机的驱动信号,P1.4~P1.7口是设置zlg7290驱动模块所用到的端口。
函数int1()interrupt 2用到了外部中断1功能是时时对模拟信号进行转换,将模拟信号转换成0~255的数字信号。当转换完成后进入该中断函数将转换结果送出。与单片机的接线图如下所示:
ALE
~
273
1
~
D0
D7
Q0
Q1
Q2
373
G
1
INT1
P0
8XX51
RD
WR
CLK
Q
ALEEEEEEEE
D
Q
ALE
ADDA
ADDB
ADDC
START
EOC
~
D0
D7
OE
CLK
IN0
IN7
VREF+
VREF-
VCC
GND
ADC08099999
8
8
P2.7
+5V
1
1
延迟函数delay(unsigned int t)利用定时器0进行单片机延时功能设计,实现tms的有参延时函数功能。
脉冲函数time1()interrupt 3来实现驱动步进电机脉冲的发送工作。其中count是数模转换后的0~255的数字信号,需要将它转换成驱动步进电机的脉冲发送频率,即定时器的定时时间,从而满足步进电机的转速与所设定的转速相等。DP-51PRO.NET单片机试验箱的步进电机按照双四拍:AB→BC→CD→DA→AB控制,步进电机步距角18度,即18度/步,根据步进电机的结构特点及原理有步进电机的转速公式为:,其中为步进电机的步距角,为电脉冲的频率。( 其中设定转速值 count=n,=18),从而有电脉冲的发送频率为= ,脉冲函数定时器的定时时间为 由于单片机采用12兆晶振,故定时器需要记个脉冲。即TH1=-3*1000000/(256*count), TL1=-3*1000000%(256*count);
主函数main()里进行了一些初始的设置,在while循环里设置了显示程序,时时的显示步进电机的转速。
第二章 设计时出现的问题及解决方案
2.1 步进电机不能转动
开始调试时发现程序运行时步进电机不能够转动,考虑到可能是脉冲没有发送出来,最后检查了一下脉冲发送函数,是脉冲发送循环不正确,错误的if语句导致脉冲循环不正确,错误的if语句是:if(count1>=3) {count1=0;},导致最后一个脉冲始终没有。最后改成if(count1>=4) {count1=0;},实现了正确的脉冲发送顺序,步进电机顺利的旋转起来了。
2.2步进电机的转速不能正常停止
经过初步的调试,步进电机已经能够按照模拟量的控制来实现步进电机的转速的控制,并且能够实现转速在数码管的时时显示转速,但是当给定步进电机的模拟量的给定值为0时步进电机不能够停止,还有微量的转速,经过解决发现是由于定时器TH1=-3*1000000/(256*count), TL1=-3*1000000%(256*count);有误差,这是由单片机的位数决定的,计算结果是有一定误差的。为解决步进电机停止问题在脉冲发送函数中做了如下修改:
具体的脉冲发送函数如下:
time1()interrupt 3
{if(count==0X00)
count1=4;
TH1=-3*1000000/(256*count);
TL1=-3*1000000%(256*count);
switch(count1)
{ case 0:{PA=1;PB=1;PC=0;PD=0;}break;
case 1:{PA=0;PB=1;PC=1;PD=0;}break;
case 2:{PA=0;PB=0;PC=1;PD=1;}break;
case 3:{PA=1;PB=0;PC=0;PD=1;}break;
default:{PA=0;PB=0;PC=0;PD=0;}
}
count1++;
if(count1>=4)
count1=0;}
修改部分为:
在函数里增加了if(count==0X00) count1=4;条语句,和在switch里增加了一条语句default:{PA=0;PB=0;PC=0;PD=0;},当给定模拟电压为0时,直接不发送脉冲,从而实现了步进电机的停止控制。
最后,对程序进行了一些小的调整,和完善成功的实现了全部的功能,顺利的完成了设计要求。
展开阅读全文