#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430x21x2.h>
char TaPwmInit(unsigned char Clk,unsigned char Div,char Mode1,unsigned char Mode2)
{
TACTL = 0; //清除以前设置
TACTL |= MC_1; //定时器TA设为增计数模式
switch(Clk) //选择时钟源
{
case 'A': case 'a': TACTL|=TASSEL_1; break; //ACLK
case 'S': case 's': TACTL|=TASSEL_2; break; //SMCLK
case 'E': TACTL|=TASSEL_0; break; //外部输入(TACLK)
case 'e': TACTL|=TASSEL_3; break; //外部输入(TACLK取反)
default : return(0); //参数有误
}
switch(Div) //选择分频系数
{
case 1: TACTL|=ID_0; break; //1
case 2: TACTL|=ID_1; break; //2
case 4: TACTL|=ID_2; break; //4
case 8: TACTL|=ID_3; break; //8
default : return(0); //参数有误
}
switch(Mode1) //设置PWM通道1的输出模式。
{
case 'P':case 'p': //如果设置为高电平模式
TACCTL1 = OUTMOD_7; //高电平PWM输出
P1SEL |= BIT2; //从P1.2输出 (不同型号单片机可能不一样)
P1DIR |= BIT2; //从P1.2输出 (不同型号单片机可能不一样)
break;
case 'N':case 'n': //如果设置为低电平模式
TACCTL1 = OUTMOD_3; //低电平PWM输出
P1SEL |= BIT2; //从P1.2输出 (不同型号单片机可能不一样)
P1DIR |= BIT2; //从P1.2输出 (不同型号单片机可能不一样)
break;
case '0':case 0: //如果设置为禁用
P1SEL &= ~BIT2; //P1.2恢复为普通IO口
P1DIR |= BIT2;
P1OUT |= BIT2;//---输出高
break;
default : return(0); //参数有误
}
switch(Mode2) //设置PWM通道2的输出模式。
{
case 'P':case 'p': //如果设置为高电平模式
TACCTL2 =OUTMOD_7; //高电平PWM输出
P1SEL |= BIT3; //从P1.3输出 (不同型号单片机可能不一样)
P1DIR |= BIT3; //从P1.3输出 (不同型号单片机可能不一样)
break;
case 'N':case 'n': //如果设置为低电平模式
TACCTL2 =OUTMOD_3; //低电平PWM输出
P1SEL |= BIT3; //从P1.3输出 (不同型号单片机可能不一样)
P1DIR |= BIT3; //从P1.3输出 (不同型号单片机可能不一样)
break;
case '0':case 0: //如果设置为禁用
P1SEL &= ~BIT3; //P1.3恢复为普通IO口
P1DIR |= BIT3;
P1OUT |= BIT3;//---输出高
break;
default : return(0); //参数有误
}
return(1);
}
void TaPwmSetPeriod(unsigned int Period)
{
TACCR0 = Period;
}
void TaPwmSetDuty(unsigned char Channel,unsigned int Duty)
{
switch(Channel)
{
case 1: TACCR1=Duty; break;
case 2: TACCR2=Duty; break;
}
}
void PwmInit(void)
{
TaPwmInit('S',1,'n','p');
TaPwmSetPeriod(100);
TaPwmSetDuty(2,10);
TaPwmSetDuty(1,90);
}
|