MSP430定时器A.ppt
第7章 MSP430 定时器 Timer_A第1节 定时器/计数器概述第2节 MSP430 Timer_A第3节 Timer_A 应用编程举例,本章教学目标:1、了解定时器/计数器基本概念2、掌握 Timer_A 的组成与工作原理3、掌握 Timer_A 编程技术,第1节 定时器/计数器概述,在实际应用中,经常需要对外部事件进行计数、定时控制、PWM等定制波形输出、脉冲宽度测量、速度测量、周期/频率测量、事件发生时刻的捕捉,这些测量与控制功能均可借助定时器/计数器来实现。因此MCU中通常均设计有多个定时器/计数器。在MCU中,无论是定时功能还是计数功能,实际上都是由n位(8位、16位、32位等)的加法/减法计数器实现,区别仅在于计数输入信号的不同。一般地讲,计数器的计数输入信号是外部事件(脉冲信号),而定时器的计数输入信号则是MCU中的时钟信号或经过分频后的时钟信号。,第2节 MSP430 Timer_A,异步16-bit定时器/计数器,具有4种工作模式;可编程选择的时钟源;3个可编程的捕捉/比较寄存器;可编程输出方式(8 种);具有中断功能(计数器溢出、捕捉/比较中断),Timer Block定时器模块,CCR0捕捉/比较模块0,TACLKTAINCLK,P1.2/TA1P1.6/TA1P2.3/TA1,P1.3/TA2P1.7/TA2P2.4/TA2,P1.1/TA0P2.2/TA0P1.5/TA0P2.7/TA0,MSP430F149 Timer_A 原理图,CCR1捕捉/比较模块1,CCR2捕捉/比较模块2,EQU0,捕捉输入(CCIxA)/比较输出引脚捕捉输入(CCI0B)引脚比较输出引脚,定时器模块(Timer Block),Timer Clock 的上升沿触发 16-bit 的定时/计数寄存器(TAR)加 1 或减 1(取决于计数方式)。另外,TAR 可以由程序读出,也可以由程序设置初值。,CCR0比较器输出,00:/101:/210:/411:/8,00:stop mode01:up mode10:continuous mode11:up/down mode,1:TA interrupt enabled,1:interrupt pending,1:reset TAR,clock divider and count direction for up/down mode.The TACLR bit is automatically reset and is always read as zero.,定时器 A 控制寄存器,定时器 A 的四种计数方式(Count Mode),Mode Control,0 0:stop mode0 1:up mode1 0:continuous mode1 1:up/down mode,MCxcount mode,Stop mode:the timer is halted当不使用Timer时,应将Timer配置为Stop mode,这样可以降低芯片的功耗,period=(TACCR0+1)T,Up Mode锯齿波方式,需要CCR0(比较方式)协助,T,在Timer Clock的上升沿处TAR=TAR+1,当TARTACCR0时,自动清零TAR,Continuous Mode最大锯齿波方式,注意:本方式不需要CCR0协助,Up/Down Mode三角波方式,注意:本方式需要CCR0(比较方式)协助,捕捉/比较模块Capture/Compare Blocks,Timer Block定时器模块,CCR0捕捉/比较模块0,TACLKTAINCLK,P1.2/TA1P1.6/TA1P2.3/TA1,P1.3/TA2P1.7/TA2P2.4/TA2,P1.1/TA0P2.2/TA0P1.5/TA0P2.7/TA0,CCR1捕捉/比较模块1,CCR2捕捉/比较模块2,EQU0,Capture/Compare Block,捕捉/比较 控制寄存器 TACCTLx(x=0,1,2)capture/compare control register,capture mode00:no capture01:rising edge10:falling edge11:rising&falling edge,capture input00:CCIxA01:CCIxB10:GND11:Vcc,0:异步捕捉方式1:同步捕捉方式,0:比较方式1:捕捉方式,输出方式,8种,1:中断允许,中断标志,1:捕捉溢出,输出方式0的直接输出编程位,Capture/Compare Block,以 CCR2 为例,CAP=0:Compare Mode 比较方式CAP=1:Capture Mode 捕捉方式,捕捉方式(Capture Mode,CAP=1)用于捕捉事件发生的时刻可应用于速度、脉冲宽度等测量,CAP=1,捕捉方式(Capture Mode,CAP=1),当捕捉电路捕捉到一个有效的输入信号后:将 TAR 的值锁存至 TACCRx 中;置位中断标志位 TACCRx CCIFG,置位SCS将使捕捉信号与下一个时钟信号同步,实际使用时推荐使用该同步方式(SCS=1),同步捕捉方式(SCS=1,CAP=1),同步时钟 同步电路,同步选择,当捕捉电路捕捉到一个有效的输入信号后:将 TAR 的值锁存至 TACCRx 中;置位中断标志位 TACCRx CCIFG,同步捕捉方式(SCS=1,CAP=1)同步过程示意图,竞争条件(竞争冒险),在Timer Clock的下降沿处同步,此时Timer的值是稳定的,MOV#CAP+SCS+CCIS0+CM_1,&TACCTLx,同步捕捉方式设置(CAP=1,SCS=1),CCIxB capture on rising edge,比较方式(Compare Mode,CAP=0)主要应用:产生 PWM 等定制输出信号;定时输出:在指定时间间隔结束后产生输出;定时中断:在指定时间间隔结束后产生中断。工作原理:当 TAR 计数到 TACCRx 时 置位中断标志 CCIFG;内部信号 EQUx=1;根据输出方式输出相应的信号。,CAP=0,比较方式(Compare Mode,CAP=0)(是否需要清零 CMx,以停止捕捉功能?),当 TAR 计数到 TACCRx 的值的时候:内部信号 EQUx=1;置位中断标志 TACCRx CCIFG;CCI 被锁存入 SCCI 中;根据输出方式输出相应的信号(参见输出电路),TA 比较电路(CAP=0),比较输出电路,OUTx,x=0,1,2,输出方式选择(8种),除方式0外,OUTx在Timer Clock的上升沿处改变,x=0,1,2,OUTMODx=000,输出方式0,OUTx=OUT,1,OUT=TACCTLx.2,输出方式 0 可用于输出信号的初始化,OUTMODx 000,输出方式17OUTx 与 OUT 无关,对输出电路0(x=0)无意义EQUx=EQU0,7种输出方式定义:,mode 5 是 mode mode 1 的反mode 6 是 mode mode 2 的反mode 7 是 mode mode 3 的反,常用输出方式定义:,定时器:Up Mode使用TACCR0 和 TACCR1,输出举例1,当初始输出=0时,mode2和mode3的效果相同,OUT1,改变 TACCR1,可改变输出正脉冲的宽度,但周期不变,从而改变了占空比,实现了 PWM 输出;改变TACCR0,并使TACCR1=TACCR0/2,则可以得到占空比=50%的调频信号输出。,OUT1,定时器:Continuous Mode使用TACCR0 和 TACCR1,输出举例2,当初始输出=0时,mode2和mode3的效果相同,OUT1,定时器:Up/Down Mode使用TACCR0 和 TACCR1,输出举例3,OUT2,定时器:Up/Down ModeOUT1 使用 TACCR0 和 TACCR1OUT2 使用 TACCR0 和 TACCR2,输出举例4,OUT1OUT2,Tdead=Ttimer(TACCR1-TACCR2)Ttimer:Cycle time of the timer clock,Tdead,Timer_A 中断,与 Timer_A 模块有关中断有两大类:TACCR0 中断:TACCR0 CCIFG,独享中断向量,在 0FFECh 中 TAIV 中断:TACCR1 CCIFG TACCR2 CCIFG 共享中断向量,在 0FFEAh 中 TAIFG,Timer Block定时器模块,CCR0捕捉/比较模块0,CCR1捕捉/比较模块1,CCR2捕捉/比较模块2,TAIFG,TACCR1 CCIFG,TACCR2 CCIFG,TACCR0 CCIFG,共享同一个中断向量,独享一个中断向量,TAIV 中断,TACCR0 中断,TACCR0 中断产生与控制电路,TACCR0 CCIFG,GIE,CAP=0:Compare Mode 比较方式CAP=1:Capture Mode 捕捉方式,TACCTL0.4,TACCTL0.8,捕捉信号,比较信号,#include;-ORG 01100h;Program Start;-RESETmov#0A00h,SP;Initialize stackpointermov#CCIE,TACCR0 interrupt Vector DW TACCR0_ISR END,TACCR0 中断子程结构,TAIV中断(3 种中断,共享同一个中断向量),TAIV中断的中断向量偏移(=TAIV寄存器的值),TACCR1、TACCR2 和 TAIFG 的中断向量(中断入口地址)TACCR1 的中断向量=TAIV Interrupt Vector+02hTACCR2 的中断向量=TAIV Interrupt Vector+04hTAIFG 的中断向量=TAIV Interrupt Vector+0Ah其中:TAIV Interrupt Vector=0FFEAh 0FFEBh中的值,TAIV中断的中断向量偏移(=TAIV寄存器的值),TACCRx(x=1,2)中断产生与控制电路,TACCRx CCIFG,GIE,CAP=0:Compare Mode 比较方式CAP=1:Capture Mode 捕捉方式,TACCTLx.4,TACCTLx.8,捕捉信号,比较信号,EQUx,定时器溢出中断产生与控制电路,#include;-ORG 01100h;Program Start;-RESETmov#0A00h,SP;Initialize stackpointermov#CCIE,TAIV interrupt Vector DW TAIV_ISR END,TAIV 中断子程结构,TAIV_ISR;ADD TAIV=2:TACCR1RETI,第3节 Timer_A 应用编程举例,例1:定时应用举例要求每隔10ms左右进行一次系统自检。采用TACCR0 CCIFG中断自检子程为:self_check,00:/101:/210:/411:/8,00:stop mode01:up mode10:continuous mode11:up/down mode,1:TA interrupt enabled,1:interrupt pending,1:reset TAR,clock divider and count direction for up/down mode.The TACLR bit is automatically reset and is always read as zero.,编程定时器 A 控制寄存器 TACTLMOV#TASSEL_2+MC_1,&TACTL时钟输入:SMCLK,不分频计数方式:up mode,禁止TAIFG中断,00:TACLK01:ACLK10:SMCLK11:INCLK,period=(TACCR0+1)T,Up Mode锯齿波方式,T,在Timer Clock的上升沿处TAR=TAR+1,当TARTACCR0时,自动清零TAR,编程 TACCTL0比较方式:CAP=0,default value置位 CCIE,允许 TACCR0 CCIFG 中断MOV#CCIE,CCIE=1,其它=0,capture mode,capture input,0:异步捕捉方式1:同步捕捉方式,0:比较方式1:捕捉方式,输出方式,8种,1:中断允许,中断标志,SMCLK=default DCO 800kHz10ms=TACCR0/800kHzTACCR0=8000,定时时钟选用SMCLK,不分频,编程 TACCR0=8000MOV#8000,&TACCR0,#include;-ORG 01100h;Program Start;-RESETmov#0A00h,SP;Initialize stackpointermov#WDTPW+WDTHOLD,-callself_check reti,;-;Interrupt Vectors;-ORG 0FFFEh;MSP430 RESET Vector DW RESET;ORG 0FFECh;Timer_A0 Vector DW TA0_ISR;END,改变 TACCR1,可改变输出正脉冲的宽度,但周期不变,从而改变了占空比,实现了 PWM 输出,OUT1,例2:实现PWM信号输出要求周期=10ms,占空比根据输入可调。占空比通过调用子程duty获取。,编程定时器 A 控制寄存器 TACTLMOV#TASSEL_2+MC_1,&TACTL时钟输入:SMCLK,不分频计数方式:up mode,禁止TAIFG中断,编程 TACCR0=8000MOV#8000,&TACCR0,编程 TACCTL0比较方式:CAP=0,default value置位 CCIE,允许 TACCR0 CCIFG 中断MOV#CCIE,CCIE=1,其它=0,上述编程同例1,编程 TACCTL1OUTMODx=010,toggle/reset modeMOV#OUTMOD_2,&TACCTL1,capture mode,capture input,0:异步捕捉方式1:同步捕捉方式,0:比较方式1:捕捉方式,输出方式,8种,1:中断允许,中断标志,编程 TACCR1CALL duty;返回:R9=负脉冲宽度MOV R9,&TACCR1,TACCR0,TACCR1,OUT1 输出引脚编程,与 Timer_A 有关的 MSP430 x14x 引脚,BIS.B#BIT2,P1.2 outputs,#include;-ORG 01100h;Program Start;-RESETmov#0A00h,SP;Initialize stackpointermov#WDTPW+WDTHOLD,interrupts enabled jmp main,;-TA0_ISR;-CALL duty;返回:R9=负脉冲宽度MOV R9,END,例3:实现V/F转换并输出要求:输出信号周期 T=V(单位:Timer clock 周期)占空比=50%。V 通过调用子程voltage获取。,OUT1,TACCR1=TACCR0/2,TACCR0=V,#include;-ORG 01100h;Program Start;-RESETmov#0A00h,SP;Initialize stackpointermov#WDTPW+WDTHOLD,interrupts enabled jmp main,除TACCR0和TACCR1外,其它的编程与例2相同,;-TA0_ISR;-CALL voltage;返回:R9=VMOV R9,END,例4:捕捉方式应用举例心率测量1/T电机转速测量1/T脉宽测量w频率测量1/T周期测量T,T,w,t1,t2,t3,T:捕捉相邻两个上升沿的时刻,T=t2-t1w:捕捉相邻的上升沿与下降沿的时刻,w=t3-t2,当捕捉电路捕捉到一个有效的输入信号后:将 TAR 的值锁存至 TACCRx 中;置位中断标志位 TACCRx CCIFG,MOV#CAP+SCS+CM_1+CCIE,&TACCTL0,同步捕捉方式设置(CAP=1,SCS=1),CMx=01:capture on rising edgeCCISx=00:捕捉信号从 CCI0A(P1.1)输入CCIE=1:允许 TACCR0 CCIFG 中断,BIS.B#BIT1,P1.1 input,引脚编程:,00:/101:/210:/411:/8,00:stop mode01:up mode10:continuous mode11:up/down mode,0:TAIFG interrupt disabled,编程定时器 A 控制寄存器 TACTLMOV#TASSEL_2+MC_2,&TACTL时钟输入:SMCLK,不分频计数方式:continuous mode禁止TAIFG中断,00:TACLK01:ACLK10:SMCLK11:INCLK,#include;-ORG 01100h;Program Start;-RESETmov#0A00h,SP;Initialize stackpointermov#WDTPW+WDTHOLD,interrupts enabled jmp main,;-TA0_ISR;-MOV R9,R8;t1=R8MOV END,思考:第一次心率显示是否正确?若错误,则应如何修改?,