static char TAPwmInit(char Clk,char Div,char Mode1,char Mode2,char Mode3,char Mode4)
{
TBCTL = 0; //清除以前設置
TBCTL |= MC_1; //定時器TA設為增計數模式
switch(Clk) //選擇時鐘源
{
case 'A': case 'a': TBCTL|=TBSSEL_1; break; //ACLK
case 'S': case 's': TBCTL|=TBSSEL_2; break; //SMCLK
case 'E': TBCTL|=TBSSEL_0; break; //外部輸入(TACLK)
case 'e': TBCTL|=TBSSEL_3; break; //外部輸入(TACLK取反)
default : return(0); //參數有誤
}
switch(Div) //選擇分頻系數
{
case 1: TBCTL|=ID_0; break; //1
case 2: TBCTL|=ID_1; break; //2
case 4: TBCTL|=ID_2; break; //4
case 8: TBCTL|=ID_3; break; //8
default : return(0); //參數有誤
}
switch(Mode1) //設置PWM通道1的輸出模式。
{
case 'P':case 'p': //如果設置為高電平模式
TBCCTL1 = OUTMOD_7; //高電平PWM輸出
P4SEL |= BIT1; //從P1.2輸出 (不同型號單片機可能不一樣)
P4DIR |= BIT1; //從P1.2輸出 (不同型號單片機可能不一樣)
break;
case 'N':case 'n': //如果設置為低電平模式
TBCCTL1 = OUTMOD_3; //低電平PWM輸出
P4SEL |= BIT1; //從P1.2輸出 (不同型號單片機可能不一樣)
P4DIR |= BIT1; //從P1.2輸出 (不同型號單片機可能不一樣)
break;
case '0':case 0: //如果設置為禁用
P4SEL &= ~BIT1; //P1.2恢復為普通IO口
break;
default : return(0); //參數有誤
}
switch(Mode2) //設置PWM通道1的輸出模式。
{
case 'P':case 'p': //如果設置為高電平模式
TBCCTL2 =OUTMOD_7; //高電平PWM輸出
P4SEL |= BIT2; //從P1.3輸出 (不同型號單片機可能不一樣)
P4DIR |= BIT2; //從P1.3輸出 (不同型號單片機可能不一樣)
break;
case 'N':case 'n': //如果設置為低電平模式
TBCCTL2 =OUTMOD_3; //低電平PWM輸出
P4SEL |= BIT2; //從P1.3輸出 (不同型號單片機可能不一樣)
P4DIR |= BIT2; //從P1.3輸出 (不同型號單片機可能不一樣)
break;
case '0':case 0: //如果設置為禁用
P4SEL &= ~BIT2; //P1.3恢復為普通IO口
break;
default : return(0); //參數有誤
}
switch(Mode3) //設置PWM通道3的輸出模式。
{
case 'P':case 'p': //如果設置為高電平模式
TBCCTL3 =OUTMOD_7; //高電平PWM輸出
P4SEL |= BIT3; //從P1.3輸出 (不同型號單片機可能不一樣)
P4DIR |= BIT3; //從P1.3輸出 (不同型號單片機可能不一樣)
break;
case 'N':case 'n': //如果設置為低電平模式
TBCCTL3 =OUTMOD_3; //低電平PWM輸出
P4SEL |= BIT3; //從P1.3輸出 (不同型號單片機可能不一樣)
P4DIR |= BIT3; //從P1.3輸出 (不同型號單片機可能不一樣)
break;
case '0':case 0: //如果設置為禁用
P4SEL &= ~BIT3; //P1.3恢復為普通IO口
break;
default : return(0); //參數有誤
}
switch(Mode4) //設置PWM通道4的輸出模式。
{
case 'P':case 'p': //如果設置為高電平模式
TBCCTL4 =OUTMOD_7; //高電平PWM輸出
P4SEL |= BIT4; //從P1.3輸出 (不同型號單片機可能不一樣)
P4DIR |= BIT4; //從P1.3輸出 (不同型號單片機可能不一樣)
break;
case 'N':case 'n': //如果設置為低電平模式
TBCCTL4 =OUTMOD_3; //低電平PWM輸出
P4SEL |= BIT4; //從P1.3輸出 (不同型號單片機可能不一樣)
P4DIR |= BIT4; //從P1.3輸出 (不同型號單片機可能不一樣)
break;
case '0':case 0: //如果設置為禁用
P4SEL &= ~BIT4; //P1.3恢復為普通IO口
break;
default : return(0); //參數有誤
}
return(1);
}
static void TAPwmSetPeriod(unsigned int Period)
{
TBCCR0 = Period;
TBCCR1 = Period;
TBCCR2 = Period;
TBCCR3 = Period;
TBCCR4 = Period;
}
static void TAPwmSetDuty(char Channel,unsigned int Duty)
{
switch(Channel)
{
case 1: TBCCR1=Duty; break;
case 2: TBCCR2=Duty; break;
case 3: TBCCR3=Duty; break;
case 4: TBCCR4=Duty; break;
}
}
static void TAPwmSetPermill(char Channel,unsigned int Percent)
{
unsigned long int Period;
unsigned int Duty;
Period = TBCCR0;
Duty = Period * Percent / 1000;
TAPwmSetDuty(Channel,Duty);
}
void pwm_init(void)
{
TAPwmInit('A',2,'P','P','P','P'); //將定時器TA初始化成為PWM發(fā)生器
TAPwmSetPeriod(1000); //通道1/2的PWM方波周期均設為500個時鐘周期
}
void pwm_set(unsigned char sta,unsigned char dir,unsigned int pwm_in,unsigned int pwm_out)
{
if((1 == sta) && (1 == dir))
{
TAPwmInit('A',2,'0','0','N','P');
TAPwmSetPermill(3,(pwm_out-2)); //2通道 20.0%
TAPwmSetPermill(4,(pwm_out)); //2通道 20.0%
P4OUT |=BIT1; // 1
//P4OUT&=~BIT1; // 0
//P4OUT |=BIT2; // 1
P4OUT&=~BIT2; // 0
//P4OUT |=BIT3; // 1
//P4OUT&=~BIT3; // 0
//P4OUT |=BIT4; // 1
//P4OUT&=~BIT4; //
}
else if((1 == sta) && (0 == dir))
{
TAPwmInit('A',2,'N','P','0','0');
TAPwmSetPermill(1,(pwm_in-2)); //2通道 20.0%
TAPwmSetPermill(2,(pwm_in)); //2通道 20.0%
//P4OUT |=BIT1; // 1
//P4OUT&=~BIT1; // 0
//P4OUT |=BIT2; // 1
//P4OUT&=~BIT2; // 0
P4OUT |=BIT3; // 1
//P4OUT&=~BIT3; // 0
//P4OUT |=BIT4; // 1
P4OUT&=~BIT4; // 0
}
else if(0 == sta)
{
TAPwmInit('A',2,'0','0','0','0');
P4OUT |=BIT1; // 1
//P4OUT&=~BIT1; // 0
//P4OUT |=BIT2; // 1
P4OUT&=~BIT2; // 0
//P4OUT |=BIT3; // 1
P4OUT&=~BIT3; // 0
//P4OUT |=BIT4; // 1
P4OUT&=~BIT4; // 0
}
else {};
} |