完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、捕获模式的介绍
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) (三)、把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 中断向量具有最高优先级 |
|
|
|
只有小组成员才能发言,加入小组>>
2553 浏览 0 评论
1152浏览 2评论
750浏览 1评论
504浏览 0评论
269浏览 0评论
433浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 16:43 , Processed in 1.789714 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号