⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 直流电机转速测控
💻 C
字号:
///========================================================
//	工程名称:	DC_SpeedCtrl
//	功能描述:	直流电机速度测量与调节
//	涉及的库:	CMacro1016.lib
//	组成文件:	main.c
//              isr.asm, Mychar, Key.asm, DCMotor.asm
//              SPLC501User.c,DataOSforLCD.asm, Key.inc, DCMotor.inc, SPCE061A.inc
//              ,Key.h, DCMotor.h, SPCE061A.h
//========================================================
//	文件名称:	main.c
//========================================================
#include "SPCE061A.h"
#include "DCMotor.h"

#include "Key.h"
#include "a2000.h"
#include "SPLC501User.h"
#include "Mychar.h"

#define SPEED_MAX	60								
#define	SPEED_MIN	20								
#define SPEED_STEP	2								

#define CP	8											
#define CI	3											
#define	CD	1

#define	M_RX_FLAG			0x80
#define M_TX_FLAG			0x40							

unsigned int g_Direction, g_Speed;					
 unsigned int uiRS_Buff;				
 unsigned int uiRS_ReciveFlag;		
void playspeed(unsigned int TempNum);

void InitUART(void)
{
	unsigned int iTest;		
    iTest = *P_IOB_Dir;
    iTest &= 0xff7f;
	*P_IOB_Dir = iTest;
	iTest = *P_IOB_Attrib;
	iTest |= 0x0080;
	*P_IOB_Attrib = iTest;
    *P_UART_BaudScalarLow = 0x00;
	*P_UART_BaudScalarHigh = 0x05;
	*P_UART_Command1 = 0x00;			
	*P_UART_Command2 = 0x80;			
	
}	
void DelayMS(unsigned ms)
{
	unsigned i;
	while(ms--)	
	{
		for(i = 0; i < 1044; i++)
			*P_Watchdog_Clear = 1;
	}
}

void System_Init(void)
{
	*P_SystemClock = C_Fosc_49M|C_StrongMode;			
    DCMotor_Init();
	Key_Init();
	g_Direction = 1;									
	g_Speed = 40;
	LCD501_Init(0x00);
    LCD501_Circle(30,30,30,1);		
	DelayMS(200);
	LCD501_SetPaintMode(3);			
	LCD501_Line(1,30,127,30);		
	DelayMS(200);
	LCD501_Bitmap(0,15,(unsigned int *)encoding_02);		
	LCD501_Bitmap(16,15,(unsigned int *)encoding_03);		
	LCD501_Bitmap(32,15,(unsigned int *)encoding_12);
	LCD501_Bitmap(48,15,(unsigned int *)encoding_13);		
	DelayMS(2000);									
	DelayMS(1000);
    LCD501_ClrScreen(0); 
	LCD501_SetPaintMode(0);
	LCD501_Bitmap(2,0,(unsigned int *)encoding_00);		
	LCD501_Bitmap(35,0,(unsigned int *)encoding_01);	
	LCD501_Bitmap(68,0,(unsigned int *)encoding_02);	
	LCD501_Bitmap(101,0,(unsigned int *)encoding_03);	
	LCD501_Bitmap(2,48,(unsigned int *)encoding_04);
	LCD501_Bitmap(35,48,(unsigned int *)encoding_05);
	LCD501_Bitmap(68,48,(unsigned int *)encoding_06);
	LCD501_Bitmap(101,48,(unsigned int *)encoding_07);
    InitUART();

}


const unsigned int DigNum[]={'0','1','2','3','4','5','6','7','8','9'};	

void DispNum(unsigned int Num)
{
	unsigned int TempNum = Num, k;
	if(Num>=10000)										
	{
		k = TempNum/10000;
		LCD501_PutChar(30,24,DigNum[k]);
		TempNum = TempNum - k * 10000;
	}								      	
	if(Num>=1000)									
	{
		k = TempNum/1000;
		LCD501_PutChar(44,24,DigNum[k]);
		TempNum = TempNum - k * 1000;
		LCD501_PutChar(60,24,'.');
	}
	if(Num>=100)										
	{
		k = TempNum/100;
		LCD501_PutChar(70,24,DigNum[k]);
		TempNum = TempNum - k * 100;
	}
	if(Num>=10)											
	{
		k = TempNum/10;
	   LCD501_PutChar(80,24,DigNum[k]);
		TempNum = TempNum - k * 10;
	}
	LCD501_PutChar(90,24,DigNum[TempNum]);
			
}



void DIGclear(void)
{
	LCD501_PutChar(90,24,' ');
	LCD501_PutChar(80,24,' ');
	LCD501_PutChar(70,24,' ');
	LCD501_PutChar(60,24,' ');
	LCD501_PutChar(50,24,' ');
	LCD501_PutChar(44,24,' ');
	LCD501_PutChar(30,24,' ');
}

int DCMotor_Speed_PID(int SetSpeed, int CurSpeed)
{
	int e0, u0;
	static int u1 = 0;									
	static int e1 = 0, e2 = 0;
	
	e0 = SetSpeed - CurSpeed;							
	u0 = u1 											
		 + CP * (e0 - e1)								
		 + CI * e0										
		 + CD * (e0 - e1 - e1 + e2);					
	
	if(u0 > 1023) u0 = 1023;							
	if(u0 < 16) u0 = 16;								

	u1 = u0;											
	e2 = e1;
	e1 = e0;
	
	return u0>>4;									
}


void SetSpeed(void)
{
	unsigned int KeyCode;

	while(1)
	{
		DispNum(g_Speed);								
		DelayMS(200);
	    DIGclear(); 
		DelayMS(200);
		DispNum(g_Speed);
		
		KeyCode = Key_Get();
		switch(KeyCode)
		{
			case KEY_1:								
				g_Speed += SPEED_STEP;
				if(g_Speed > SPEED_MAX)g_Speed = SPEED_MIN;
				DispNum(g_Speed);
				break;
			case KEY_2:									
				g_Speed -= SPEED_STEP;
				if(g_Speed < SPEED_MIN)g_Speed = SPEED_MAX;
				DispNum(g_Speed);
				break;
			case KEY_3:								
			    DispNum(g_Speed);
				return;
			default:
			     break;
		}
	}
}


void SetDirection(void)
{
	unsigned int KeyCode;
    while(1)
	{     
		  LCD501_ClrScreen(0); 
		  LCD501_Bitmap(2,48,(unsigned int *)encoding_0E);
          LCD501_Bitmap(35,48,(unsigned int *)encoding_0F);
	      LCD501_Bitmap(68,48,(unsigned int *)encoding_10);
	      LCD501_Bitmap(101,48,(unsigned int *)encoding_11);
	      LCD501_Line(0,18,127,18);
		if(g_Direction==1)
		{  									
	      LCD501_Bitmap(10,0,(unsigned int *)encoding_08);		
	      LCD501_Bitmap(30,0,(unsigned int *)encoding_09);	
	      LCD501_Bitmap(50,0,(unsigned int *)encoding_0A);
	      DelayMS(300);
	    }
		if(g_Direction==-1)
		{ 								
	      LCD501_Bitmap(60,0,(unsigned int *)encoding_0B);		
	      LCD501_Bitmap(80,0,(unsigned int *)encoding_0C);	
	      LCD501_Bitmap(100,0,(unsigned int *)encoding_0D);
	      DelayMS(300);
	    }
		
		KeyCode = Key_Get();
		switch(KeyCode)
		{
			case KEY_1:									
				g_Direction = 1;
				break;
			case KEY_2:									
				g_Direction = -1;
				break;
			case KEY_3:								
				return;
			default:
				break;
		}
	}		

}


void StartMotor(void)
{   unsigned int Temp;
	unsigned int KeyCode;
	unsigned int SpeedLevel, CurSpeed=0, PreSpeed=0;
	if(g_Direction==1)									
		DCMotor_Forward(MOTOR_1+MOTOR_2);
	else
		DCMotor_Backward(MOTOR_1+MOTOR_2);
   
     DIGclear();
    DispNum(CurSpeed);
    
    while(1)
	 {
		if(CurSpeed != PreSpeed)						
		{
			DispNum(CurSpeed);						
			PreSpeed = CurSpeed;
		}
        if(DCMotor_IsSpeedRdy())						
		{
			CurSpeed = DCMotor_GetSpeed();				
			SpeedLevel = DCMotor_Speed_PID(g_Speed, CurSpeed);	
			DCMotor_SetSpeed(MOTOR_1+MOTOR_2, SpeedLevel);		
		}
			Temp = *P_UART_Command2;
	       if(Temp & M_RX_FLAG)
	    {								
		   uiRS_Buff=*P_UART_Data;		
		   if(uiRS_Buff)				
			uiRS_ReciveFlag=1;
		  else
			uiRS_ReciveFlag=0;
	     }	
	   if(uiRS_ReciveFlag)
	    {  uiRS_ReciveFlag=0;
	       if(uiRS_Buff>=20)
	      	 if(uiRS_Buff<=60)
	      	    g_Speed=uiRS_Buff;
	      	 else
	      	   	g_Speed=60;
	       else
	      	    g_Speed=20;
	     }   
		KeyCode = Key_Get();
		switch(KeyCode)	
		{
			case KEY_1:									
				g_Speed += SPEED_STEP;
				if(g_Speed > SPEED_MAX)g_Speed = SPEED_MIN;
				break;
			case KEY_2:								
				g_Speed -= SPEED_STEP;
				if(g_Speed < SPEED_MIN)g_Speed = SPEED_MAX;
				break;
		    case KEY_3:	
		         								
				DCMotor_Stop(MOTOR_1+MOTOR_2);
				 DIGclear();
			return;
			case KEY_4:	
			playspeed(g_Speed);
			 break;
		    default:   
				break;
		}
	}
}
void StartMotor1(void)
{
	unsigned int KeyCode,g_Speed1=40;
	unsigned int CurSpeed=0;
	
	y1(); 
	* P_TimerA_Ctrl=0x0032;
    * P_TimerA_Data=0;	
	if(g_Direction==1)									
		DCMotor_Forward(MOTOR_1+MOTOR_2);
	else
		DCMotor_Backward(MOTOR_1+MOTOR_2);
    DispNum(CurSpeed);
	while(1)
	{
	 if(DCMotor_IsSpeedRdy1())  
		 {
		   DispNum(32768*10000/DCMotor_GetSpeed());				
	     }
	 if(DCMotor_IsSpeedRdy())
	  {	
        
	       DCMotor_SetSpeed(MOTOR_1+MOTOR_2, g_Speed1);	
	  }

		KeyCode = Key_Get();
		switch(KeyCode)	
		{
			case KEY_1:									
				g_Speed1 =40;
			
				break;
			case KEY_2:									
				g_Speed1 =21;
				
				break;
			case KEY_3:	
			  	g_Speed1 =18;
			  		break;						
			case KEY_4:	
			    g_Speed1 =14;
			    	
				 break;
			case 0x0010:
			    y0();
			    DIGclear();	 
			    DCMotor_Stop(MOTOR_1+MOTOR_2);
			    g_Speed =40;
				return;
			
			default:
				break;
		}
	}
}

int main(void)
{
	unsigned int KeyCode, Flag_KeyEvent;
	System_Init();									
	Flag_KeyEvent = 1;
	while(1)
	{
		if(Flag_KeyEvent==1)
		{
			DispNum(g_Speed);							
			Flag_KeyEvent = 0;
		}
		KeyCode = Key_Get();
		switch(KeyCode)
		{
			case KEY_1:									
				SetSpeed();
				Flag_KeyEvent = 1;
				break;
			case KEY_2:									
				SetDirection();
				Flag_KeyEvent = 1;
				break;
			case KEY_3:								
				StartMotor();
				Flag_KeyEvent = 1;
					break;
			case KEY_4:	
			playspeed(g_Speed);
			 break;		
			case 0x0010:
			   StartMotor1();
			 	Flag_KeyEvent = 1;
				break;
			default:
				break;
		}
	}
}



void PlaySnd_Auto(unsigned int uiSndIndex)
{
	SACM_A2000_Initial(1);					
	SACM_A2000_Play(uiSndIndex,3,3);	            
	while((SACM_A2000_Status() & 0x0001) != 0)
	{											
		SACM_A2000_ServiceLoop();				
		*P_Watchdog_Clear = 0x0001;			
	}	
	SACM_A2000_Stop();						
}

void playspeed(unsigned int TempNum)
{
	int iShow[4];	
	unsigned int KeyCode;
	iShow[3]=TempNum/1000;                       
	iShow[2]=(TempNum/100)%10;                   
	iShow[1]=(TempNum/10)%10;                    
   	iShow[0]=TempNum%10;				
	KeyCode = Key_Get();    
    PlaySnd_Auto(12);
	PlaySnd_Auto(iShow[1]);
	PlaySnd_Auto(10);
	if (iShow[0]!=0) 
	PlaySnd_Auto(iShow[0]);
	PlaySnd_Auto(14);	
			
	*P_Watchdog_Clear = 0x0001;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -