用430定时器A定时几个小时长的时间该怎么操作
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
MSP430x149单片机定时器A有以下特点:
(1)具有16位计数器,4种工作模式;
(2)具有多种时钟源,可以灵活选择配置ACLK和SMCLK及外部时钟;
(3)具有多个可配置输入端的捕获/比较寄存器;
(4)支持多时序控制,多个比较/捕获功能,多种波形输出;
(5)具有异步输入,输出锁存功能;
(6)产生的定时脉冲或者PWM信号没有软件带来的误差;
(7)能够捕获外部事件发生生的时间,锁定其发生是的高低电平;
(8)具体完善的中断服务功能;
(9)具有8种输出方式选择,3个可配置输出单元。
2.TimerA的结构组成:
(1)16位计数器,具有4种计数方式;
(2)捕获和比较功能是完全相互独立的,即捕获功能时,比较单元不能用;比较功能时,捕获单元不能用;
(3)用于产生用户所需要的输出信号。
(4)结构如下图:
计数模式:
(1)增计数模式
捕获/比较寄存器CCR0用作Timer_A增计数模式的周期寄存器,因为CCR0为16位寄存器,所以该模式适用于定时周期小于65 536的连续计数情况。计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。
这就是你需要的设置(2)连续计数模式
在需要65 536个时钟周期的定时应用场合常用连续计数模式。定时器从当前值计数到0FFFFH后,又从0开始重新计数
(3)增/减计数模式
需要对称波形的情况经常可以使用增/减计数模式,该模式下,定时器先增计数到CCR0的值,然后反向减计数到0。计数周期仍由CCR0定义,它是CCR0计数器数值的2倍。
程序实现:
char TAPwmInit(char Clk,char Div,char Mode1,char Mode2)
{
TACTL=0; //清除以前的定时器的设置
TACTL|=MC_1; //定时器设置为增计数模式
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)
{
case ‘P’:case ‘p’: //设置为高电平模式
TACCTL1|=OUTMOD_7; //高电平PWM波输出
P1SEL|=BIT2; //选择通道A1(P1.2口)
P1DIR|=BIT2; //P1.2口为输出方向
break;
case ‘N’:case ‘n’:
TACCTL1|=OUTMOD_7; //低电平输出
P1SEL|=BIT2;
P1DIR|=BIT2;
break;
case ‘0’:case 0: //p1.2口为普通IO口
P1SEL&=~BIT2;
Break;
default : return(0); //参数有误
}
switch(Mode2)
{
case ‘P’:case ‘p’: //设置为高电平模式
TACCTL1|=OUTMOD_3; //高电平PWM波输出
P1SEL|=BIT3; //选择通道A2(P1.3口)
P1DIR|=BIT3; //P1.3口为输出方向
break;
case ‘N’:case ‘n’:
TACCTL1|=OUTMOD_3; //低电平输出
P1SEL|=BIT3;
P1DIR|=BIT3;
break;
case ‘0’:case 0: //p1.3口为普通IO口
P1SEL&=~BIT3;
Break;
default : return(0); //参数有误
}
}
//工作于增模式时,TA计数到TACCR0,设CCR0就完成了周期的设置。
void TAPwmSetPeriod(unsigned int Period)
{
TACCR0 = Period;
}
//设置占空比:设置TA的PWM输出的有效电平的时间。
void TAPwmSetDuty(char Channel,unsigned int Duty)
{
switch(Channel)
{
case 1: TACCR1=Duty; break;
case 2: TACCR2=Duty; break;
}
}
void TAPwmSetPermill(char Channel,unsigned int Percent)
{
unsigned long int Period;
unsigned int Duty;
Period = TACCR0;
Duty = Period * Percent / 5000;
TAPwmSetDuty(Channel,Duty);
}