📄 pwm.c
字号:
/* 2005-08-15 Created initial version 1.0 */
/*************************************************************************/
void MotorOn(int flag)
{
EnableController();
switch(flag)
{
case TIMER2:
SetTimer(TIMER2);
AngleCtrl(ANGLECTRL);
rTCFG0 = 0xff00;//set timer2 Prescaler=255
rTCFG1 &= 0xffff0fff;//set timer2 mux divider value=2
SetClkFreq(SPEEDCTRL,TIMER2);
rTCON |= (1<<15)|(1<<13);//auto load,manual update
rSRCPND = 0x1000;//Timer2 interrupt request
rINTMSK &= ~(BIT_TIMER2);//enable Timer2 interrupt
rTCON = 0x9000;//auto reload;start for timer2;clear manual update bit;close inverter
break;
case TIMER3:
SetTimer(TIMER3);
AngleCtrl(ANGLECTRL);
rTCFG0 = 0xff00;//set timer3 Prescaler=255
rTCFG1 &= 0xfff0ffff; //set timer3 mux divider value=2
SetClkFreq(SPEEDCTRL,TIMER3);
rTCON |= (1<<19)|(1<<17);//auto load,manual update
rSRCPND = 0x2000;
rINTMSK &= ~(BIT_TIMER3);//enable Timer3 interrupt
rTCON = 0x90000;//auto reload;start for timer3;clear manual update bit;close inverter
break;
default:
break;
}
return;
}
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* MotorOff */
/* */
/* DESCRIPTION */
/* */
/* Motor Off function */
/* */
/* AUTHOR */
/* */
/* Li-li zhang shenzhen watertek */
/* */
/* INPUTS */
/* flag: */
/* TIMER2 */
/* or TIMER3 */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* HISTORY */
/* */
/* DATE REMARKS */
/* */
/* 2005-08-15 Created initial version 1.0 */
/*************************************************************************/
void MotorOff(int flag)
{
switch(flag)
{
case TIMER2:
rTCON = 0x0;//stop timer
rINTMSK |= BIT_TIMER2;//disable interrupt
break;
case TIMER3:
rTCON = 0x0;
rINTMSK |= BIT_TIMER3;
break;
default:
break;
}
return;
}
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* AngleCtrl */
/* */
/* DESCRIPTION */
/* */
/* Angle Control function */
/* */
/* AUTHOR */
/* */
/* Li-li zhang shenzhen watertek */
/* */
/* INPUTS */
/* flag: */
/* 1--full step */
/* 2--1/2 step */
/* 3--1/4 step */
/* 4--1/8 step */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* HISTORY */
/* */
/* DATE REMARKS */
/* */
/* 2005-08-15 Created initial version 1.0 */
/*************************************************************************/
void AngleCtrl(int flag)
{
rGPGUP |= 0x808;
rGPGCON = rGPGCON & 0xff7fff7f |(1<<6)|(1<<22);
switch(flag)
{
case 4:
rGPGDAT &= 0xf7f7;
break;
case 3:
rGPGDAT = rGPGDAT & 0xfff7 |(1<<11);
break;
case 2:
rGPGDAT = rGPGDAT & 0xf7ff |(1<<3);
break;
case 1:
rGPGDAT |=0x808;
break;
default:
break;
}
return;
}
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* SetTimer */
/* */
/* DESCRIPTION */
/* */
/* Set Timer function */
/* */
/* AUTHOR */
/* */
/* Li-li zhang shenzhen watertek */
/* */
/* INPUTS */
/* flag: */
/* TIMER2 */
/* or TIMER3 */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* HISTORY */
/* */
/* DATE REMARKS */
/* */
/* 2005-08-15 Created initial version 1.0 */
/*************************************************************************/
void SetTimer(int flag)
{
switch(flag)
{
case TIMER2:
rGPBUP |= 0x4;
rGPBCON = rGPBCON & 0xffff0f |(1<<5);//select timer2(GPB2)
break;
case TIMER3:
rGPBUP |= 0x8;
rGPBCON = rGPBCON & 0xffff0f |(1<<7);//select timer3(GPB3)
break;
default:
break;
}
return;
}
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* SetClkFreq */
/* */
/* DESCRIPTION */
/* */
/* Set Clock Frequency function */
/* */
/* AUTHOR */
/* */
/* Li-li zhang shenzhen watertek */
/* */
/* INPUTS */
/* freq: */
/* clock frequency */
/* */
/* flag: */
/* TIMER2 */
/* or TIMER3 */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* HISTORY */
/* */
/* DATE REMARKS */
/* */
/* 2005-08-15 Created initial version 1.0 */
/*************************************************************************/
void SetClkFreq(int freq, int flag)
{
int tclk=0,count=0;
tclk = PCLK/(PRESCALE+1)/DIVIDER;
count = tclk/freq;
switch(flag)
{
case TIMER2:
rTCNTB2 = count;
rTCMPB2 = count/LEVEL;
break;
case TIMER3:
rTCNTB3 = count;
rTCMPB3 = count/LEVEL;
break;
default:
break;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -