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

📄 dsp281x_ev.c

📁 代码用于测试dsp2812的硬件功能
💻 C
字号:
//###########################################################################
//
// FILE:	DSP281x_Ev.c
// TITLE:	DSP281x Event Manager Initialization & Support Functions.
// WRITER:	ZHANG X.L.
//
//###########################################################################

#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File

struct ROBOTSTATE RobAimSta;
struct ROBOTSTATE RobSta={ 0,0,PIE/2,30,30,0}; 
struct MOTOR Motor[9];	//Motor[0]-Motor[8],Motor[0] is not used;
Uint16 MDir = 0; 
Uint32 LEcoderCount = 0 , REcoderCount = 0;
//---------------------------------------------------------------------------
// InitEv: 
// This function initializes to a known state.
//---------------------------------------------------------------------------
void InitEv(void)
{
	//InitEVA;
	EALLOW;
/*	GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 1;
	GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1 = 0;
	GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2 = 1;
	GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3 = 0;
	GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4 = 1;
	GpioMuxRegs.GPAMUX.bit.PWM6_GPIOA5 = 0;
	GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6 = 1;
	GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7 = 0;
	GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8 = 1;
	GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9 = 1;
	GpioMuxRegs.GPAMUX.bit.CAP3QI1_GPIOA10 = 1;
	GpioMuxRegs.GPAMUX.bit.TDIRA_GPIOA11 = 0;
	GpioMuxRegs.GPAMUX.bit.TCLKINA_GPIOA12 = 0;
	GpioMuxRegs.GPAMUX.bit.C1TRIP_GPIOA13 = 0;
	GpioMuxRegs.GPAMUX.bit.C2TRIP_GPIOA14 = 0;
	GpioMuxRegs.GPAMUX.bit.C3TRIP_GPIOA15 = 0;			*/
	GpioMuxRegs.GPAMUX.all |= 0x0755;

	GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA_GPIOD0 = 0;
	GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA_GPIOD1 = 0;	
	EDIS;

	EvaRegs.EXTCONA.all = 0x0001; 	// INDCOE = 1,enable independent compare output enable mode;	
	EvaRegs.GPTCONA.all = 0x0005;   // Reserved,0;
									// T2STAT = 0,R;
									// T1STAT = 0,R;
									// T2CTRIP = 0,??
									// T1CTRIP = 0,??
									// T2TOADC = 00,no timer 2 event starts ADC;
									// T1TOADC = 00,no timer 1 event starts ADC;
									// TCMPOE = 0,reserved as EXTCONA(0) = 1;
									// T2CMPOE = 0,timer 1 compare outputs T2PWM_T2CMP is in
										// high-impendance state;
									// T1CMPOE = 0,timer 1 compare outputs T1PWM_T1CMP is in
										// high-impendance state;
										// if set,driven by individual timer compare logic;
									// T2PIN = 01,polarity of timer 2 compare output is active low;
									// T1PIN = 01,
   	EvaRegs.T1CON.all = 0x1742;	// 00 0 10 111 0 1 00 00 1 0;
   								// Free:Soft = 00,仿真挂起则立即停止;
								// Reserved,0;
								// TMODE1:0 = 10,连续增模式;
								// TSP2:0 = 111, HSPCLK/128;
								// T2SWT1/T4SWT3 = 0,使用T2、T4自身的使能位;
								// TENABLE = 1,使能定时器操作(定时器保持,TSP2:0=000);
								// TCLKS1:0 = 00,时钟源:HSPCLK;
								// TCLD1:0 = 00,当计数器值为0时,定时器比较寄存器重装;
								// TECMPR = 1,使能定时器比较操作;
								// SELT1PR/SELT3PR = 0,T2、T4使用自身的周期寄存器;
	EvaRegs.T2CON.all = 0x1F70; // 00 0 11 111 0 1 11 00 0 0; 
								// Relate to QEP;
								// TMODE1:0 = 11,Timer2 count mode is directional-up/-down count mode;
								// TENABLE = 1,enable timer 2 operation;
								// TCLKS1:0 = 11,clock source is QEP circuit;
								// TECMPR = 0,diable timer compare operation;
								// The value of the else bits are the same with T1CON;
//		EvaRegs.COMCONA.all = 0xA4E7;
	EvaRegs.COMCONA.all = 0xA400;	// CENABLE = 1,使能比较操作;
								 	// CLD1:0 = 01,T1下溢或周期匹配时CMPRx重载;
									// SVENABLE = 0,禁止空间矢量PWM模式;
									// ACTRLD1:0 = 01,T1下溢或周期匹配时ACTRA重载;
									// FCMPOE = 0,reserved as EXTCONA(0) = 1;;
									// #PDPINTA,R;
									// FCMP3OE = 0;禁止全比较3输出;
									// FCMP2OE = 0;
									// FCMP1OE = 0;
									// Reserved;
									// Reserved;
									// C3TRP = 0;禁止全比较3进程;
									// C2TRP = 0;
									// C1TRP = 0; 
	EvaRegs.ACTRA.all = 0x0555; // Action on compare output pins 6:1 is active low;
	EvaRegs.DBTCONA.all = 0x0000;	// EDBT3:1 = 000;Disable dead-band Timer 3/2/1;

	EvaRegs.CAPCONA.all =0x10FC;	// 1 00 0 0 0 0 0 11 11 11 0;
									// Relate to QEP;		
									// CAPRES = 1,no action;
									// CAP12EN = 00,disable captures 1 and 2;
									// CAP3EN = 0,disable capture 3;
									// Reserved,0;
									// CAP3TSEL = 0,capture unit 3 selects GP timer 2;
									// CAP12TSEL = 0,capture units 1 and 2 selects GP timer 2;
									// CAP3TOADC = 0,no action;
									// CAP1EDGE = 11,capture unit 1 detects both edges;
									// CAP2EDGE = 11,
									// CAP3EDGE = 11,
									// Reserved,0;

	EvaRegs.T2CNT = 0x8000;	// Relate to QEP;

	// The time compare logic and full compare units outputs are all disabled.It must be eanbled 
			//individually,if needed;
	// The QEP circuit gets ready for work;
//////////////////////////////////////////////////////////////////////////////////////////////	
	//InitEVB,the Cfguration is the same with the EVA;
	EALLOW;
/*	GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0 = 1;
	GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1 = 0;
	GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2 = 1;
	GpioMuxRegs.GPBMUX.bit.PWM10_GPIOB3 = 0;
	GpioMuxRegs.GPBMUX.bit.PWM11_GPIOB4 = 1;
	GpioMuxRegs.GPBMUX.bit.PWM12_GPIOB5 = 0;
	GpioMuxRegs.GPBMUX.bit.T3PWM_GPIOB6 = 1;
	GpioMuxRegs.GPBMUX.bit.T4PWM_GPIOB7 = 0;
	GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8 = 1;
	GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9 = 1;
	GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10 = 1;
	GpioMuxRegs.GPBMUX.bit.TDIRB_GPIOB11 = 0;
	GpioMuxRegs.GPBMUX.bit.TCLKINB_GPIOB12 = 0;
	GpioMuxRegs.GPBMUX.bit.C4TRIP_GPIOB13 = 0;
	GpioMuxRegs.GPBMUX.bit.C5TRIP_GPIOB14 = 0;
	GpioMuxRegs.GPBMUX.bit.C6TRIP_GPIOB15 = 0;			*/
	GpioMuxRegs.GPBMUX.all |= 0x0755;

	GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB_GPIOD5 = 0;
	GpioMuxRegs.GPDMUX.bit.T4CTRIP_SOCB_GPIOD6 = 0;
	EDIS;

	EvbRegs.EXTCONB.all = 0x0001; 
	EvbRegs.GPTCONB.all = 0x0005;
	EvbRegs.T3CON.all = 0x1742;	 
	EvbRegs.T4CON.all = 0x1F70; 

	EvbRegs.COMCONB.all = 0xA400;	
	EvbRegs.ACTRB.all = 0x0555; 
	EvbRegs.DBTCONB.all = 0x0000;

	EvbRegs.CAPCONB.all =0x10FC;		

	EvbRegs.T4CNT = 0x8000;
}	

//---------------------------------------------------------------------------------------
//Configure the GP Times and full compare units to generate PWM;
//PWmfreq's unit is Hz;
//DutyCycle's unit is 1%.For example , DutyCycle = 30 ,then the PWM's duty cycle is 30%;
//---------------------------------------------------------------------------------------
void CfgPWM(Uchar n,Uint16 PWMfreq, Uchar DutyCycle)  //
{
	Uint16 TnPR , TnCMPR_CMPRn;
	TnPR = 480000 / PWMfreq - 1;	// 600 000 Hz is the timer's clock frequence
									// = 30 000 000 * SysCtrlRegs.PLLCR.bit.DIV / 2 /( SysCtrlRegs.HISPCP.all * 2) / ( 2 ^ EvaRegs.T1CON.bit.TPS );
	TnCMPR_CMPRn = (Uint16)(((float32)(TnPR + 1)) * DutyCycle / 100);
	switch(n)
	{
/*		case 21:	//T1PWM;
			EvaRegs.T1PR = TnPR;
			EvaRegs.T1CMPR = TnCMPR_CMPRn;
			EvaRegs.GPTCONA.bit.T1CMPOE = 1;	//Driven by individual timer compare logic;		
			break;
		case 22:	//T2PWM;
			//EvaRegs.T2PR = TnPR;
			//EvaRegs.T2CMPR = TnCMPR_CMPRn;
			//EvaRegs.GPTCONA.bit.T2CMPOE = 1;	//The same above;
			break;
		case 23:	//T3PWM;
			EvbRegs.T3PR = TnPR;
			EvbRegs.T3CMPR = TnCMPR_CMPRn;
			EvbRegs.GPTCONB.bit.T3CMPOE = 1;	//The same above;
			break;
		case 24:	//T4PWM;
			//EvbRegs.T4PR = TnPR;
			//EvbRegs.T4CMPR = TnCMPR_CMPRn;
			//EvbRegs.GPTCONB.bit.T4CMPOE = 1;	//The same above;
			break;
		case 1:		//PWM1;
			EvaRegs.T1PR = TnPR;
			EvaRegs.CMPR1 = TnCMPR_CMPRn;
			EvaRegs.COMCONA.bit.FCMP1OE = 1;	//使能全比较1输出;
			break;
		case 2:		//PWM2;
			break;
    	case 3:		//PWM3;
			EvaRegs.T1PR = TnPR;
			EvaRegs.CMPR2 = TnCMPR_CMPRn;
			EvaRegs.COMCONA.bit.FCMP2OE = 1;	//使能全比较2输出;
			break;
		case 4:		//PWM4;
			break;
		case 5:		//PWM5;
			EvaRegs.T1PR = TnPR;
			EvaRegs.CMPR3 = TnCMPR_CMPRn;
			EvaRegs.COMCONA.bit.FCMP3OE = 1;	//使能全比较3输出;
			break;
		case 6:		//PWM6;
			break;
		case 7:		//PWM7;
			EvbRegs.T3PR = TnPR;
			EvbRegs.CMPR4 = TnCMPR_CMPRn;
			EvbRegs.COMCONB.bit.FCMP4OE = 1;	//使能全比较器4输出;
			break;
		case 8:		//PWM8;
			break;
		case 9:		//PWM9;
			EvbRegs.T3PR = TnPR;
			EvbRegs.CMPR5 = TnCMPR_CMPRn;
			EvbRegs.COMCONB.bit.FCMP5OE = 1;	//使能全比较器5输出;
			break;
		case 10:	//PWM10;
			break;
		case 11:	//PWM11;
			EvbRegs.T3PR = TnPR;
			EvbRegs.CMPR6 = TnCMPR_CMPRn;
			EvbRegs.COMCONB.bit.FCMP6OE = 1;	//使能全冉掀?输出;
			break;
		case 12:	//PWM12;
			break;
		default: break;
*/

        //This configuration is consistent with the FPGA board;
		case 7:	//T1PWM;
			EvaRegs.T1PR = TnPR;
			EvaRegs.T1CMPR = TnCMPR_CMPRn;
			EvaRegs.GPTCONA.bit.T1CMPOE = 1;	//Driven by individual timer compare logic;		
			break;
		case 8:	//T3PWM;
			EvbRegs.T3PR = TnPR;
			EvbRegs.T3CMPR = TnCMPR_CMPRn;
			EvbRegs.GPTCONB.bit.T3CMPOE = 1;	//The same above;
			break;
		case 1:		//PWM1;
			EvaRegs.T1PR = TnPR;
			EvaRegs.CMPR1 = TnCMPR_CMPRn;
			EvaRegs.COMCONA.bit.FCMP1OE = 1;	//使能全比较1输出;
			break;
    	case 2:		//PWM3;
			EvaRegs.T1PR = TnPR;
			EvaRegs.CMPR2 = TnCMPR_CMPRn;
			EvaRegs.COMCONA.bit.FCMP2OE = 1;	//使能全比较2输出;
			break;
		case 3:		//PWM5;
			EvaRegs.T1PR = TnPR;
			EvaRegs.CMPR3 = TnCMPR_CMPRn;
			EvaRegs.COMCONA.bit.FCMP3OE = 1;	//使能全比较3输出;
			break;
		case 4:		//PWM7;
			EvbRegs.T3PR = TnPR;
			EvbRegs.CMPR4 = TnCMPR_CMPRn;
			EvbRegs.COMCONB.bit.FCMP4OE = 1;	//使能全比较器4输出;
			break;
		case 5:		//PWM9;
			EvbRegs.T3PR = TnPR;
			EvbRegs.CMPR5 = TnCMPR_CMPRn;
			EvbRegs.COMCONB.bit.FCMP5OE = 1;	//使能全比较器5输出;
			break;
		case 6:	//PWM11;
			EvbRegs.T3PR = TnPR;
			EvbRegs.CMPR6 = TnCMPR_CMPRn;
			EvbRegs.COMCONB.bit.FCMP6OE = 1;	//使能全比较器6输出;
			break;
		default: break;
	}
}

//---------------------------------------------------------------------------
//Caculate the robot's real-time state;
//---------------------------------------------------------------------------
void CaRobSta(void)
{
	Uint16 T2CNTtemp = 0x0000 , T4CNTtemp = 0x0000;
	static Uint16 CaRobSta_count = 0x01 ;
	float32 L1,L2,sita,fx,fy,ftemp1,ftemp2,fsin,fcos;
	
//	KickDog();

	// Measure the robot's wheels' speed;
//	RobSta.LSpeed = ((float32)(EvaRegs.T2CNT - 0x8000)) * (float32)LEcoderParam / DetaTime;
//	RobSta.Rspeed = ((float32)(EvbRegs.T4CNT - 0x8000)) * (float32)REcoderParam / DetaTime;
	
	// Caculate the robot's position and direction;
	if ((abs(EvaRegs.T2CNT-0x8000) > CaculateThreshold) || (abs(EvbRegs.T4CNT-0x8000) > CaculateThreshold))
	{
//		L1 = ((float32)(EvaRegs.T2CNT - 0x8000)) * (float32)LEcoderParam;	
//		L2 = ((float32)(EvbRegs.T4CNT - 0x8000)) * (float32)REcoderParam;
		T2CNTtemp = EvaRegs.T2CNT ;
		T4CNTtemp = EvbRegs.T4CNT ;
		EvaRegs.T2CNT = 0x8000;
		EvbRegs.T4CNT = 0x8000;	
		L1 = ((float32)(T2CNTtemp - 0x8000)) * (float32)LEcoderParam;	
		L2 = ((float32)(T4CNTtemp - 0x8000)) * (float32)REcoderParam;
		RobSta.LSpeed = ((float32)(T2CNTtemp - 0x8000)) * (float32)LEcoderParam / (DetaTime * CaRobSta_count) ;
		RobSta.Rspeed = ((float32)(T4CNTtemp - 0x8000)) * (float32)REcoderParam / (DetaTime * CaRobSta_count) ;
#if	TEST_RUN
		LEcoderCount = LEcoderCount + abs(T2CNTtemp - 0x8000);
		REcoderCount = REcoderCount + abs(T4CNTtemp - 0x8000);
#endif
		CaRobSta_count = 0x01;
	}
	else 
	{
		CaRobSta_count++;
		return;
	}
	/*	L1=((float32)((DSP_LONG)EvaRegs.T2CNT-OldEvaRegs.T2CNT)*(float32)LEcoderParam);	
	L2=((float32)((DSP_LONG)EvbRegs.T4CNT-OldEvbRegs.T4CNT)*(float32)REcoderParam);	
	OldEvaRegs.T2CNT=EvaRegs.T2CNT;
	OldEvbRegs.T4CNT=EvbRegs.T4CNT;*/

	sita = (L2 - L1) / (float32)EcoderLen;	
	if (L1 == L2)
	{
		fx = 0;
		fy = L1;
	}
	else
	{
		ftemp1 = L2 - L1;			
		ftemp2 = L1 + L2;			
		ftemp2 = ftemp2 / ftemp1;			
		ftemp2 = ftemp2 * (float32)EcoderLen / 2.0;
		
		ftemp1 = 1.0 - cos(sita);
		fx = -(ftemp1 * ftemp2);			
		ftemp1 = sin(sita);
		fy = ftemp1 * ftemp2;					
	}

	fsin = sin(RobSta.sita);	//坐标变换
	fcos = cos(RobSta.sita);
	RobSta.x += (fx * fcos - fy * fsin);	
	RobSta.y += (fx * fsin + fy * fcos);	
    RobSta.sita += sita;
    
    //Check the robot's environment;
	RobSta.Envir = ReadBus(FUredSwAddr);				
}	

//------------------------------------------------------------------------------
//Cfg the robot's temporarily aim state;
//------------------------------------------------------------------------------
void ConRobAimSta()
{
	switch(RobSta.Envir)
	{
		//case RobAimSta.Envir:
		//	break;
		case ObstaF:
			break;
		case ObstaL:
			break;
		case ObstaR:
			break;
		default:break;
	}
}

/*
void RegulateSpeed(Uchar RM)	// RM:short for regulate mode;	
{
	Uint16 FMD1,FMD2;
	Uchar sp1,sp2;
	if( RobSta.sita == RobAimSta.sita)
		return;
	else 
	{
 		switch(RM)
		{
			case 1: if( RobSta.sita > RobAimSta.sita )	//Go along borken line;
					{
						FMD1 = M1Reverse;
						FMD2 = M2Forward;
						sp1 = 20;
						sp2 = 20;
                 	}
					else
					{
						FMD1 = M1Forward;
						FMD2 = M2Reverse;
						sp1 = 20;
						sp2 = 20;
					}
					break;
     		case 2: if( RobSta.sita > RobAimSta.sita )	//Go along curve;
					{
						FMD1 = M1FreeStop;
						FMD2 = M2Forward;
						//sp1 = 10;
						sp2 = 40;
                 	}
					else
					{
						FMD1 = M1Forward;
						FMD2 = M2FreeStop;
						sp1 = 40;
						//sp2 = 10;
					}	
					break;
			case 3: if( RobSta.sita > RobAimSta.sita )	//Go along arc;
					{
						FMD1 = M1Forward;
						FMD2 = M2Forward;
						sp1 = 10;
						sp2 = 40;
                 	}
					else
					{
						FMD1 = M1Forward;
						FMD2 = M2Forward;
						sp1 = 40;
						sp2 = 10;
					}	
					break;
			default :break;
		}
		WriteBus(FMotorAddr,FMD1);
		WriteBus(FMotorAddr,FMD2);
		CfgPWM(1,50,sp1);
		CfgPWM(2,50,sp2);
	}
}
*/
void GoAlong()
{

}

void CfgMotorDir(Uchar n,Uint16 nDir)
{
	MDir = (MDir & (~(0x0003 << ((n-1) * 2)))) | (nDir << ((n-1) * 2));
}

//-----------------------------------------------------------------------------
//Function:used for test the motor's speed
//-----------------------------------------------------------------------------
void CaMotorSp(void)
{
//	LEcoderCount = LEcoderCount + abs(EvaRegs.T2CNT - 0x8000);
	LEcoderCount = LEcoderCount + EvaRegs.T2CNT - 0x8000 ;
	EvaRegs.T2CNT = 0x8000;
}

//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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