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