📄 pwm.c
字号:
#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 + -