完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
**
捕获模式 ** 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]
TAR, Timer_A 寄存器 TARx Bits15-0Timer_A 寄存器。 TAR 寄存器是 Timer_A 的计数。 TACCTLx,捕捉/比较控制寄存器 |
||||
|
||||
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 02:46 , Processed in 1.124738 second(s), Total 50, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号