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

📄 main.c

📁 这是经典的电机的速度PID控制程序
💻 C
字号:
#include "2407bit.h"
#include "2407c.h"
#include "2407e.h"
#include "Pid_reg1.h"
#include "display.h"
#include "Speed_Reg.h"
#include "Postion_reg.h"
void IoInit(void);
void KeyScan(void);
unsigned int TimeFlag;
unsigned int dispclk=0;
unsigned int StopKeyCnt=0;
unsigned int KeyFlag[5]={0,0,0,0,0};
unsigned int KeyCnt[5]={0,0,0,0,0};
enum KeyTable {SW,ADD,SUB,XIN1,XIN2};
PIDREG1 pid0 = PIDREG1_DEFAULTS;
SPEEDPID speed0={
			&pid0,		//Point to PID calc
				0,		//Speed Freeback
				0x01ff,	//Init speed
				0x100,	//Speed
				(void (*)(int))EVA_PWM1_Init,	//Function for init
				(void (*)(int))EVA_PWM1_Updata	//Function for updata
			};

POSTIONPID	postion0={
					 &speed0,			//Speed Reg
					 0,					//Absolute postion
					 0xfffff,			//Reference input
					 0,					//Free back	input
					 0,					//Postion Reg Output
					 0x10,				//Speed
					 1023,				//Max Speed
					 -1023,				//Min Speed
					 0,					//E1
					 0,					//E2
					 130,				//Kp
					 250,				//Ki
					 0,					//Kd
					 (int (*)(int))PostionPid	//Updata Function
			};
main()
{
	unsigned int Led;
	asm(" SETC INTM");		//Disable all the interrupt
	asm(" SETC SXM");		//Disable sign extend
	asm(" CLRC OVM");		//Overflow normally
	asm(" CLRC CNF");		//B0 served as data ram
	*SCSR1=0x81FE;			//CLKOUT is Dsp's Clk Clk=OscX4		 			
	*WDCR=0x00E8;			//Wacth dog disable
	*IMR=0x0032;			//Enable INT2 INT6 INT5
	*IFR=0xFFFF;
	IoInit();
	DispInit();
	speed0.init();
	T3Init();
	

	asm(" CLRC SXM");
	asm(" CLRC INTM");
	while(KeyCnt[ADD]<5)
 	{
 	  TimeFlag=0;
 	  StopKeyCnt=0;
 	  if(dispclk==25)
 	  {
 	  Led=(*PCDATDIR)&0x0001;	//Change Led 
	  Led=Led^0x0001;
	  *PCDATDIR=(*PCDATDIR&0xfffe)|Led;	
 	  //Display(postion0.PostionF);
 	  Display(speed0.Qep_F);
 	  dispclk=0;
 	  }                      
 	  //postion0.Updata(&postion0);
 	  speed0.updata(&speed0);
 	  KeyScan();
 	  while(!TimeFlag);
 	}	
	
	
	while(1)
 	{
 	  StopKeyCnt=0;
 	  TimeFlag=0;
 	  if(dispclk==25)
 	  {
 	  Led=(*PCDATDIR)&0x0001;	//Change Led 
	  Led=Led^0x0001;
	  *PCDATDIR=(*PCDATDIR&0xfffe)|Led;	
 	  Display(postion0.PostionF);
 	  //Display(speed0.Qep_F);
 	  dispclk=0;
 	  }                      
 	  postion0.Updata(&postion0);
 	  //speed0.updata(&speed0);
 	  
 	  KeyScan();
 	  if(KeyCnt[XIN1]>4)
 	  	{
 	  	 postion0.Speed=0;
 	  	 postion0.PostionR=postion0.PostionF;}
 	  while(!TimeFlag);
 	}	
	





}
void interrupt gisr2 (void)
{
	switch ((*PIVR))
	{
	 case 0x002F  :
	 	{
	 		(*EVBIFRA)|=1<<T1PINT;		//Clear interrupt flag
	 		(*T3CNT)=0x0000;
			
			 speed0.Qep_F=*T4CNT;
			 postion0.PostionF+=(int)*T4CNT;
			 //*T2CNT=0;
			 *T4CNT=0;
			 dispclk++;
			 TimeFlag=1;
			 				
	 	}
	 	break;
	 }
	
}



void interrupt gisr5(void)
{
	/*int temp;
	temp=0;
	switch(*PIVR)
	{
		case 0x0006:		//RX中断
			{
				temp=*SCIRXBUF;
				if(!((*SCICTL1)&0x04))
				{
					//rxd data
					*(RxdBuf+RxdIndex)=temp;
					  RxdIndex++;
					if(RxdIndex==RxdNum)
					 {
					 	RxdIndex=0;
					 	*SCICTL1=0x0037;	
					 }
					 	
				}
				
				else if(temp==TxdAdd)
				{
					//txd data
					//txd enable
					*SCICTL2=((*SCICTL2)|0x0001)&0xfffd;		//发送中断使能
					(*PFDATDIR)|=(1<<EN485);					//485 发送使能
					*SCITXBUF=*(TxdBuf+TxdIndex);
					TxdIndex++;
				}
				else if(temp==RxdAdd)
			 		*SCICTL1=0x0033;
			 }
			 break;
		 case 0x0007:		//TX中断		
			{
			//txd data
				if(TxdIndex<(TxdNum+1))
				{
					*SCITXBUF=*(TxdBuf+TxdIndex);
					TxdIndex++;
				}
				else
				{
					TxdIndex=0;
					*SCICTL2=(*SCICTL2&0x0fffe)|0x0002;	//接收中断使能
									
					(*PFDATDIR)&=~(1<<EN485);			//485 接收使能
					
				}	
			}
			break;
		default:break;
		
	}*/
}

void interrupt gisr6(void)
{
/*	int	i;
	switch(*PIVR)
	{
		case 0x0004:				//AD中断
			{
			
				*EVBIFRA=1<<T1UFINT;		//Clear T1UFINT interrupt	
				(*ADCTRL2)|=0x0002;			//Clear AD interrupt
				for(i=0;i<8;i++)
				 AdValue[i]=*(RESULT8+i)>>6;
			 }
			 break;
	}*/			 
}
void IoInit(void)
{
	(*MCRA)&=~((1<<IN_DSP0)|(1<<IN_DSP1)|(1<<IN_DSP2)|(1<<IN_DSP3)|(1<<IN_DSP4)|(1<<IN_DSP5)|(1<<IN_DSP6)|(1<<IN_DSP7));
	(*MCRB)&=~(1<<IOPC0);
	(*MCRC)&=~((1<<OUT_DSP0)|(1<<OUT_DSP1)|(1<<OUT_DSP2)|(1<<OUT_DSP3)|(1<<OUT_DSP4)|(1<<OUT_DSP5)|(1<<OUT_DSP6)|(1<<OUT_DSP7));
	(*PADATDIR)&=~(IN_DSP0+8);
	(*PBDATDIR)=0x0000;
	(*PCDATDIR)|=(1<<(IOPC0+8))|(1<<IOPC0);
	(*PEDATDIR)|=((1<<(OUT_DSP3+8))|(1<<(OUT_DSP4+8))|(1<<(OUT_DSP5+8)));
	(*PFDATDIR)|=((1<<OUT_DSP0)|(1<<OUT_DSP1)|(1<<OUT_DSP2)|(1<<OUT_DSP6)|(1<<OUT_DSP7));
	(*PFDATDIR)&=0xff00;
}
void KeyScan()
{
	//Key in IOPA5
	unsigned int temp,i,j;
	
  for(j=1;j<5;j++)
	{	
		KeyCnt[j]=0;
		for(i=0;i<5;i++)
		{	
	 		temp=*PBDATDIR;
	  		if((~temp)&(1<<(IN_DSP1-8+j-1)))
			KeyCnt[j]++;
		}
		if(KeyCnt[j]>4)
		 KeyFlag[j]=1;
	}	
		
}

⌨️ 快捷键说明

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