单片机学习小组
直播中

张览秀

9年用户 1239经验值
擅长:可编程逻辑 电源/新能源
私信 关注

捕获模式是什么?怎样去使用捕获模式呢

捕获模式是什么?怎样去使用捕获模式呢?
把P12做捕获输入相关寄存器的设置方法是什么?



回帖(1)

李海

2022-1-26 09:18:59
**
捕获模式

**
CAP = 1 时选择捕获模式。捕获模式用于记录时间事件。它可用于速度计算或时间测量。捕获输入 CCIxA 和 CCIxB 连接到外部引脚或内部信号,并通过 CCISx 位进行选择。 CMx 位选择输入信号的捕捉沿为上升沿、下降沿或两者兼有。捕获发生在输入信号的选定边沿。如果发生捕捉:
定时器值被复制到 TACCRx 寄存器中
中断标志 CCIFG 置位
输入信号电平可以随时通过 CCI 位读取。 MSP430x1xx 系列器件可能有不同的信号连接到 CCIxA 和 CCIxB。有关这些信号的连接,请参阅特定于器件的数据表。
捕获信号可能与定时器时钟异步并导致竞争条件。设置 SCS 位将使捕获与下一个定时器时钟同步。建议设置 SCS 位以将捕获信号与定时器时钟同步。这在图 11-10 中进行了说明。

每个捕获/比较寄存器中都提供了溢出逻辑,以指示在读取第一次捕获的值之前是否执行了第二次捕获。发生这种情况时,COV 位被设置,如图 11-11 所示。 COV 必须用软件重置。

(捕获可以由软件启动。 CMx 位可以设置为在两个边沿进行捕获。然后软件设置 CCIS1 = 1 并切换位 CCIS0 以在 VCC 和 GND 之间切换捕获信号,每次 CCIS0 更改状态时启动捕获)
一、捕获模式的介绍

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 "msp430F169.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;
}


}


代码实例2:


/*小球脉冲计数*/
#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;
  }
}


16 位定时器 A 模块寄存器

[tr]寄存器简写寄存器类型地址初始状态[/tr]

Timer_A控制器TACTL读/写0160hPOR 复位
Timer_A 计数器TAR读/写0170hPOR 复位
Timer_A 捕获/比较控制 0TACCTL0读/写0162hPOR 复位
Timer_A 捕获/比较0TACCR0读/写0172hPOR 复位
Timer_A 捕获/比较控制 1TACCTL1读/写0164hPOR 复位
Timer_A 捕获/比较 1TACCR1读/写0174hPOR 复位
Timer_A 捕获/比较控制 2TACCTL2读/写0166hPOR 复位
Timer_A 捕获/比较 2TACCR2读/写0176hPOR 复位
Timer_A 中断向量TAIV只读012EhPOR 复位
TACTL, Timer_A 控制寄存器


TAR, Timer_A 寄存器

TARx Bits15-0Timer_A 寄存器。 TAR 寄存器是 Timer_A 的计数。
TACCTLx,捕捉/比较控制寄存器

举报

更多回帖

发帖
×
20
完善资料,
赚取积分