1、摘要8051单片机控制步进电机进行简单的转速控制,包括启停变换转速控制等。利用利用DP-51PRO.NET单片机实验箱以模拟电压提供电机转速设定值,使用并行模数转换芯片ADC0809 进行电压信号的采集和数据处理转换得到速度给定的数字量,通过单片机的P1 口控制步进电机的控制端,使其按一定的控制方式进行转动。调节步进电机转速,使其与给定值相当,最后,利用ZLG7290模块驱动LED数码管显示速度设定值。通过这个单片机控制系统的设计来掌握A/D转换的原理,了解步进电机的工作原理,掌握它的转速控制方式和调速方法,并且掌握LED显示原理和ZLG7290模块的使用方法,用LED数码管显示模数转换的结果
2、,设计电路的硬件接线图和实现上述要求的程序。最后实现通过改变模拟电压就可以改变步进电机的转速控制,并且在LED数码管上显示步进电机的转速这一功能。关键词:51单片机 调速 步进电机 LED显示 绪论在进行51单片机的学习和实验过程中曾利用51单片机对步进电机进行过简单的控制,包括利用DP-51PRO.NET单片机试验箱对步进电机进行转角控制,方向控制等。即按照设定的转动角度步进电机进行动作,来实现步进电机的实时控制,通过设定的方向来实现步进电机的方向反转控制等,并利用利用ZLG7290模块驱动LED数码管显示步进电机的设定值与步进电机实际所转过过的角度,同时显示步进电机的旋转方向等。这次所进行
3、的步进电机转速控制系统是对步进电机的另一种控制,即实现步进电机的转速控制而不是单单的转动角度控制,并且是通过模拟量输入来时时的控制步进电机的转速。并且通过数码管来显示出所设定的步进电机的转速。第一章 系统程序及分析1.1对步进电机控制系统的设计要求进行设计,主程序程序如下:#include#includeVIIC_C51.h#includezlg7290.hsbit PA=P10;sbit PB=P11;sbit PC=P12;sbit PD=P13;sbit SDA=P17;sbit SCL=P16;sbit RST=P14;sbit KEY_INT=P15;unsigned char xd
4、ata *port;unsigned char count,count1=0,c3,n;/*ADC0809*/int1()interrupt 2count=*port;*port=0;/*/*延迟函数*/ delay(unsigned int t) unsigned int i; for(i=0;i=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
5、=1; IT1=1; *port=0; while(1) c0=count/100;c1=count%100/10;c2=count%10;for(n=0;n3;n+) ZLG7290_SendCmd(0x60+(2-n),cn);1.2程序分析: 程序的开头包含了3个头文件,第一个头文件中对所有的特殊功能寄存器进行了SFR定义,只要引用了 就可以直接引用特殊功能寄存器名。第二个头文件VIIC_C51.h是使用IIC总线所要求的头文件,第三个头文件zlg7290.h是使用zlg7290驱动模块所要求的头文件。 单片机使用的是12兆晶振,它的P1.0P1.3口是送出驱动步进电机的驱动信号,P1.
6、4P1.7口是设置zlg7290驱动模块所用到的端口。 函数int1()interrupt 2用到了外部中断1功能是时时对模拟信号进行转换,将模拟信号转换成0255的数字信号。当转换完成后进入该中断函数将转换结果送出。与单片机的接线图如下所示:ALE2731D0D7Q0Q1Q2373G1INT1P08XX51RDWRCLKQALEEEEEEEEDQALEADDAADDBADDCSTARTEOCD0D7OECLKIN0IN7VREF+VREF-VCCGNDADC0809999988P2.7+5V11 延迟函数delay(unsigned int t)利用定时器0进行单片机延时功能设计,实现tms
7、的有参延时函数功能。脉冲函数time1()interrupt 3来实现驱动步进电机脉冲的发送工作。其中count是数模转换后的0255的数字信号,需要将它转换成驱动步进电机的脉冲发送频率,即定时器的定时时间,从而满足步进电机的转速与所设定的转速相等。DP-51PRO.NET单片机试验箱的步进电机按照双四拍:ABBCCDDAAB控制,步进电机步距角18度,即18度/步,根据步进电机的结构特点及原理有步进电机的转速公式为:,其中为步进电机的步距角,为电脉冲的频率。( 其中设定转速值 count=n,=18),从而有电脉冲的发送频率为= ,脉冲函数定时器的定时时间为 由于单片机采用12兆晶振,故定时
8、器需要记个脉冲。即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;,实现了正确的
9、脉冲发送顺序,步进电机顺利的旋转起来了。2.2步进电机的转速不能正常停止 经过初步的调试,步进电机已经能够按照模拟量的控制来实现步进电机的转速的控制,并且能够实现转速在数码管的时时显示转速,但是当给定步进电机的模拟量的给定值为0时步进电机不能够停止,还有微量的转速,经过解决发现是由于定时器TH1=-3*1000000/(256*count), TL1=-3*1000000%(256*count);有误差,这是由单片机的位数决定的,计算结果是有一定误差的。为解决步进电机停止问题在脉冲发送函数中做了如下修改: 具体的脉冲发送函数如下: time1()interrupt 3if(count=0X00
10、) 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时,直接不发送脉冲,从而实现了步进电机的停止控制。 最后,对程序进行了一些小的调整,和完善成功的实现了全部的功能,顺利的完成了设计要求。