定时器捕获Word格式.docx

上传人:b****2 文档编号:5132830 上传时间:2023-05-04 格式:DOCX 页数:10 大小:20.03KB
下载 相关 举报
定时器捕获Word格式.docx_第1页
第1页 / 共10页
定时器捕获Word格式.docx_第2页
第2页 / 共10页
定时器捕获Word格式.docx_第3页
第3页 / 共10页
定时器捕获Word格式.docx_第4页
第4页 / 共10页
定时器捕获Word格式.docx_第5页
第5页 / 共10页
定时器捕获Word格式.docx_第6页
第6页 / 共10页
定时器捕获Word格式.docx_第7页
第7页 / 共10页
定时器捕获Word格式.docx_第8页
第8页 / 共10页
定时器捕获Word格式.docx_第9页
第9页 / 共10页
定时器捕获Word格式.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

定时器捕获Word格式.docx

《定时器捕获Word格式.docx》由会员分享,可在线阅读,更多相关《定时器捕获Word格式.docx(10页珍藏版)》请在冰点文库上搜索。

定时器捕获Word格式.docx

2-例程

#include<

msp430x14x.h>

unsignedintstart,end;

unsignedcharoverflow;

voidmain(void)

{

WDTCTL 

=WDTPW+WDTHOLD;

//关闭看门狗定时器

P1DIR=BIT0+BIT4;

//设置P1.0方向为输出

P1SEL=BIT2;

//设置P1.2端口为功能模块使用

TACTL=TASSEL0+TACLR+TAIE+MC1;

//定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式

CCTL1=MC0+SCS+CAP+CCIE;

//输入上升沿捕获,CCI0A为捕获信号源

_EINT();

//中断允许

while

(1);

//LOOP

}

#pragmavector=TIMERA1_VECTOR 

//定时器A中断处理

__interruptvoidtimer_a(void)

switch(TAIV) 

//向量查询

case 

2:

//捕获中断

if(CCTL1&

CM0) 

//上升沿

{

CCTL1=(CCTL1&

(~CM0))|CM1;

//更变设置为下降沿触发

start=TAR;

//记录初始时间

overflow=0;

//溢出计数变量复位

}

elseif(CCTL1&

CM1) 

//下降沿

(~CM1))|CM0;

//更变设置为上升沿触发

end=TAR;

//用start,end,overflow计算脉冲宽度

break;

case10:

//定时器溢出中断

overflow++;

//溢出计数加1

default:

//例程结束

-----------------------------------

msp430单片机定时器Timer_A

Timer_A定时器:

注:

msp430有两个16位定时器Timer_A和Timer_B.二者基本相同。

主要有TACTL,TAR,CCTL0,CCR0,CCTL1,CCR1,CCTL2,CCR2,TAIV几个寄存器。

其中最主要的是TACTL寄存器,它决定Timer_A的输入时钟信号,Timer_A的工作模式,Timer_A的开启与停止,中断的申请等。

定时器A大致可分为四个功能模块:

计数器、比较/捕获寄存器0、比较/捕获寄存器1、比较/捕获寄存器2。

计数器是主体它是一个开启和关闭的定时器,如果开启它就是一直在循环计数,只会有一个溢出中断,也就是当计数由0xffff到0时会产生一个中断。

那怎么实现定时功能呢?

这就要靠三个比较/捕获寄存器了以后用CCRx表示。

CCR0比较特殊,通过他可以改变计数器的最大计数值,也就是当计数器计数到CCR0的值时自动会将计数器清零。

但这需要设置相应的工作模式,模式列表如下:

0——停止模式,用于定时器的暂停

1——增计数模式,计数器计数到CCR0,再清零计数

2——连续计数模式,计数器增计数到0xffff,再清零计数

3——增/减计数模式,增计数到CCR0,再减计数到0

当计数器计数到CCR0时,CCR0单元会产生一个中断。

同样当计数器计数到CCR1和CCR2时,两个单元也都会个产生一个中断。

这样我们可以通过定时器A得到三个定时时间了。

看程序中的定时器初始化模块。

CCTLx是相应比较/捕获寄存器的控制寄存器。

它可对比较/捕获寄存器进行设置,在这里只用到比较功能,也就是当计数到CCRx时产生中断,由于CCTLx默认的是比较功能,所以一般也就只用到CCIE这个控制字,就是开启相应比较器的中断。

CCRx就是相应比较器的值。

下面介绍几个Timer_A的重要寄存器:

TACTL寄存器:

15~10

9

8

7

6

5

4

3

2

1

未用

SSEL1

SSEL0

ID1

ID0

MC1

MC0

CLR

TAIE

TALFG

SSEL_1SSEL_0是时钟源的选择

0——TACLK,使用外部引脚信号作为输入

1——ACLK,辅助时钟

2——SMCLK,子系统主时钟

3——INCLK,外部输入时钟

对TACTL进行模式设置的同时也开启了定时器,要停止只需把MC_0赋值给TACTL就可以。

ID1ID0是时钟源的分频选择

00——不分频

01——2分频

10——4分频

11——8分频

MC1MC0是模式选择

CLR——————定时器清楚位

TAIE——————定时器中断允许位

TAIFG——————定时器溢出标志位

TAR寄存器:

16位计数器,是执行计数的单元,是计数器的主体。

我的理解:

即存储你的计数值,0——>

CCR0

CCTLx寄存器:

捕获比较控制寄存器:

15/14

13/12

11

10

7/6/5

CAPTMOD1~0

CCIS1~0

SCS

SCCIx

CAP

OUTMODx

CCIEx

CCIx

OUT

COV

CCIFGx

CAPTMOD1~0:

选择捕获模式

00————禁止捕获模式

01————上升沿捕获

10————下降沿捕获

11————上升沿与下降沿都捕获

CCIS1~0:

捕获事件输入源

00————选择CCIxA

01————选择CCIxB

10————选择GND

11————选择Vcc

SCS——选择捕获信号与定时器时钟同步、异步关系

0:

异步捕获

1:

同步捕获(实际中经常使用同步模式,捕获总是有效的)

SCCIx——比较相等信号EQUx将选中的捕获/比较输入信号CCIx(CCIxA,CCIxB,Vcc和GND)进行锁存,然后可由SCCIx读出。

CAP——选择捕获模式还是比较模式。

比较模式

捕获模式

OUTMODx:

选择输出模式

000————输出

001————置位

010————PWM翻转/复位

011————PWM置位/复位

100————翻转

101————复位

110————PWM翻转/置位

111————PWM复位/置位

CCIEx——捕获/比较模块中断允许位

禁止中断

允许中断

CCIx——捕获/比较模块的输入信号

由CCIS0和CCIS1选择的输入信号可通过该位读出

CCIx复位

OUT——输出信号(如果OUTMODx选择输出模式0,则该位对应于输入状态)

输出低电平

输出高电平

COV——捕获溢出标志

没有捕获溢出

发生捕获溢出

当CAP=0时,选择比较模式。

捕获信号发生复位。

没有使COV置位的捕获事件

当CAP=1时,选择捕获模式。

如果捕获寄存器的值被读出前再次发生捕获事件,则COV置位。

程序检测COV来判断原值读出前是否又发生捕获事件。

读捕获寄存器时不会使溢出标志复位,须用软件复位。

CCIFGx——捕获比较中断标志

寄存器CCRx捕获了定时器TAR值时置位

定时器TAR值等于寄存器CCRx值时置位

//******************************************************************************

//Date:

2009.8.4

//Author:

xurafreedom

//Email:

freedomxura@/mxh20999@

//Blog:

//

//Description:

ToggleP3.4usingsoftwareandTA_0ISR.Togglesevery

//50000SMCLKcycles.SMCLKprovidesclocksourceforTACLK.

//DuringtheTA_0ISR,P3.4istoggledand50000clockcyclesareaddedto

//CCR0.TA_0ISRistriggeredevery50000cycles.CPUisnormallyoffand

//usedonlyduringTA_ISR.

//ACLK=n/a,MCLK=SMCLK=TACLK=defaultDCO~800kHz

//Softwarerelease:

IARAssemblerforMSP430V4.09A/W32(4.9.1.9)

/********************函数声明******************/

voidInitClock();

/********************主函数********************/

voidmain(void)

WDTCTL=WDTPW+WDTHOLD;

//StopWDT

InitClock();

//Initializetheclock

P3DIR|=BIT4;

//P3.4output

CCTL0=CCIE;

//CCR0interruptenabled

CCR0=500;

TACTL=TASSEL_2+MC_1;

//SMCLK,UptoCCR0mode

_BIS_SR(LPM0_bits+GIE);

//EnterLPM0w/interrupt

/*******************************************

函数名称:

InitClock

功能:

初始化时钟函数

参数:

返回值:

********************************************/

voidInitClock()

unsignedintoscdly;

BCSCTL1&

=~XT2OFF;

//------------清OSCOFF/XT2,使XT2振荡器有效

do

IFG1&

=~OFIFG;

//------------清OFIFG

oscdly=255;

while(oscdly--);

//------------延时等待

while(IFG1&

OFIFG);

//------------直到OFIFG=0为止

//-------------------------------------------------------------

DCOCTL|=DCO0+DCO1+DCO2;

//MaxDCO

BCSCTL1|=RSEL0+RSEL1+RSEL2;

//XT2on,maxRSEL

//这两句设置DCOCTL和BCSCTL1,设置DCO的频率

//一般来说,PUC复位之后,如果没有特定设置系统时钟MCLK,MCU将默

//认DCO振荡器产生的频率为系统时钟,不过如果设置BCSCTL2来选定

//MCLK的时钟源的话(如:

BCSCTL2|=SELM_2+SELS;

)系统时钟就是由

//XT2振荡而来.

//SMCLKandMCLKusesXT2

//这一句设置BCSCTL2,选定MCLK和SMCLK的时钟源

//注意:

ACLK只能来源于LFXT1.可以在BCSCTL1里设置ACLK的分频。

Timer_A

定时器A中断服务子函数,当

//TimerA0interruptserviceroutine

#pragmavector=TIMERA0_VECTOR

__interruptvoidTimer_A(void)

P3OUT^=BIT4;

//ToggleP3.4

------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2