Proteus实现编码器电机转速及方向检测

Proteus实现编码器电机转速及方向检测

  • 原理图
  • 代码

原理图

控制编码电机采用的是最简单的开关控制正反电压的输入,滑动变阻器控制电机转速,也可以采用数字IC去控制电机转速以及方向,如L298N电机驱动芯片。
Proteus实现编码器电机转速及方向检测_第1张图片

代码

/*	名称:直流电机测速
    说明:数码管显示的正反转状态与转速值应与motor encode器件上显示的值基本一致;
		  测量误差 ≤1RPM 。
*/

#include<reg51.h>
#include<intrins.h>		


sbit duan = P2^0;
sbit wei = P2^1;
sbit flag = P3^0; 		  //正反转标志位
unsigned char code mtable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
unsigned char code LED_W[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char data mnumber[]={0,0,0,0,0,0};	   //显示的符号与速度	
unsigned int data mcount=0;					  //脉冲数
unsigned int data mtime=0;	  
float cspeed=0;		  //当前速度   
float prespeed=0;  
void display(float mspeed);

void main()
{
//**********设置定时器T0工作方式和定时时间**********//	  	
	TMOD =0X01;	   //	 	
	TH0 =0X3C;
	TL0 =0XB0;	   
//**************************************************//			 	
	ET0=1;		  //允许T0产生中断	
	IT0=1;		  //外部中断0(P3.2)为边沿触发
	EX0=1;		  //允许外部中断0产生中断	  
 	TR0=1;		  //启动T0   	
	EX0=1;		  //允许外部中断0产生中断
	EA=1;		  //开总中断	

   while(1)
    {
       display(cspeed);	  
    }	
}

void display(float mspeed)
{  
		unsigned int temp_speed;	 	
		unsigned char i,j=30,mindex;	 	
		
		if ((mspeed>prespeed)||(mspeed<prespeed))
		{  		
		prespeed=mspeed;  		
		mspeed=mspeed*10;		
		temp_speed=mspeed;

		mnumber[1]=temp_speed/10000;   		
		mnumber[2]=(temp_speed%10000)/1000;	 
		mnumber[3]=(temp_speed%1000)/100;	
		mnumber[4]=(temp_speed%100)/10;	   
		mnumber[5]=temp_speed%10;					
		} 							
	
		for(i=0;i<6;i++){	
		
		P0=0;
		duan=1;	  duan=0;	   	
	
		P0=LED_W[i];		  
		wei=1;    wei=0;

		if(i>0)
		{  		   
			mindex=mnumber[i];
			P0=mtable[mindex];	   //显示数字  			
			if(i==4) P0=mtable[mindex]+0x80;  	//显示小数点			
		}

		else 
		{				
//**********电机正反转的判断与显示**********//	
         if(flag==1)              //反转-
		 { 	
			P0=0x40;			
		 }
		 else  P0=0x00;           //正转0

	
		
//******************************************//			   
		}	 		
		duan=1;
		duan=0;
		while(j--);	  	  			
		}	 			
}	   
//**********外部中断计脉冲数**********//
void int_0() interrupt 0
{
	mcount++;                       
}
//************************************//
//**********脉冲采样周期定时**********//
void timer0() interrupt 1
{
     ET0=0;	   	 
	 mtime++;
	 if(mtime==20)			//定时时间
	 {	
	    cspeed =(60*mcount)/(24*0.05*mtime);	//根据采样周期内产生的脉冲数,计算转速                                                
		mcount=0;                               //cspeed是采用编码器转速公式得出
	    mtime=0; 
	 }	 	  
	 TH0=0X3C     ;
	 TL0=0xB0     ;			    //重装初值
	 ET0=1;	
}
//************************************//			 		 

你可能感兴趣的:(嵌入式开发技术)