1.设计要求

利用单片机实现对步进电机的控制,编写程序,用四路 I/O 口实现环形脉冲的分配,控制步进电机按固定方向连续转动。同时,要求按下“Positive(正转)”按键时,控制步进电机正转;按下“Negitive(反转)” 按键时,控制步进电机反转;按下“加速”按键时,控制步进电机加速;按下“减速” 按键时,控制步进电机减速。4位数码管,左边两位显示正反转,正转显示“11”,反转显示“00”,右边两位显示转速档次,步进电机的转速1~30档在右边两位数码管上显示。

1.设计意义:(项目应用领域及意义)

步进电机是一种受脉冲信号控制,并且能将脉冲信号转化为相应的角位移或者线位移的数字电动机。由于电源每次输入电脉冲给该电机,该电机就会前进一小步,转动的方式是步进式的,所以步进电机,由于电源输入的是脉冲式的电压,因此也被称为脉冲电动机。

在步进电机驱动范围内,其输出的角位移或线位移与输入的脉冲个数成正比,不因电源电压、负载变化和环境条件等的变化而变化。所以其输出的角速度或线速度也与输入的脉冲频率成正比,通过改变输入脉冲频率的高低就可以调节步进电机的转速,并能控制步进电机的快速启动,暂停,正反转和加减速等。

由于步进电机具有步距误差不积累,运行可靠,结构简单,成本低等特点,因此被广泛运用于计算机外围电路,自动化控制装置以及其他数字控制装置中,如打印机、钟表、数模转换设备中。

2.工作原理

①步进电机采用脉冲信号进行控制,每输入一次脉冲,就使步进电动机向前推进一步。

②步进电动机的转动步距角,是以电动机的结构为基准,按一定比例的比例来实现的。

③在实践中,电动机的转动步距角会有细微的差异,这是因为电动机的结构固定有问题,并且不会累积到总极数越多,对加工精度的要求也就越高。一般情况下,工业用混合步进电动机的步距角为1.8°,即200个极点。(相当于同步)

3.已实现的功能说明

按下51单片机中的k2键,步进电机会进行对应的加速,数码管的后两位会显示对应的0~30的速度值;按下51单片机中的k3键,步进电机会进行对应的减速,数码管的后两位会显示对应的0-30的速度值;按下51单片机中的k3键,步进电机会进行对应的进行反转,此时数码管前两位会对应的显示“00”;按下51单片机中的k5键,步进电机会进行对应的正转,此时数码管前两位会对应的显示“11”。

、设计方案 `

1.系统框图:

Android步进控件_51单片机

 2. 系统总电路

Android步进控件_51单片机_02

  1. 系统PCB图(可选):

首先绘制原理图:完成原理图后,需要用 ERC工具查错,直到没有原则性错误。其次设计组件封装:需要自己设计并建立新的组件封装库。最终设计 PCB 板:先画好 PCB 板的轮廓,确定工艺要求,接着把原理图传到PCB里,接着在网络表中布局和布线。

Android步进控件_proteus_03

#include <reg52.h>

#define dula P0		
sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;	

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; 
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};

sbit A1=P1^0; 
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit k1 = P3^4;
sbit k2 = P3^5;
sbit k3 = P3^6;
sbit k4 = P3^7;

#define Coil_CD1 {A1=1;B1=1;C1=0;D1=0;}
#define Coil_AD1 {A1=0;B1=1;C1=1;D1=0;}
#define Coil_AB1 {A1=0;B1=0;C1=1;D1=1;}
#define Coil_BC1 {A1=1;B1=0;C1=0;D1=1;}
#define Coil_A1 {A1=0;B1=1;C1=1;D1=1;}
#define Coil_B1 {A1=1;B1=0;C1=1;D1=1;}
#define Coil_C1 {A1=1;B1=1;C1=0;D1=1;}
#define Coil_D1 {A1=1;B1=1;C1=1;D1=0;}
#define Coil_OFF {A1=1;B1=1;C1=1;D1=1;}

float Speed=1;
bit StopFlag;
void Display(unsigned char num);
void Init_Timer0(void);

void delay(unsigned int xms)				
{
	unsigned int i,j;
	for(i=xms;i>0;i--)		      
		for(j=112;j>0;j--);
}

void  motor_ffw()
 { 
   unsigned char i;
   unsigned int  j;
  	for (j=0; j<64; j++)
    { 

      for (i=0; i<8; i++)
        {
					if(k3==0) P1 = FFW[i];  
		      if(k4==0) P1 = FFZ[i]; 
					Display(Speed); 
        }
     } 
 }

main()
{
 Init_Timer0();
 Coil_OFF;
 while(1)  
  { 
   if(k1 == 0)
	{
		delay(10);
		if(k1 == 0)
		{
			while(k1 == 0);
			if(Speed<30)
				Speed++;			
		}
	}
	else if(k2 == 0)
		{
			delay(10);
			if(k2 == 0)
			{
				while(k2 == 0);
				if(Speed>1)
	   				Speed--;
			}
		}
    else if(k3 == 0)
		{
			  delay(10);
			  Speed=0000;
	      motor_ffw();		
			}
	else if(k4 == 0)
	{
			delay(10);
			Speed=1100;
			motor_ffw();
	}
Display(Speed);
  }
}
void Display(unsigned int num)
{
		unsigned int qian,bai,shi,ge;
	   qian=num/1000;
       bai=num%1000/100;
		shi = num%1000%100/10;
		ge = num%1000%100%10;
	  
	   wei1=1;		
		wei2=0;
		wei3=0;
		wei4=0;
		P0=table[qian];
		delay(2);
	
	   wei1=0;	
		wei2=1;
		wei3=0;
		wei4=0;
		P0=table[bai];
		delay(2);

		wei1=0;		
		wei2=0;
		wei3=1;
		wei4=0;
		P0=table[shi];
		delay(2);
		
		wei1=0;	
		wei2=0;
		wei3=0;
		wei4=1;
		P0=table[ge];
		delay(2);
}
void Init_Timer0(void)
{
 TMOD |= 0x01;	 		     
 EA=1;          
 ET0=1;           
 TR0=1;           
}
void Timer0_isr(void) interrupt 1 		
{
 static unsigned char times,i;
 TH0=(65536-1000)/256;		
 TL0=(65536-1000)%256;
 
 if(!StopFlag)
   {
  if(times==(32-Speed))
   {
   times=0;
   switch(i)
       {
				case 0:Coil_A1;i++;break;
				case 1:Coil_B1;i++;break;
				case 2:Coil_C1;i++;break;
				case 3:Coil_D1;i++;break;
				case 4:i=0;break;
				default:break;
	   }
}
 times++;
}
}

硬件调试

 

Android步进控件_Android步进控件_04

Android步进控件_单片机_05

 

Android步进控件_单片机_06

Android步进控件_pcb工艺_07

 .仿真调试:

 

Android步进控件_proteus_08

 反转