msp430单片机:Timer_A捕获模式

Timer_A捕获模式(以msp430f149为例)

一、捕获模式的介绍
1、捕获模式是在应用中很常用的一种模式,可以进行脉冲计数,侧量脉宽,可以用作小球计数、频率计、超声波测距等应用中。

2、捕获模式可以捕捉上升沿,也可以捕捉下降沿。需要对寄存器进行具体设置。

3、捕获模式的实质就是在捕获上升沿或者下降沿的同时进入捕获中断,执行中断服务函数,同时把TAR计数的值赋给 TACCR0或TACCR1、TACCR2(要看具体用的是哪个引脚的捕获),从而捕获到当前TAR(计数器)的值。
4、捕获模式类似于51单片机的计数器,但是又与计数器工作原理有很大差别,功能也比计数器强大。它既可以脉冲计数也可以计算一个脉冲宽度(也就是高电平的时间或者低电平的时间),也可以计算脉冲周期(一个脉冲整个周期的时间)。

二、捕获模式的使用
(一)、要设置的相关寄存器(每个寄存器有16位)
TimerA 控制寄存器 TACTL
捕获/比较寄存器 0 TACCR0 (TA0对应P11 P15 P22)
捕获/比较寄存器 1 TACCR1 (TA1对应P12 P16 P23)
捕获/比较寄存器 2 TACCR2 (TA0对应P13 P17 P23)
捕获/比较控制寄存器 0 TACCTL0 (控制TA0口相关功能)
捕获/比较控制寄存器 1 TACCTL1 (控制TA1口相关功能)
捕获/比较控制寄存器 2 TACCTL2 (控制TA2口相关功能)
(二)、看图,TA0 TA1 TA2 图上IO口都有标注,捕获就是从这几个引脚输入的
只要捕获到上升沿或者下降沿,就会进入Timer_A中断。
在这里插入图片描述

(三)、把P12做捕获输入相关寄存器的设置方法
例子:P12做捕获输入(TA1)

 TACTL   |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
  TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//开捕获模式,上升沿捕获,CCI1A输入,同步捕//获,中断允许
  P1DIR &=~ BIT2;  //P1.2输入
  P1SEL |=BIT2;    //P1.2第二功能,捕获输入

例子:P23做捕获输入(TA1)

  TACTL   |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
  TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//开捕获模式,上升沿捕获,CCI1A输入,同步捕//获,中断允许
  P2DIR &=~ BIT3;  //P2.3输入
  P2SEL |=BIT3;    //P2.3第二功能,捕获输入

总结的方法:1、先对Timer_A的工作方式进行设置TACTL,TACTL一定要设置其中一种计数模式,其他寄存器按应用功能而定
2、对相关捕获/比较控制寄存器进行设置:TACCTL1(设置工作模式)
3、打开总中断
4、初始化IO口
5、写中断服务函数

#pragma vector=TIMERA1_VECTOR  //捕获中断向量
__interrupt void Timer_A(void)
{ 
  switch(TAIV)    //2为TA1捕获向量地址4为TA2捕获向量地址
  { 
    case 2 :  break;  
	case 4 :  break;  
  }
}

这里的中断向量依然是TIMERA1_VECTOR,要注意的是TAIV中断向量地址,如果TAIV被读的话就不用清除中断标志位,否者就要手动清除 ,写法:TACCTLx &=~CCIFG;
在这里插入图片描述

代码实例1:

/*小球脉冲计数*/
#include "msp430x14x.h"
unsigned int n;//计录次数
void main(void)
{
  WDT_Init();                        //看门狗设置
TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
  TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕
//获,中断允许 
  _EINT();                           //开全局中断

  P1DIR &=~ BIT2;//P1.2输入
  P1SEL |=BIT2; //P1.2第二功能,捕获输入
  while(1)
  {     
  }
}
#pragma vector=TIMERA1_VECTOR  //捕获中断向量
__interrupt void Timer_A(void)
{
  switch(TAIV)    //2为捕获向量地址
  { 
	case 2: n++;break;
  }
}

代码实例2:

/*超声波测距*/
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
#define  RISE  1
#define  FALL  0

uint num,temp;
uchar Edge=1;//当前触发沿
uint RiseCapVal;//上升沿时刻捕获值存放变量
uint TA_Overflow_Cnt; //TA溢出次数存放变量,可能距离远超过65535  TA_Overflow_Cnt
unsigned long int Period;//脉宽存放结果变量,高电平时间
unsigned long int S; // 定义距离长度,单位厘米
void init_timerA(void)

{
   TACTL   |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
   TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许 
}
void init_IO(void)//SRF05_IOinit()
{
  P1DIR |= BIT4; //P1.4输出,普通I/O
  P1DIR &=~ BIT2;//P1.2输入
  P1SEL |=BIT2; //P1.2第二功能,捕获输入
  P1OUT &=~BIT4;// 开始低电平,控制驱动波形发生
  delay_ms(1000);
}
 
void Clock_Init()
{
  uchar i;
  BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
  do{
    IFG1&=~OFIFG;                   //清楚振荡器错误标志
    for(i=0;i<100;i++)
       _NOP();
  }
  while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
  IFG1&=~OFIFG; 
}
void main(void)
{ 
 WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
 Clock_Init();
 init_timerA();
 TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;         //改为上升沿捕获
 _EINT();//开全局中断
 while(1)
 {  
     P1OUT |= BIT4; // P1.1 高电平,超过10us  
     delay_ms(10);
     P1OUT &=~BIT4;
     delay_ms(200);  
 }
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  switch(TAIV)
  {
    case 2 :if(Edge==RISE)
    {
      RiseCapVal = TACCR1;
      TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
      Edge = FALL;//下降沿捕获标志
    }
     else
     {
      _DINT();
      Period = TACCR1-RiseCapVal;//这里要注意是否考虑溢出,跟测试距离有关,希望大家拓展 
      S=(Period*17)/100;// 距离计算 s=340m/s*Period/2*10^(-6)*1000(mm)  
      TACCR1 = 0; 
      TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获 
      Edge = RISE;//上升沿捕获标志
     _EINT();
     }
     break;
 	 case 4 : break;
 	 case 10: TA_Overflow_Cnt++;//溢出标志
     break;
 }

}

16 位定时器 A 模块寄存器

16 位定时器 A 模块寄存器有下列:
寄存器名称 寄存器缩写
TimerA 控制寄存器 TACTL
TimerA 计数器 TAR
TimerA 中断向量寄存器 TAIV
捕获/比较寄存器 0 TACCR0
捕获/比较寄存器 1 TACCR1
捕获/比较寄存器 2 TACCR2
捕获/比较控制寄存器 0 TACCTL0
捕获/比较控制寄存器 1 TACCTL1
捕获/比较控制寄存器 2 TACCTL2
[1] TACTL TIMER_A 控制寄存器
全部关于定时器及其操作的控制位都包含在定时器控制寄存器 TACTL 中。POR 信号后 TACTL 的所有位
都自动复位,但在 PUC 信号后不受影响。TACTL 各位的定义如下:
TASSELx:选择定时器进入输入分频器的时钟源
0: TACLK 特定的外部引脚时钟
1: ACLK 辅助时钟
2: MCLK 系统时钟
3: INCLK 器件特有时钟
IDx:输入分频选择
0: 不分频
1: 2 分频
2: 4 分频
3: 8 分频
MCx:计数模式控制位
0: 停止模式
1: 增计数模式
2: 连续计数模式
3: 增/减计数模式
TACLR:定时器清除位
POR 或 CLR 置位时定时器和输入分频器复位。CLR 由硬件自动复位,其读出始终为 0。定时器再下
一个有效输入沿开始工作。如果不是被清除模式控制位暂停,则定时器以增计数模式开始工作。
0: 无操作
1: 清除 TAR,时钟分频,计数模式的设置。清除设置后自动清零54
TAIE:定时器中断允许位
0: 禁止定时器溢出中断
1: 允许定时器溢出中断
TAIFG:定时器溢出标志位
增计数模式时:当定时器由 CCR0 计数到 0,TAIFG 置位;
连续计数模式时:当定时器由 0FFFFH 计数到 0 时,TAIFG 置位
增/减计数模式时:当定时器由 CCR0 减计数到 0 时,TAIFG 置位。
0: 没有 TA 中断请求
1: 有 TA 中断请求
[2] TAR TIMER_A 计数器
该单元就是执行计数的单元,时计数器的主体,其内容可读可写。
[3] TACCTLx TIMER_A 捕获/比较控制寄存器 x
TIMER_A 有多个捕获/比较模块,每个模块都有自己的控制字 TACCTLx,这里 x 为捕获/比较模块序号。
该寄存器再 POR 信号后全部复位,但在 PUC 信号后不受影响。该寄存器中各位的定义如下:
CMx:选择捕获模式
0: 禁止捕获模式
1: 上升沿捕获
2: 下降沿捕获
3: 上升沿和下降沿都捕获
CCISx:在捕获模式中用来定义提供捕获事件的输入源
0: 选择 CCIxA
1: 选择 CCIxB
2: 选择 GND
3: 选择 Vcc
SCS:选择捕获信号与定时时钟同步/异步关系
异步捕获模式允许在请求时立即将 CCIFG 置位和捕获定时器值,适用于捕获信号的周期远大于定时
器周期的情况。但是,如果定时器时钟和捕获信号发生时间竞争,则捕获寄存器的值可能出错。
0: 异步捕获
1: 同步捕获SCCI:同步比较/捕获输入
比较相等信号 EQU 信号将选中的捕获/比较输入信号 CCI 进行锁存,然后可由 SCCI 读出。
CAP:选择捕获模式/比较模式
如果通过捕获/比较寄存器 TACCTLx 中的 CAP 使工作模式从比较模式变为捕获模式,那么不应同时
进行捕获,否则,在捕获/比较寄存器中的值使不可预料的。
推荐的指令顺序如下:(1)修改控制寄存器,由比较模式切换到捕获模式。(2)捕获
0: 比较模式
1: 捕获模式
OUTMODx:选择输出模式
0: 输出
1: 置位
2: PWM 翻转/复位
3: 置位/复位
4: 翻转
5: 复位
6: PWM 翻转/置位
7: PWM 复位/置位
CCIE:捕获/比较模块中断允许位
0: 禁止中断(TACCRx)
1: 允许中断(TACCRx)
CCI:捕获/比较模块的输入信号
捕获模式:由 CCIS0 和 CCIS1 选择的输入信号可通过该位读出
比较模式:CCI 复位
OUT:输出信号
如果 OUTMODx 选择输出模式 0(输出),则该位对应于输入状态。
0: 输出低电平
1: 输出高电平
COV:捕获溢出标志
当 CAP=0 时,选择比较模式.捕获信号发生复位。没有使 COV 置位的捕获事件。
当 CAP=1 时,选择捕获模式。如果捕获寄存器的值被读出前在此发生捕获事件,则 COV 置位。程
序可检测 COV 来判断原值读出前是否又发生捕获事件。读捕获寄存器时不会使溢出标志复位,须用软件
复位。
0: 没有捕获溢出
1: 发生捕获溢出
CCIFG:捕获比较中断标志
捕获模式:寄存器 CCRx 捕获了定时器 TAR 值时置位。
比较模式:定时器 TAR 值等于寄存器 CCRx 值时置位。
0: 没有中断请求(TACCRx)
1: 有中断请求(TACCRx)
5556
[4] TACCRx TIMER_A 捕获/比较寄存器 0
在捕获/比较模块中,可读可写。
在捕获方式,当满足捕获条件,硬件自动将计数器 TAR 数据写入该寄存器。如果测量某窄脉冲(高电平)
脉冲长度,可定义上升沿和下降沿都捕获。在上升沿时,捕获一个定时器数据,这个数据在捕获寄存器中
读出;再等待下降沿到了,在下降沿时又捕获一个定时器数据;那么两次捕获的定时器数据就时窄脉冲的
高电平宽度。
其中 CCR0 经常用作周期寄存器,其他 CCRx 相同。
[5]TAIV TIMER_A 中断向量寄存器
TIMER_A 中断可由计数器溢出引起,也可以来自捕获/比较寄存器。每个捕获/比较模块可独立编程,
由捕获/比较外部信号以产生中断。外部信号可以是上升沿,也可以是下降沿,也可以两者都有。
Timer_A 模块使用两个中断向量,一个单独分配给捕获/比较寄存器 CCR0,另一个作为共用中断向量用于
定时器和其他的捕获/比较寄存器。57
捕获/比较寄存器 CCR0 中断向量具有最高优先级

猜你喜欢

转载自blog.csdn.net/mbs520/article/details/106081428