欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-11 16:02:40
...

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

原理图

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

代码

/*	名称:直流电机测速
    说明:数码管显示的正反转状态与转速值应与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;	
}
//************************************//