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

📄 pwm.c

📁 使用TI DSP 2407A 进行开发的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	CMPR2    = 0;
	CMPR3    = 0;

	DBTCONA  = 0;
	COMCONA  = 0;
//	COMCONA  |=CLD_2;

	ACTRB    = 0;
	CMPR4    = 0;
	CMPR5    = 0;
	CMPR6    = 0;
	
	DBTCONB  = 0;
	COMCONB  = 0;

//	COMCONA  |=CLD_2;
}


/*
EV中全比较单元的比较输出极性设定
可以通过此函数令输出为恒高、恒低、高有效、低有效电平
*/

void PWMx_Output_Set(unsigned int PWMx_NUM,unsigned int PWM_Polar ) 
{
	unsigned int TEMP,TEMP2;

	switch (PWMx_NUM)
	{
	case PWM1_NUM:
	    TEMP2 = PWM_HIGH;
	    TEMP2 = ~TEMP2;
		TEMP = ACTRA;
		TEMP &= TEMP2; 
		TEMP |=PWM_Polar;
		ACTRA =TEMP;

		break;
	case PWM2_NUM:
	    TEMP2= PWM_HIGH*0x4;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRA;
	    TEMP &= TEMP2;
	    	    
		TEMP2 = PWM_Polar * 0x4;		
		TEMP |=TEMP2;
		ACTRA =TEMP;

		break;
	case PWM3_NUM:
	
	    TEMP2= PWM_HIGH*0x10;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRA;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar * 0x10;
		TEMP |=TEMP2;
		ACTRA =TEMP;

		break;
	case PWM4_NUM:
	
	    TEMP2= PWM_HIGH*0x40;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRA;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar * 0x40;
		TEMP |=TEMP2;
		ACTRA =TEMP;

		break;
	case PWM5_NUM:
	
	     TEMP2= PWM_HIGH*0x100;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRA;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar * 0x100;
		TEMP |=TEMP2;
		ACTRA =TEMP;
		
		

		break;
	case PWM6_NUM:
	
		TEMP2= PWM_HIGH*0x400;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRA;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar * 0x400;
		TEMP |=TEMP2;
		ACTRA =TEMP;

		break;
	case PWM7_NUM:	
	    TEMP2= PWM_HIGH;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRB;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar;
		TEMP |=TEMP2;
		ACTRB =TEMP;


		break;
	case PWM8_NUM:
	
	     TEMP2= PWM_HIGH*0x4;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRB;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar*0x4;
		TEMP |=TEMP2;
		ACTRB =TEMP;
	

		break;
	case PWM9_NUM:
	
	   	TEMP2= PWM_HIGH*0x10;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRB;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar*0x10;
		TEMP |=TEMP2;
		ACTRB =TEMP;

		break;
	case PWM10_NUM:
	
		     TEMP2= PWM_HIGH*0x40;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRB;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar*0x40;
		TEMP |=TEMP2;
		ACTRB =TEMP;
		


		break;
	case PWM11_NUM:
	
		TEMP2= PWM_HIGH*0x100;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRB;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar*0x100;
		TEMP |=TEMP2;
		ACTRB =TEMP;

		break;
	case PWM12_NUM:
		     TEMP2= PWM_HIGH*0x400;
	    TEMP2 = ~TEMP2;
	    TEMP = ACTRB;
	    TEMP &= TEMP2;
	    
		TEMP2 = PWM_Polar*0x400;
		TEMP |=TEMP2;
		ACTRB =TEMP;

		break;
	default:
	    break;
	}
}


/*
EV中全比较单元的比较寄存器数值设定
*/

void PWMx_CMPR_Set(unsigned int PWMx_NUM,unsigned int PWMx_CMPR_NUM) 
{
	unsigned int TEMP,TEMP2;

	switch (PWMx_NUM)
	{
	case PWM1_NUM:		
		CMPR1 =PWMx_CMPR_NUM;
		break;
	case PWM2_NUM:		
		CMPR1 =PWMx_CMPR_NUM;
		break;
	case PWM3_NUM:
		CMPR2 =PWMx_CMPR_NUM;
		break;
	case PWM4_NUM:
		CMPR2 =PWMx_CMPR_NUM;
		break;
	case PWM5_NUM:
		CMPR3 =PWMx_CMPR_NUM;
		break;
	case PWM6_NUM:
		CMPR3 =PWMx_CMPR_NUM;
		break;
	case PWM7_NUM:
		CMPR4 =PWMx_CMPR_NUM;
		break;
	case PWM8_NUM:
		CMPR4 =PWMx_CMPR_NUM;
		break;
	case PWM9_NUM:
		CMPR5 =PWMx_CMPR_NUM;
		break;
	case PWM10_NUM:
		CMPR5 =PWMx_CMPR_NUM;
		break;
	case PWM11_NUM:
		CMPR6 =PWMx_CMPR_NUM;
		break;
	case PWM12_NUM:
		CMPR6 =PWMx_CMPR_NUM;
		break;
	default:
	    break;
	}
}


//比较单元x比较中断使能
void CMPxINT_ENA(unsigned int CMPx_NUM)  
{
	switch (CMPx_NUM)
	{
	case 1:		
		EVAIMRA  |= CMP1INT_ENA;
		EVAIFRA  =  CMP1INT_ENA;
		break;
	case 2:
		EVAIMRA  |= CMP2INT_ENA;
		EVAIFRA  = CMP2INT_ENA;
		break;
	case 3:
		EVAIMRA  |= CMP3INT_ENA;
		EVAIFRA  = CMP3INT_ENA;
		break;
	case 4:
		EVBIMRA  |= CMP4INT_ENA;
		EVBIFRA  = CMP4INT_ENA;
		break;
	case 5:
		EVBIMRA  |= CMP5INT_ENA;
		EVBIFRA  = CMP5INT_ENA;
		break;
	case 6:
		EVBIMRA  |= CMP6INT_ENA;
		EVBIFRA  = CMP6INT_ENA;
		break;
	default:
	    break;
	}
}

//比较单元x比较中断禁止
void CMPxINT_DISABLE(unsigned int CMPx_NUM)  
{
	switch (CMPx_NUM)
	{
	case 1:		
		EVAIMRA  &=(~ CMP1INT_ENA);
		break;
	case 2:
		EVAIMRA  &=(~ CMP2INT_ENA);
		break;
	case 3:
		EVAIMRA  &= (~CMP3INT_ENA);
		break;
	case 4:
		EVBIMRA  &= (~CMP4INT_ENA);
		break;
	case 5:
		EVBIMRA  &= (~CMP5INT_ENA);
		break;
	case 6:
		EVBIMRA  &= (~CMP6INT_ENA);
		break;
	default:
	    break;
	}
}


/*
使能全比较器X的比较操作
*/

void CMPRx_ENA(unsigned int CMPx_NUM)  
{
	if(CMPx_NUM<4)

		COMCONA |= CENABLE;
	else 
		COMCONB |= CENABLE;
		

}

//禁止全比较器X的比较操作
void CMPRx_DISABLE(unsigned int CMPx_NUM)  
{
	if(CMPx_NUM<4)

		COMCONA &= (~CENABLE);
	else 
		COMCONB &= (~CENABLE);
}


/*
事件管理模块参数设定函数,可以设定比较寄存器的重载条件
方式控制寄存器重载条件
*/

void COMCONx_PARA_SET(unsigned int EVx_NUM,unsigned int PARA)
{
	if(EVx_NUM==1)

		COMCONA |= PARA;
	else 
		COMCONB |= PARA;
}


//全局通用计时器控制寄存器参数设置

void GPTCONx_PARA_SET(unsigned int EVx_NUM,unsigned int PARA)
{
	if(EVx_NUM==1)

		GPTCONA |= PARA;
	else 
		GPTCONB |= PARA;
}



//功率保护中断x中断使能
void PDINTxINT_ENA(unsigned int PDINTx_NUM)  
{
	switch (PDINTx_NUM)
	{
	case 1:		
		EVAIMRA  |= PDINTA_ENA;
		EVAIFRA  =  PDINTA_ENA;
		break;
	case 2:
		EVBIMRA  |= PDINTB_ENA;
		EVBIFRA  = PDINTB_ENA;
		break;	
	default:
	    break;
	}
}

//功率保护中断x中断禁止
void PDINTxINT_DISABLE(unsigned int PDINTx_NUM)  
{
	switch (PDINTx_NUM)
	{
	case 1:		
		EVAIMRA  &=(~PDINTA_ENA);
		break;
	case 2:
		EVBIMRA  &=(~PDINTB_ENA);
		break;	
	default:
	    break;
	}
}





/*
EV中全比较单元的比较输出波形占空比设定
MAX_FULL_BLANK_NUM =1000
可以通过 MAX_FULL_BLANK_NUM 的改变来细化波形的精确度
*/


void PWMx_Full_Blank_Set(unsigned int PWMx_NUM,unsigned int FULL_BLANK_NUM) 
{
	unsigned int TEMP,TEMP2;

	unsigned long TEMP3;

	TEMP2=FULL_BLANK_NUM;

	if (TEMP2> MAX_FULL_BLANK_NUM)
		TEMP2=MAX_FULL_BLANK_NUM-2;


	if (PWMx_NUM<7)
		TEMP = T1PR;
	else 
		TEMP = T3PR;

	TEMP3 = TEMP * FULL_BLANK_NUM;
	TEMP3 = TEMP3/MAX_FULL_BLANK_NUM;


	TEMP2=TEMP3;

	TEMP =TEMP -TEMP2;
	PWMx_CMPR_Set(PWMx_NUM,TEMP);
}

/*全比较单元中某一比较单元的载波频率的设定与改变
 //限制使用,因为改变一个比较单元的载波频率的同时,也会改变
 同一EV中其他的比较单元的频率
  */


void PWMx_Frequence_Set(unsigned int PWMx_NUM,unsigned int PWMx_Frequence)   
                                               
{
	unsigned int TEMP,TEMP2;

	if (PWMx_NUM<7)	
	{
	    TEMP=GP1_FRQUENCE/PWMx_Frequence;
	    T1PR  = TEMP ;
		T1CNT = 0;
	}
	else 
	{
	    TEMP=GP3_FRQUENCE/PWMx_Frequence;
	    T3PR  = TEMP ;
		T3CNT = 0;
	}
}


/*
强制使得全比较单元中某一比较单元的比较输出为低电平
*/


void PWMx_Output_DISABLE(unsigned int PWMx_NUM)
{
	PWMx_Output_Set(PWMx_NUM,PWM_LOW);
}

/*
强制使得EVA中的所有全比较单元的比较输出为高阻态
*/
void EVA_PWM_Output_DISABLE()
{
	unsigned int TEMP;
	TEMP = COMCONA;
	TEMP &=0xFDFF;

	COMCONA = TEMP;
}

/*
强制使得EVB中的所有全比较单元的比较输出为高阻态
*/

void EVB_PWM_Output_DISABLE()
{
	int TEMP;
	TEMP = COMCONB;
	TEMP &=0xFDFF;

	COMCONB = TEMP;
}


void EV_TEST()
{
    unsigned int i =0;

	port000c =4;
		
	wait_second(1);
	
	port000c = 0;

	GPTx_Frequence_Set(GPT1, 15000);


	PWMx_Full_Blank_Set(PWM1_NUM, 500);
	PWMx_Full_Blank_Set(PWM2_NUM, 500);
	PWMx_Full_Blank_Set(PWM3_NUM, 500);
	PWMx_Full_Blank_Set(PWM4_NUM, 500);

	PWMx_Output_Set(PWM1_NUM, PWM_HIGH_ENA);
	PWMx_Output_Set(PWM2_NUM, PWM_HIGH_ENA);
	PWMx_Output_Set(PWM3_NUM, PWM_HIGH_ENA);
	PWMx_Output_Set(PWM4_NUM, PWM_HIGH_ENA);

	COMCONx_PARA_SET(1 , (CENABLE |FCOMPOE));

	GPTx_ENA(GPT1);
	
		wait_second(6);
	

	for(i=0;i<10;i++)
	{
	
	wait_second(6);
	
	PWMx_Full_Blank_Set(PWM1_NUM, (i*80));
	PWMx_Full_Blank_Set(PWM2_NUM, (i*80));
	PWMx_Full_Blank_Set(PWM3_NUM, (i*80));
	PWMx_Full_Blank_Set(PWM4_NUM, (i*80));
	
	}
	
	for(i=0;i<10;i++)
	{
	
	wait_second(6);
	
	PWMx_Full_Blank_Set(PWM1_NUM, (1000-i*80));
	PWMx_Full_Blank_Set(PWM2_NUM, (1000-i*80));
	PWMx_Full_Blank_Set(PWM3_NUM, (i*80));
	PWMx_Full_Blank_Set(PWM4_NUM, (i*80));
	
	}
	
	


	
/*
	PWMx_Full_Blank_Set(PWM1_NUM,100);
	PWMx_Full_Blank_Set(PWM2_NUM,200);
	PWMx_Full_Blank_Set(PWM3_NUM,300);
	PWMx_Full_Blank_Set(PWM4_NUM,400);
	PWMx_Full_Blank_Set(PWM5_NUM,500);
	PWMx_Full_Blank_Set(PWM6_NUM,600);
	
	CMPxINT_ENA(CMP1_NUM);
	CMPxINT_ENA(CMP2_NUM);
	CMPxINT_ENA(CMP3_NUM);
	CMPxINT_ENA(CMP4_NUM);
	CMPxINT_ENA(CMP5_NUM);
	CMPxINT_ENA(CMP6_NUM);
	
	CMPRx_ENA(CMP1_NUM);
	CMPRx_ENA(CMP2_NUM);
	CMPRx_ENA(CMP3_NUM);
	CMPRx_ENA(CMP4_NUM);
	CMPRx_ENA(CMP5_NUM);
	CMPRx_ENA(CMP6_NUM);
	
	
	wait_second(5);
	


    GPTxPINT_DISABLE(GPT1);
    GPTxPINT_DISABLE(GPT2);
    GPTxPINT_DISABLE(GPT3);
	GPTxPINT_DISABLE(GPT4);
	
	GPTxCINT_DISABLE(GPT1);
	GPTxCINT_DISABLE(GPT2);
	GPTxCINT_DISABLE(GPT3);
	GPTxCINT_DISABLE(GPT4);

	

  
   
     GPTxUFINT_DISABLE(GPT1);
     GPTxUFINT_DISABLE(GPT2);
     GPTxUFINT_DISABLE(GPT3);
     GPTxUFINT_DISABLE(GPT4);

     GPTxOFINT_DISABLE(GPT1);
     GPTxOFINT_DISABLE(GPT2);
     GPTxOFINT_DISABLE(GPT3);
     GPTxOFINT_DISABLE(GPT4);
     
     wait_second(3);
     
    PWMx_Full_Blank_Set(PWM1_NUM,100);
	PWMx_Full_Blank_Set(PWM2_NUM,200);
	PWMx_Full_Blank_Set(PWM3_NUM,300);
	PWMx_Full_Blank_Set(PWM4_NUM,400);
	PWMx_Full_Blank_Set(PWM5_NUM,500);
	PWMx_Full_Blank_Set(PWM6_NUM,600);
	
	 wait_second(8);
     
    CMPxINT_DISABLE(CMP1_NUM);
	CMPxINT_DISABLE(CMP2_NUM);
	CMPxINT_DISABLE(CMP3_NUM);
	CMPxINT_DISABLE(CMP4_NUM);
	CMPxINT_DISABLE(CMP5_NUM);
	CMPxINT_DISABLE(CMP6_NUM);
	*/

	
	port000c =2;
	
	while(1)
	{
	i=0;
	}
	
	port000c =1;
	
}


void Drive_Init(void)
{

    unsigned int i =0;

	port000c =7;
		
	wait_second(1);
	
	port000c = 0;

	GPTx_Frequence_Set(GPT1, 600);
	
	GPTx_ENA(GPT1);

	COMCONx_PARA_SET(1 , (CENABLE |FCOMPOE | ACTRLD_2 | CLD_2));
	
	


//	PWMx_Full_Blank_Set(PWM1_NUM, 500);
//	PWMx_Full_Blank_Set(PWM2_NUM, 500);
//	PWMx_Full_Blank_Set(PWM3_NUM, 500);
//	PWMx_Full_Blank_Set(PWM4_NUM, 500);

	//PWMx_Output_Set(PWM1_NUM, PWM_HIGH_ENA);
	//PWMx_Output_Set(PWM2_NUM, PWM_HIGH_ENA);
	//PWMx_Output_Set(PWM3_NUM, PWM_HIGH_ENA);
	//PWMx_Output_Set(PWM4_NUM, PWM_HIGH_ENA);

//	PWMx_Output_Set(PWM1_NUM, PWM_LOW);
//	PWMx_Output_Set(PWM2_NUM, PWM_LOW);
//	PWMx_Output_Set(PWM3_NUM, PWM_LOW);
//	PWMx_Output_Set(PWM4_NUM, PWM_LOW);

	

	

}


//    #define    LEFT      1
//    #define    RIGHT    2



//   #define    FORWARD      1
//   #define    BACK    2



void  Drive(unsigned int left_right,unsigned int direct,unsigned int speed)
{

       unsigned int temp;
       
        if(left_right == RIGHT)
        	{
        	
        	
        	if(direct == FORWARD)
        		{

				PWMx_Full_Blank_Set(PWM5_NUM, speed);
				PWMx_Output_Set(PWM5_NUM, PWM_LOW);
	            PWMx_Output_Set(PWM6_NUM, PWM_LOW);
	            
				PWMx_Output_Set(PWM5_NUM, PWM_HIGH_ENA);
        		}
			
	      	else if(direct == BACK)

		        {

			    PWMx_Full_Blank_Set(PWM5_NUM, speed);
			    PWMx_Output_Set(PWM5_NUM, PWM_LOW);
	            PWMx_Output_Set(PWM6_NUM, PWM_LOW);

			    PWMx_Output_Set(PWM6_NUM, PWM_HIGH_ENA);
		        }
        	}

	 if(left_right == LEFT)
		{

	    	if(direct == FORWARD)
        		{

				PWMx_Full_Blank_Set(PWM1_NUM, speed);
				PWMx_Output_Set(PWM1_NUM, PWM_LOW);
	            PWMx_Output_Set(PWM2_NUM, PWM_LOW);

				PWMx_Output_Set(PWM1_NUM, PWM_HIGH_ENA);
        		}
			
		    else if(direct == BACK)

		        {
		        
			     PWMx_Full_Blank_Set(PWM1_NUM, speed);
			     PWMx_Output_Set(PWM1_NUM, PWM_LOW);
	             PWMx_Output_Set(PWM2_NUM, PWM_LOW);

			      PWMx_Output_Set(PWM2_NUM, PWM_HIGH_ENA);
			      
		         }
		         
		}
		
}
		
			       


/*
void  Drive(unsigned int left_right,unsigned int direct,unsigned int speed)
{

       unsigned int temp;
       
        if(left_right == RIGHT)
        	{
        	
				PWMx_Full_Blank_Set(5, speed);	            
				PWMx_Output_Set(5, PWM_HIGH_ENA);
        
        	}

	     else if(left_right == LEFT)
		    {
		
		
				PWMx_Full_Blank_Set(1, speed);	            
				PWMx_Output_Set(1, PWM_HIGH_ENA);
	     	}	 
}

*/

⌨️ 快捷键说明

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