我是靠谱客的博主 昏睡白羊,最近开发中收集的这篇文章主要介绍MSP430F169 Timer_A原理(二)------Timer_A捕获模式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

**

捕获模式

**
CAP = 1 时选择捕获模式。捕获模式用于记录时间事件。它可用于速度计算或时间测量。捕获输入 CCIxA 和 CCIxB 连接到外部引脚或内部信号,并通过 CCISx 位进行选择。 CMx 位选择输入信号的捕捉沿为上升沿、下降沿或两者兼有。捕获发生在输入信号的选定边沿。如果发生捕捉:

定时器值被复制到 TACCRx 寄存器中

中断标志 CCIFG 置位

输入信号电平可以随时通过 CCI 位读取。 MSP430x1xx 系列器件可能有不同的信号连接到 CCIxA 和 CCIxB。有关这些信号的连接,请参阅特定于器件的数据表。
捕获信号可能与定时器时钟异步并导致竞争条件。设置 SCS 位将使捕获与下一个定时器时钟同步。建议设置 SCS 位以将捕获信号与定时器时钟同步。这在图 11-10 中进行了说明。
11-10.捕获信号(SCS=1)
每个捕获/比较寄存器中都提供了溢出逻辑,以指示在读取第一次捕获的值之前是否执行了第二次捕获。发生这种情况时,COV 位被设置,如图 11-11 所示。 COV 必须用软件重置。
11-11
(捕获可以由软件启动。 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 模块寄存器

寄存器简写寄存器类型地址初始状态
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 控制寄存器

TACTL
在这里插入图片描述在这里插入图片描述
TAR, Timer_A 寄存器
TAR
TARx Bits15-0Timer_A 寄存器。 TAR 寄存器是 Timer_A 的计数。

TACCTLx,捕捉/比较控制寄存器
TACCTLx
在这里插入图片描述在这里插入图片描述
————————————————
本文参考:MSP430x1xx User’s guide
CSDN博主「化作尘」的原创文章
部分原文链接:https://blog.csdn.net/mbs520/article/details/106081428/

最后

以上就是昏睡白羊为你收集整理的MSP430F169 Timer_A原理(二)------Timer_A捕获模式的全部内容,希望文章能够帮你解决MSP430F169 Timer_A原理(二)------Timer_A捕获模式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部