摘要
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 #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 /*****************脉冲函数********************************************/ 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个头文件,第一个头文件 单片机使用的是12兆晶振,它的P1.0~P1.3口是送出驱动步进电机的驱动信号,P1.4~P1.7口是设置zlg7290驱动模块所用到的端口。 函数int1()interrupt 2用到了外部中断1功能是时时对模拟信号进行转换,将模拟信号转换成0~255的数字信号。当转换完成后进入该中断函数将转换结果送出。与单片机的接线图如下所示: DCLALALP8 QQ ADC080CLADDADDADD8IN G27D~D ~ QQQ8XX537 D~D7IN+5VCVREFVREFGNINTWP2.R11 11 EO STARTALO 延迟函数 delay(unsigned int t)利用定时器0进行单片机延时功 能设计,实现tms的有参延时函数功能。 脉冲函数time1()interrupt 3来实现驱动步进电机脉冲的发送工作。其中count是数模转换后的0~255的数字信号,需要将它转换成驱动步进电机的脉冲发送频率,即定时器的定时时间,从而满足步进电机的转速与所设定的转速相等。DP-51PRO.NET单片机试验箱的步进电机按照双四拍:AB→BC→CD→DA→AB控制,步进电机步距角18度,即18度/步,根据步进电机的结构特点及原理有步进电机的转速公式为:n60f360,其中为步进电机的步距角,f为电脉冲 的频率。( 其中设定转速值 count=n,=18),从而有电脉冲的发送频率为f= 3count ,脉冲函数定时器的定时时间为 由于单片机采用 f106112兆晶振,故定时器需要记 3*count个脉冲。即 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时,直接不发送脉冲,从而实现了步进电机的停止控制。 最后,对程序进行了一些小的调整,和完善成功的实现了全部的功能,顺利的完成了设计要求。 因篇幅问题不能全部显示,请点此查看更多更全内容