单片机
返回首页

MSP430F169 Timer_A原理(二)------Timer_A捕获模式

2022-10-08 来源:csdn

**


捕获模式

**

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中断。

msp430f169引脚图

(三)、把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 模块寄存器

image.png

TACTL, Timer_A 控制寄存器


TACTL
在这里插入图片描述在这里插入图片描述

TAR, Timer_A 寄存器

TAR

TARx Bits15-0Timer_A 寄存器。 TAR 寄存器是 Timer_A 的计数。


TACCTLx,捕捉/比较控制寄存器

TACCTLx
在这里插入图片描述在这里插入图片描述

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 单稳态控制电路设计与分析

  • IGBT模块通过控制门极阻断过电流

  • CCFL的工作原理及电子驱动电路解析

  • 开关电源的基本组成及工作原理

  • 比较常见的功率整流器和滤波电路

  • 一个简单的红外耳机电路

    相关电子头条文章