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

📄 pwm.c

📁 使用TI DSP 2407A 进行开发的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "PWM.h"
#include "io.h"
#include "DSP240x_Device.h"



void init_ev(void)
{
	   int TEMPREG;

	   TEMPREG = MCRA;
	   TEMPREG |=(PWM1 | PWM2 | PWM3 | PWM4 |PWM5 | PWM6);
	   MCRA = TEMPREG;

	   
       EVAIMRA = 0;         //屏蔽EVA所有中断
	   EVAIMRB = 0;
	   EVAIMRC = 0;	 

	   EVAIFRA = 0xFFFF;         //清除EVA所有中断标志位
	   EVAIFRB = 0xFFFF;
	   EVAIFRC = 0xFFFF;

	   EVBIMRA = 0;         //屏蔽EVB所有中断
	   EVBIMRB = 0;
	   EVBIMRC = 0;	   

	   EVBIFRA = 0xFFFF;         //清除EVB所有中断标志位
	   EVBIFRB = 0xFFFF;
	   EVBIFRC = 0xFFFF;

	  
	   GP_Init();

	   PWM_Init();

}

void GP_Init()
{
	GPTCONA =0;

	T1PR = 0;
	T1CMPR = 0;
	T1CNT = 0;
	T1CON =0;
	T1CON |=(TMODE_2 | TPS_1 | TCLD_2) ;

	T2PR = 0;
	T2CMPR = 0;
	T2CNT = 0;
	T2CON =0;
	T2CON |=(TMODE_2 | TPS_1| TCLD_2);
	
    GPTCONB = 0;

	T3PR = 0;
	T3CMPR = 0;
	T3CNT = 0;
	T3CON = 0 ;
	T3CON |= (TMODE_2 | TPS_1| TCLD_2);

	T4PR = 0;
	T4CMPR = 0;
	T4CNT =  0;
	T4CON =  0;
	T4CON |= (TMODE_2 | TPS_1| TCLD_2);
}

/*
通用定时器x的周期寄存器设定
*/

void GPTxPR_Set(unsigned int GPTx_NUM,unsigned int TxPR)
{

	switch (GPTx_NUM)
	{
	case 1:
		T1PR =TxPR;
	//	T1CNT = 0;
		break;
	case 2:
		T2PR =TxPR;
	//	T2CNT = 0;
		break;
	case 3:
		T3PR =TxPR;
	//	T3CNT = 0;
		break;
	case 4:
		T4PR =TxPR;
	//	T4CNT = 0;
		break;
	default:
	    break;
	}
}


/*
通用定时器x的比较寄存器设定
*/

void GPTxCMPR_Set(unsigned int GPTx_NUM,unsigned int TxCMPR)
{
	switch (GPTx_NUM)
	{
	case 1:
		T1CMPR =TxCMPR;
		break;
	case 2:
		T2CMPR =TxCMPR;
		break;
	case 3:
		T3CMPR =TxCMPR;
		break;
	case 4:
		T4CMPR =TxCMPR;
		break;
	default:
	    break;
	}
}

/*
通用定时器x的计数器设定
*/


void GPTxCNT_Set(unsigned int GPTx_NUM,unsigned int TxCNT)
{
	switch (GPTx_NUM)
	{
	case 1:
		T1CNT =TxCNT;
		break;
	case 2:
		T2CNT =TxCNT;
		break;
	case 3:
		T3CNT =TxCNT;
		break;
	case 4:
		T4CNT =TxCNT;
		break;
	default:
	    break;
	}
}

/*
通用定时器x的周期频率设定
*/

#define   GP1_FRQUENCE      (SYS_FRQUENCE/1)  //234575
#define   GP2_FRQUENCE     (SYS_FRQUENCE/128)  //234575
#define   GP3_FRQUENCE     (SYS_FRQUENCE/128)  //234575
#define   GP4_FRQUENCE     (SYS_FRQUENCE/128)  //234575



void GPTx_Frequence_Set(unsigned int GPTx_NUM,unsigned int GPTx_Frequence)
{
   unsigned int TEMP;

	switch (GPTx_NUM)
	{
	case 1:
		TEMP=GP1_FRQUENCE/GPTx_Frequence;		
		T1PR =TEMP;
	//	T1CNT = 0;
		break;
	case 2:
		TEMP=GP2_FRQUENCE/GPTx_Frequence;
		T2PR =TEMP;
	//	T2CNT = 0;
		break;
	case 3:
		TEMP=GP3_FRQUENCE/GPTx_Frequence;
		T3PR =TEMP;
	//	T3CNT = 0;
		break;
	case 4:
		TEMP=GP4_FRQUENCE/GPTx_Frequence;
		T4PR =TEMP;
	//	T4CNT = 0;
		break;
	default:
	    break;
	}
}


/*
TxCON参数设定函数,可以设定输入时钟的预定标系数,及记数模式,默认的为连续增记数,128分频
时钟源选择,定时器比较寄存器的重载条件,等参数

*/

void GPTxCON_PARA_SET(unsigned int GPTx_NUM,unsigned int PARA)
{
	int TEMP;

	switch (GPTx_NUM)
	{
	case 1:
		TEMP = T1CON;
	    TEMP |= PARA;	
		T1CON = TEMP;
		break;
	case 2:
		TEMP = T2CON;
		  TEMP |= PARA;
		T2CON = TEMP;
		break;
	case 3:
		TEMP = T3CON;
	    TEMP |= PARA;
		T3CON = TEMP;
		break;
	case 4:
		TEMP = T4CON;
         TEMP |= PARA;
		T4CON = TEMP;
		break;
	default:
	    break;
	}
}



void GPTx_ENA(unsigned int GPTx_NUM)                //定时器x使能
{
	int TEMP;

	switch (GPTx_NUM)
	{
	case 1:
		TEMP = T1CON;
	    TEMP |= (TENABLE );	
		T1CON = TEMP;
		break;
	case 2:
		TEMP = T2CON;
		TEMP |= (TENABLE );
		T2CON = TEMP;
		break;
	case 3:
		TEMP = T3CON;
	    TEMP |= (TENABLE );
		T3CON = TEMP;
		break;
	case 4:
		TEMP = T4CON;
         TEMP |= (TENABLE);
		T4CON = TEMP;
		break;
	default:
	    break;
	}
}

/*
禁止定时器x的操作
*/

void GPTx_DISABLE(unsigned int GPTx_NUM)               
{
	int TEMP;

	switch (GPTx_NUM)
	{
	case 1:
		TEMP = T1CON;
		TEMP &=Tx_DISABLE;
		T1CON = TEMP;
		break;
	case 2:
		TEMP = T2CON;
		TEMP &=Tx_DISABLE;
		T2CON = TEMP;
		break;
	case 3:
		TEMP = T3CON;
		TEMP &=Tx_DISABLE;
		T3CON = TEMP;
		break;
	case 4:
		TEMP = T4CON;
		TEMP &=Tx_DISABLE;
		T4CON = TEMP;
		break;
	default:
	    break;
	}
}

/*
使能定时器X的比较操作
*/

void GPTxCMPR_ENA(unsigned int GPTx_NUM)               
{
	int TEMP;

	switch (GPTx_NUM)
	{
	case 1:
		TEMP = T1CON;
		TEMP |=TECMPR;
		T1CON = TEMP;
		break;
	case 2:
		TEMP = T2CON;
		TEMP |=TECMPR;
		T2CON = TEMP;
		break;
	case 3:
		TEMP = T3CON;
		TEMP |=TECMPR;
		T3CON = TEMP;
		break;
	case 4:
		TEMP = T4CON;
		TEMP |=TECMPR;
		T4CON = TEMP;
		break;
	default:
	    break;
	}
}

/*
禁止定时器x的比较操作
*/

void GPTxCMPR_DISABLE(unsigned int GPTx_NUM)               
{
	int TEMP;

	switch (GPTx_NUM)
	{
	case 1:
		TEMP = T1CON;
		TEMP &=TxCMPR_DISABLE;
		T1CON = TEMP;
		break;
	case 2:
		TEMP = T2CON;
		TEMP &=TxCMPR_DISABLE;
		T2CON = TEMP;
		break;
	case 3:
		TEMP = T3CON;
		TEMP &=TxCMPR_DISABLE;
		T3CON = TEMP;
		break;
	case 4:
		TEMP = T4CON;
		TEMP &=TxCMPR_DISABLE;
		T4CON = TEMP;
		break;
	default:
	    break;
	}
}
 


//通用定时器x上溢中断使能
void GPTxOFINT_ENA(unsigned int GPTx_NUM)  
{
	switch (GPTx_NUM)
	{
	case 1:		
		EVAIMRA  |= T1OFINT_ENA;
		EVAIFRA  =  T1OFINT_ENA;
		break;
	case 2:
		EVAIMRB  |= T2OFINT_ENA;
		EVAIFRB  = T2OFINT_ENA;

		break;
	case 3:
		EVBIMRA  |= T3OFINT_ENA;
		EVBIFRA  = T3OFINT_ENA;
		break;
	case 4:
		EVBIMRB  |= T4OFINT_ENA;
		EVBIFRB  = T4OFINT_ENA;
		break;
	default:
	    break;
	}
}

//通用定时器x下溢中断使能
void GPTxUFINT_ENA(unsigned int GPTx_NUM)  
{
	switch (GPTx_NUM)
	{
	case 1:		
		EVAIMRA  |= T1UFINT_ENA;
		EVAIFRA  = T1UFINT_ENA;
		break;
	case 2:
		EVAIMRB  |= T2UFINT_ENA;
		EVAIFRB  = T2UFINT_ENA;

		break;
	case 3:
		EVBIMRA  |= T3UFINT_ENA;
		EVBIFRA  = T3UFINT_ENA;
		break;
	case 4:
		EVBIMRB  |= T4UFINT_ENA;
		EVBIFRB  = T4UFINT_ENA;
		break;
	default:
	    break;
	}
}

//通用定时器x比较中断使能
void GPTxCINT_ENA(unsigned int GPTx_NUM)  
{
	switch (GPTx_NUM)
	{
	case 1:		
		EVAIMRA  |= T1CINT_ENA;
		EVAIFRA  = T1CINT_ENA;
		break;
	case 2:
		EVAIMRB  |= T2CINT_ENA;
		EVAIFRB  = T2CINT_ENA;
		break;
	case 3:
		EVBIMRA  |= T3CINT_ENA;
		EVBIFRA  = T3CINT_ENA;
		break;
	case 4:
		EVBIMRB  |= T4CINT_ENA;
		EVBIFRB  = T4CINT_ENA;
		break;
	default:
	    break;
	}
}


 //通用定时器x周期中断使能

void GPTxPINT_ENA(unsigned int GPTx_NUM) 
{
	switch (GPTx_NUM)
	{
	case 1:		
		EVAIMRA  |= T1PINT_ENA;
		EVAIFRA  = T1PINT_ENA;
		break;
	case 2:
		EVAIMRB  |= T2PINT_ENA;
		EVAIFRB  = T2PINT_ENA;
		break;
	case 3:
		EVBIMRA  |= T3PINT_ENA;
		EVBIFRA  = T3PINT_ENA;

		break;
	case 4:
		EVBIMRB  |= T4PINT_ENA;
		EVBIFRB  = T4PINT_ENA;
		break;
	default:
	    break;
	}
}


//通用定时器x上溢中断禁止
void GPTxOFINT_DISABLE(unsigned int GPTx_NUM)  
{
	switch (GPTx_NUM)
	{
	case 1:		
		EVAIMRA  &= (~T1OFINT_ENA);
		break;
	case 2:
		EVAIMRB  &=  (~T2OFINT_ENA);
		break;
	case 3:
		EVBIMRA  &= (~T3OFINT_ENA);
		break;
	case 4:
		EVBIMRB  &= (~T4OFINT_ENA);
		break;
	default:
	    break;
	}
}

//通用定时器x下溢中断禁止
void GPTxUFINT_DISABLE(unsigned int GPTx_NUM)  
{
	switch (GPTx_NUM)
	{
	case 1:		
		EVAIMRA  &= (~T1UFINT_ENA);
		break;
	case 2:
		EVAIMRB  &= (~T2UFINT_ENA);
		break;
	case 3:
		EVBIMRA  &= (~T3UFINT_ENA);
		break;
	case 4:
		EVBIMRB  &= (~T4UFINT_ENA);
		break;
	default:
	    break;
	}
}

//通用定时器x比较中断禁止
void GPTxCINT_DISABLE(unsigned int GPTx_NUM)  
{
	switch (GPTx_NUM)
	{
	case 1:		
		EVAIMRA  &= (~T1CINT_ENA);
		break;
	case 2:
		EVAIMRB  &= (~T2CINT_ENA);
		break;
	case 3:
		EVBIMRA  &= (~T3CINT_ENA);
		break;
	case 4:
		EVBIMRB  &= (~T4CINT_ENA);
		break;
	default:
	    break;
	}
}


 //通用定时器x周期中断禁止

void GPTxPINT_DISABLE(unsigned int GPTx_NUM) 
{
	switch (GPTx_NUM)
	{
	case 1:		
		EVAIMRA  &= (~T1PINT_ENA);
		break;
	case 2:
		EVAIMRB  &= (~T2PINT_ENA);
		break;
	case 3:
		EVBIMRA  &= (~T3PINT_ENA);
		break;
	case 4:
		EVBIMRB  &= (~T4PINT_ENA);
		break;
	default:
	    break;
	}
}

/*
设定定时器x的比较输出方波的频率
*/

void TxPWM_Frequence_Set(unsigned int TxPWM_NUM,unsigned int TxPWM_Frequence)
{
	GPTx_Frequence_Set(TxPWM_NUM,TxPWM_Frequence);
}



/*
设定定时器x的比较输出方波的占空比
*/
#define MAX_FULL_BLANK_NUM  1000

void GPTx_Full_Blank_Set(unsigned int GPTx_NUM,unsigned int FULL_BLANK_NUM)
{
	unsigned int TEMP,TEMP2;
	unsigned long  temp3;

//	TEMP2=FULL_BLANK_NUM;

	switch (GPTx_NUM)
	{
	case 1:
		TEMP = T1PR;
		
		temp3 = FULL_BLANK_NUM * TEMP;
		
		temp3 = temp3 / MAX_FULL_BLANK_NUM;		
		TEMP2 = temp3;
		TEMP  = TEMP -TEMP2;
		
		T1CMPR =TEMP;
		break;
	case 2:
		TEMP = T2PR;
		
		temp3 = FULL_BLANK_NUM * TEMP;
		
		temp3 =temp3 / MAX_FULL_BLANK_NUM;		
		TEMP2=temp3;
		TEMP =TEMP -TEMP2;
		
		T2CMPR =TEMP;
		break;
	case 3:
	    TEMP = T3PR;
	    
		temp3 = FULL_BLANK_NUM * TEMP;
		
		temp3 =temp3 / MAX_FULL_BLANK_NUM;		
		TEMP2=temp3;
		TEMP =TEMP -TEMP2;
		
		T3CMPR =TEMP;
		break;
	case 4:
		TEMP = T4PR;
		
		temp3 = FULL_BLANK_NUM * TEMP;
		
		temp3 =temp3 / MAX_FULL_BLANK_NUM;		
		TEMP2=temp3;
		TEMP =TEMP -TEMP2;
		
		T4CMPR =TEMP;
		break;	
	default:
	    break;
	}
}




void TxPWM_Full_Blank_Set(unsigned int TxPWM_NUM,unsigned int FULL_BLANK_NUM)
{

    GPTx_Full_Blank_Set(TxPWM_NUM,FULL_BLANK_NUM);
	
}


/*
通用定时器比较输出极性设定
可以通过此函数令输出为恒高、恒低电平
*/

void TxPWM_Output_Set(unsigned int TxPWM_NUM,unsigned int TxPWM_Polar )       
{                                                
	unsigned int TEMP,TEMP2;

	switch (TxPWM_NUM)
	{
	case 1:
	
	    TEMP2 = T1PIN_HIGH;
	    TEMP2 = ~TEMP2;
		TEMP = GPTCONA;
		TEMP &= TEMP2; 
	
		TEMP |=(TCOMPOE | TxPWM_Polar);
		GPTCONA = TEMP;
		break;
	case 2:
	     TEMP2 = T2PIN_HIGH;
	    TEMP2 = ~TEMP2;
		TEMP = GPTCONA;
		TEMP &= TEMP2; 
	   
		TEMP2 = TxPWM_Polar << 2;
		TEMP |=(TCOMPOE | TEMP2);
		GPTCONA = TEMP;
		break;
	case 3:
	
	    TEMP2 = T3PIN_HIGH;
	    TEMP2 = ~TEMP2;
		TEMP = GPTCONB;
		TEMP &= TEMP2; 
	
		TEMP |=(TCOMPOE | TxPWM_Polar);
		GPTCONB = TEMP;
		
		break;
	case 4:
	     
	       TEMP2 = T4PIN_HIGH;
	    TEMP2 = ~TEMP2;
		TEMP = GPTCONB;
		TEMP &= TEMP2; 
	   
		TEMP2 = TxPWM_Polar << 2;
		TEMP |=(TCOMPOE | TEMP2);
		GPTCONB = TEMP;
	     
		break;
	default:
	    break;
	}
}

/*
此函数使得EVA的比较输出为高阻态
*/

void EVA_TxPWM_Output_DISABLE()
{
	unsigned int TEMP;
	TEMP = GPTCONA;
	TEMP &=0xFFBF;

	GPTCONA = TEMP;
}

void EVA_TxPWM_Output_ENABLE()
{
	unsigned int TEMP;
	TEMP = GPTCONA;
	TEMP |=0x0040;

	GPTCONA = TEMP;
}

/*
此函数使得EVB的比较输出为高阻态
*/
void EVB_TxPWM_Output_DISABLE()
{
	int TEMP;
	TEMP = GPTCONB;
	TEMP &=0xFFBF;

	GPTCONB = TEMP;
}

void EVB_TxPWM_Output_ENABLE()
{
	unsigned int TEMP;
	TEMP = GPTCONB;
	TEMP |=0x0040;

	GPTCONB = TEMP;
}



void PWM_Init()
{	
	ACTRA    = 0;
	CMPR1    = 0;

⌨️ 快捷键说明

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