MSP430F249的定时器计数器行业二类_第1页
MSP430F249的定时器计数器行业二类_第2页
MSP430F249的定时器计数器行业二类_第3页
MSP430F249的定时器计数器行业二类_第4页
MSP430F249的定时器计数器行业二类_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章msp430单片机的定时器/计数器在学习msp430f249的定时器之前,我们先回顾一下msp430f249的时钟系统。msp430f249的基础时钟模块具有3个振荡器,这3个振荡器分别是lfxt1低频振荡器(32768hz)、xt2高频振荡器(400k16mhz)和dco内部数字控制振荡器(约1.1mhz)。这3个振荡器都可以通过软件设定进行1/2/4/8分频,产生单片机工作需要的3个时钟信号:主时钟mclk、子系统时钟smclk和辅助时钟aclk。mclk可以通过编程选择3个振荡器(lfxt1、xt2、dco)之一,或它们1/2/4/8分频后作为其信号源;smclk可以选择2个振荡器

2、(xt2、dco),或它们1/2/4/8分频后作为其信号源;aclk只能由lfxt1时钟信号或1/2/4/8分频后作为其信号源。在 msp430f249单片机的大部分内部设备中,都能选择上述3种时钟信号mclk、smclk和aclk作为时钟源并对上述时钟信号再进行1/2/4/8分频,应用极其灵活。低频振荡器主要用来降低能量消耗(如使用电池供电的系统),高频振荡器用来对事件做出快速反应或者供cpu进行大量运算。我们可以根据需要选择合适的振荡器,也可以在不需要时关闭一些振荡器,节省功耗。5.1 看门狗定时器看门狗定时器wdt实际上是一个特殊的定时器,其主要功能是当单片机软件出现故障(例如外部干扰引

3、起单片机程序跑飞或陷入死循环)时,能使系统重新启动。看门狗定时器的工作原理就是发生故障的时间满足规定的定时时间后,产生一个非屏蔽中断,使系统复位。当不使用看门狗功能时,看门狗定时器可以作为内部定时器使用。 1)看门狗模式 单片机系统上电后,wdt模块默认作为看门狗模式,默认使用内部时钟源dcoclk,经过32768个时钟周期后(若dcoclk为1mhz,则看门狗时间间隔约为32ms左右)系统复位。因此,用户使用时,一般在程序中先停止看门狗功能,然后根据要求配置好,再作为看门狗模式或者定时器模式使用。作为看门狗模式使用时,通过编写程序使wdt的定时时间略大于程序循环执行一次的时间,并且程序执行过

4、程中有对看门狗计数器清零的指令,使计数器重新计数,因此程序正常运行时,就会在wdt定时时间到之前对wdt清零(俗称定时喂狗),不会产生wdt溢出。如果由于干扰等原因使得程序跑飞,就不会在wdt定时时间到之前执行wdt清零指令,则wdt就会产生溢出,从而产生系统复位,cpu重新从头开始执行用户程序,这样程序就可以回到正常运行状态。为了说明看门狗模式的工作原理,我们来分析下列程序片段:void main(void)wdtctl=wdtpw+wdthold;/停止看门狗初始化部分while(1)wdtctl=wdt_arst_250;/看门狗模式,定时250ms程序主体程序说明:在while循环中,

5、设置看门狗时间间隔为250ms(时钟源为aclk),同时计数器清零,然后执行程序主体,如此反复执行。如果程序主体执行时间加上所有中断程序执行时间之和小于设定的看门狗时间间隔250ms,那么程序总是正常进行的;如果系统受到干扰,程序跑飞或陷入死循环,这时在250ms时间内执行不到wdtctl=wdt_arst_250指令,从而看门狗计数器没有被清零,看门狗计数器溢出wdtifg标志置位,产生puc复位信号,系统重新启动,这样系统就脱离了死循环状态。wdtctl为看门狗控制寄存器,参见3)看门狗定时器相关寄存器和msp430f249.h头文件。msp430f249.h头文件在msp430集成开发环

6、境iar软件安装目录下:d:program filesiar systemsembedded workbench 6.0 evaluation430inc/* the bit names have been prefixed with "wdt" */#define wdtis0 (0x0001u)#define wdtis1 (0x0002u)#define wdtssel (0x0004u)#define wdtcntcl (0x0008u)#define wdttmsel (0x0010u)#define wdtnmi (0x0020u)#define wdtnmie

7、s (0x0040u)#define wdthold (0x0080u)#define wdtpw (0x5a00u)/* watchdog mode -> reset after expired time */看门狗模式/* wdt is clocked by fsmclk (assumed 1mhz) */#define wdt_mrst_32 (wdtpw+wdtcntcl) /* 32ms interval (default) */#define wdt_mrst_8 (wdtpw+wdtcntcl+wdtis0) /* 8ms */#define wdt_mrst_0_5 (w

8、dtpw+wdtcntcl+wdtis1) /* 0.5ms */#define wdt_mrst_0_064 (wdtpw+wdtcntcl+wdtis1+wdtis0) /* 0.064ms */* wdt is clocked by faclk (assumed 32khz) */#define wdt_arst_1000 (wdtpw+wdtcntcl+wdtssel) /* 1000ms */#define wdt_arst_250 (wdtpw+wdtcntcl+wdtssel+wdtis0) /* 250ms */#define wdt_arst_16 (wdtpw+wdtcnt

9、cl+wdtssel+wdtis1) /* 16ms */#define wdt_arst_1_9 (wdtpw+wdtcntcl+wdtssel+wdtis1+wdtis0) /* 1.9ms */2)定时器模式将wdtctl寄存器的wdttmsel置位时,wdt则处于定时器模式。当设定的时间间隔一到,中断标志寄存器ifg1中的wdtifg就会置位,系统复位puc信号不会产生。如果中断允许寄存器ie1中的wdtie位和状态寄存器sr中的gie位都置位,则wdtifg向cpu请求中断,进入中断服务程序后wdtifg自动复位。如果未使用中断服务,wdtifg也可以用软件复位。内部定时器模式与看门

10、狗模式的中断矢量地址是不同的。改变定时器时间间隔时,应该用一条指令同时将wdtcntcl置位,从而避免发生不期望的puc复位。3)看门狗定时器相关寄存器控制寄存器wdtctdtpwwdtholdwdtnmieswdtnmiwdttmselwdtcntclwdtsselwdtisxpuc复位后wdtctl=0x6900wdtpw 看门狗定时器访问安全口令,读取时总为0x69,写入时必须为0x5a,否则产生一个puc信号。wdthold 看门狗暂停位,0 看门狗定时器正常工作;1 看门狗定时器停止wdtnmies nmi边沿选择,0上升沿触发nmi中断;1下降沿触发nmi

11、中断wdtnmie 复位引脚和nmi选择,0 rst/nmi引脚为复位端;1 rst/nmi引脚为边沿触发的非屏蔽中断输入。wdttmsel 看门狗定时器模式选择,0看门狗模式;1 定时器模式wdtcntcl 计数器清零控制位,0 无作用;1 计数器清零,即wdtcnt=0wdtssel 时钟源选择位,0 smclk; 1 aclkwdtisx 时间间隔选择位,x=0、1wdtis1、wdtis 0频率时钟源为1mhz时,看门狗的时间间隔时钟源为32768hz时,看门狗的时间间隔00时钟源/3276832ms1000ms01时钟源/81928ms250ms10时钟源/5120.5ms16ms1

12、1时钟源/640.064ms1.9ms中断允许寄存器ie1(与看门狗有关的部分)76543210nmiiewdtienmiie nmi中断允许位,0中断禁止;1 中断允许wdtie 看门狗定时器中断允许位,0中断禁止;1 中断允许,用于定时器模式,看门狗模式不需要中断允许。中断标志寄存器 ifg1(与看门狗有关的部分)76543210nmiifgwdtifgnmiifg nmi中断标志,0没有中断;1中断标志建立wdtifg 看门狗定时器中断标志,0没有中断;1中断标志建立实例5-1 看门狗定时器的应用 任务要求:利用看门狗定时器产生设定的时间间隔中断,在中断服务程序中切换led灯亮1s灭1s

13、。分析说明:看门狗定时器的时钟源只有smclk和aclk两种,4种分频值,只能实现几种简单的定时间隔中断。1) 硬件电路设计p1.0引脚接led发光二极管,同时用虚拟示波器观察p1.0引脚电平变化。低频晶振lfxt1采用32768hz的晶振,获得稳定的aclk时钟源。硬件电路图如图5.1所示,xt2接8mhz晶振(xt2频率范围为400k16mhz),两个22pf匹配电容,供mclk、smclk选用。一般发光二极管led管压降约1.82.2v,电流510ma,因此限流电阻r1取300欧。图5.1 实例5-1电路图2)程序设计看门狗定时器时钟源选用aclk(32768hz),分频系数为32768

14、,得到1s定时时间间隔。p1.0引脚设置为输出方式,进入lpm3低功耗模式。#include <msp430f249.h>void main(void) wdtctl = wdt_adly_1000; / 看门狗定时时间间隔为1s ie1 |= wdtie; / 允许wdt中断 p1dir |= 0x01; / p1.0输出 _bis_sr(lpm3_bits + gie); / 进入lpm3低功耗模式,总中断允许#pragma vector=wdt_vector_interrupt void watchdog_timer(void) /看门狗中断服务程序 p1out = 0x01

15、; / p1.0 取反3)仿真与结果分析双击msp430f249单片机,装载可执行文件debugexewdt.hex,设置仿真参数mclk=(default),aclk=32768hz。运行后可以观察到led灯亮1s灭1s;同时在示波器上观察到高电平1s、低电平1s的周期信号,如图5.2所示。图5.2 实例5-1仿真结果图5.2 定时器amsp430f249单片机的定时器a是具有3个捕获/比较寄存器的16位定时器/计数器。定时器a可以用来实现计数、延时、信号频率测量、信号触发检测、脉冲脉宽信号测量。定时器a还可以实现下列功能: (1)pwm信号输出功能:通过设置ta的工作模式,结合ccr0、c

16、cr1或ccr2计数,直接从ccr0、ccr1或ccr2中子模块的out.x端输出。 (2)slope ad转换功能:利用定时器a与比较器a结合设计成斜边数模转换器。 (3)实现软usart功能:利用ccr0子模块中的捕获输入功能,结合tar实现通用串行异步通讯功能(usart)。 (4)adc12模块的采样信号:利用定时器的tar或ccr0实现out.x输出得到adc12模块所需要的采样触发信号。定时器a的基本结构如图5.3所示。在详细讲述定时器a的工作原理之前,我们先了解一下与定时器a有关的9个寄存器。定时器 a 主要资源有1个16位的定时计数器、1个控制寄存器、1个中断向量寄存器、3个可

17、配置的捕获/比较控制寄存器和3个捕获/比较寄存器。以上定时器资源可作多种组合使用,以实现强大的功能。 图5.3 定时器a的基本结构1. 定时器a寄存器表5-1 定时器a的相关寄存器序号地址简写寄存器名称1160htactl 定时器a控制寄存器2162htacctl0捕获/比较控制寄存器 03164htacctl1捕获/比较控制寄存器 1 4166htacctl2捕获/比较控制寄存器 25170htar定时器a计数器6172htaccr0 捕获/比较寄存器 0 7174htaccr1捕获/比较寄存器 1 8176htaccr2捕获/比较寄存器 2912ehtaiv中断向量寄存器定时器a

18、控制寄存器tactl15109876543210未用tasselxidxmcx未用taclrtaietaifgtasselx 定时器时钟源选择(x=0、1)tassel1tassel0时钟源说明宏定义0 0taclk外部引脚输入时钟tassel_00 1aclk辅助时钟tassel_11 0smclk子系统时钟tassel_21 1inclktaclk的反相信号tassel_3idx 分频系数 (x=0、1)id1、id0分频系数宏定义0 0直通id_00 12分频id_11 04分频id_21 18分频id_3mcx 定时器模式选择(x=0、1)mc1、mc0模式选择说明宏定义0 0停止mc

19、_00 1增计数模式计数值上限为taccr0mc_11 0连续计数模式计数值上限为ffffhmc_21 1增减计数模式计数值上限为taccr0mc_3taclr 定时器a清除位,该位置位将计数器tar清零、分频系数清零、计数模式置为增计数模式。taclr 由硬件自动复位,其读出始终为 0。定时器在下一个有效输入沿开始工作。taie 定时器a中断允许位,0中断禁止;1中断允许taifg 定时器a中断标志位,0没有中断;1中断标志建立。增计数模式:当定时器由 ccr0 计数到到 0 时,taifg 置位。连续计数模式:当定时器由 0ffffh计数到 0 时,taifg 置位。增/减计数模式:当定时

20、器由 ccr0 减计数到 0 时,taifg 置位。定时器a的16位计数器 tar150tarx这是计数器的主体,内部可读写。如果要写入tar计数值或用 taclk 控制寄存器中的控制位来改变定时器工作(特别是修改输入选择位、输入分频器和定时器清除位时),修改时应先停止定时器,否则输入时钟和软件所用的系统时钟异步可能引起时间竞争,使定时器响应出错。定时器a有3个捕获/比较模块,每个模块都有自己的控制寄存器 tacctl02捕获/比较控制寄存器tacctlx(x=0、1、2)1514131211109876543210cmxccisxscssccicapoutmodxccieccioutcovc

21、cifgcmx 捕获模式(x=0、1)cm1、cm0捕获模式宏定义00禁止捕获cm_001上升沿捕获cm_110下降沿捕获cm_211上升沿与下降沿都捕获cm_3ccis 捕获/比较输入信号选择ccis1、ccis0输入信号选择宏定义00ccixa(x=0、1、2)ccis_001ccixb(x=0、1、2)ccis_110gndccis_211vccccis_3scs 同步捕获源选择,0异步捕获;1同步捕获。异步捕获模式允许在请求时立即将 ccifg 置位和捕获定时器值,适用于捕获信号的周期远大于定时器时钟周期的情况。但是,如果定时器时钟和捕获信号发生时间竞争,则捕获寄存器的值可能出错。在实

22、际中经常使用同步捕获模式,捕获事件发生时,ccifg 置位和捕获定时器值将与定时器时钟信号同步。scci同步捕获/比较输入位,仅用于比较模式。比较相等信号 equx 将选择中的捕获、比较输入信号ccix(ccixa,ccixb,vcc 和 gnd)进行锁存,这样当计数器的值继续变化时,锁存器中的值仍然保持不变,然后可以通过 scci位读出。cap 模式选择位,0 比较模式;1 捕获模式。outmodx 输出模式(x=0、1、2)表5-2 输出模式outmod2outmod1outmod0模式名称说明宏定义000输出输出信号由tacctlx的out决定outmod_0001置位当计数值达到tac

23、crx寄存器中的值时,输出信号为高电平并保持,直到定时器复位outmod_1010翻转/复位当计数值达到taccrx寄存器中的值时,输出信号翻转;当计数值达到taccr0寄存器中的值时,输出信号复位。outmod_2011置位/复位当计数值达到taccrx寄存器中的值时,输出信号置位;当计数值达到taccr0寄存器中的值时,输出信号复位。outmod_3100翻转当计数值达到taccrx寄存器中的值时,输出信号翻转。outmod_4101复位当计数值达到taccrx寄存器中的值时,输出信号复位。outmod_5110翻转/置位当计数值达到taccrx寄存器中的值时,输出信号翻转;当计数值达到t

24、accr0寄存器中的值时,输出信号置位。outmod_6111复位/置位当计数值达到taccrx寄存器中的值时,输出信号复位;当计数值达到taccr0寄存器中的值时,输出信号置位。outmod_7ccie 捕获/比较中断使能位,0中断禁止;1 中断允许cci 捕获/比较输入位,用来读取选择的输入信号。out 输出位,如果outmodx设为000时,那么由该位决定输出到outx的信号。0 输出低电平;1输出高电平。cov 捕获溢出标志。当 cap=1 时,选择捕获模式,如果捕获寄存器的值被读出前再次发生捕获事件,则cov置位。读捕获寄存器时不会使溢出标志复位,须用软件复位。ccifg 捕获/比较

25、中断标志位。捕获模式:寄存器 ccr0 捕获了定时器 tar 值时置位。比较模式:定时器 tar 值等于寄存器 ccr0 值时置位。定时器a中断矢量寄存器 taiv1543100taivx0中断矢量值确定申请taiv中断的中断源,具体含义见表5-5taivxtaiv的值中断源中断标志中断优先级0000没有中断高低0012捕获/比较器1taccr1_ccifg0104捕获/比较器2taccr2_ccifg0116保留1008保留10110定时器溢出taifg11012保留11114保留2. 定时器工作原理定时器的4种工作模式:(1)停止模式:定时器停止工作。(2)增计数模式:如果定时器原来处于停

26、止模式,设置增计数模式会同时启动计数器tar开始计数。当计数值达到taccr0寄存器的值时,中断标志taccr0_ccifg置位。当下一个计数时钟到来时,计数器tar的值变为0,重新开始新一轮计数。因此定时器的计数周期由taccr0的值决定。由于必须用taccr0寄存器存放计数的最大值,所以增计数模式比连续模式多占用了taccr0寄存器。在增计数期间还可以设置 ccr12 来产生中断标记,产生pwm等信号。(3)连续计数模式:连续计数模式与增计数模式的区别是连续模式不占用taccr0寄存器。当ccrx(x=0、1、2)寄存器的值与tar的值相等时,若此时ccrx是处于中断允许的话,则产生相应的

27、中断标志ccifgx。而tar的中断标志taifg位则在tar计数值从ffffh转为0时产生中断标志taifg。定时器a连续模式计数启动后,tar的值开始从0-ffffh-0-ffffh.不断计重复计数,直至软件控制其停止计数为止。(4)增减计数模式:增减计数模式也要用到taccr0寄存器,定时器启动后,计数值先从0增加到taccr0寄存器中的值,然后计数器又开始减少,减少到0后,计数器又递增,如此周而复始。在增减计数模式一个周期中,中断标志位taifg和taccr0_ccifg个置位一次。当计数值达到最大值taccr0的值时,中断标志taccr0_ccifg置位;当计数值递减到0时,中断标志

28、taifg置位。增减模式在定时器周期不是 0ffffh 且需要产生对称的脉冲时使用。例如,两个输出驱动一个 h 桥时不能同时为高,增减模式支持在输出信号之间有死区时间的应用。定时器工作原理说明:(1)比较模式:这是定时器的默认模式。如果事先设置好定时器比较值taccrx(x=0、1、2),并开启定时器中断,当tar的值增到taccrx的时候,中断标志位ccifgx(x=0、1、2)置1,进入相应的中断服务程序。比较模式常用于产生pwm信号或设置给定时间间隔中断。(2)捕获模式:当tacctlx(x=0、1、2)控制寄存器中的cap置位时,则相应的taccrx处于捕获模式。捕获源可以由ccisx

29、选择ccixa,ccixb,gnd,vcc,可以利用外部信号的上升沿、下降沿或上升下降沿触发,完成捕获后相应的捕获标志位ccifgx置1。当捕获事件发生时,硬件自动将计数器的值拷贝到taccrx寄存器中,同时中断标志ccifgx置位。捕获模式主要用于测量脉冲周期、频率、速度等。(3)输出模式:输出模式由 outmodx 位来确定,如表 5-2所示。模式0用于电平输出,由out位来控制tax(x=0、1、2)管脚的高低电平输出;模式1和模式5为单脉冲输出,可以用来代替单稳态电路产生单脉冲波形;模式3和模式7用来产生脉宽调制信号(pwm信号);模式4为可变频率或移相输出;模式2和模式6为带死区的p

30、wm模式,广泛用于逆变器、开关电源、变频调速和斩波器等高效率的功率变换应用场合。图5.4 定时器a处于增计数模式定时器工作模式说明:(1)定时器a工作在增计数模式下,taccr0作为周期寄存器,tacc1作为比较寄存器,不同的输出模式产生的输出波形如图5.4所示。图5.5定时器a处于连续模式(2)定时器a工作在连续模式下,taccr0、taccr1作为比较寄存器,不同的输出模式产生的输出波形如图5.5所示。图5.6定时器a处于增减计数模式(3)定时器a工作在增/减计数模式下,taccr0作为周期寄存器,tacc1和tacc2作为比较寄存器,不同的输出模式产生的输出波形如图5.6所示。定时器 a

31、 的中断说明:定时器 a 有2个中断向量,一个单独分配给捕获比较寄存器 ccr0,另一个作为共用的中断向量用于定时器溢出和其他的捕获比较寄存器(ccr1和ccr2)。ccr0 中断向量具有最高的优先级,ccr0用于定义增计数和增减计数模式的周期。ccr0的中断标志taccr0_ccifg 在执行中断服务程序时能自动复位。ccr1、ccr2 和定时器溢出共用另一个中断向量,属于多源中断,对应的中断标志为taccr1_ccifg、taccr2_ccifg和 taifg1,在读中断向量字 taiv 后,自动复位。如果不访问 taiv 寄存器,则不能自动复位,须用软件清除;如果相应的中断允许位为零(不

32、允许中断),则将不会产生中断请求,但中断标志仍存在,这时须用软件清除。实例5.2 定时器a定时1秒任务要求:利用定时器a产生设定的时间间隔中断,在中断服务程序中切换led灯的亮灭,亮1s灭1s。分析说明:定时器a的时钟源可以选择为smclk、aclk和外部引脚输入(taclk、inclk),一般选择为smclk和aclk。aclk为低频晶振32768hz及1/2/4/8分频,定时器a可以再对aclk进行1/2/4/8分频,定时器a的时基最小为1/32768秒(约30us),最大为64分频后即1.95ms,因此定时器a的定时范围为2s(对应时基30us)和128s(对应时基1.95ms)。smc

33、lk可选择xt2和内部dco作为时钟源,若smclk选择xt2(例如8mhz),则定时器a的时基最小为0.125us,最大为64分频后即8us,因此定时器a的定时范围为8.19ms(对应时基0.125us)和524ms(对应时基8ms)。总而言之,要求定时器时间间隔小于几百毫秒时,定时器a的时钟源采用smclk,smclk一般选取xt2作为时钟源;定时时间间隔几百毫秒至几十秒应采用aclk(或者适当分频)作为定时器a的时钟源。1)硬件电路设计p1.0引脚接led发光二极管,同时用虚拟示波器观察p1.0引脚电平变化。低频晶振采用32768hz的晶振,获得稳定的aclk时钟源。硬件电路图如图5-7

34、所示,xt2接8mhz晶振(xt2频率范围为400k16mhz),两个22pf匹配电容,供mclk、smclk选用。一般led发光二极管管压降1.82.2v,电流510ma,因此限流电阻取300欧。图5.7 实例5.2电路图2)程序设计msp430f249单片机的程序运行主时钟mclk= dco=1.1mhz。定时器a采用增计数模式,定时器a的时钟源为aclk=32768hz。时基单位为1/32768秒,设置ccr0 = 32768,则定时时间间隔1s。#include <msp430f249.h>void main(void) wdtctl = wdtpw + wdthold;/

35、 停止看门狗 p1dir |= 0x01; / p1.0输出 cctl0 = ccie; / ccr0中断允许 ccr0 = 32768; /定时时间间隔1s tactl = tassel_1 + mc_1; / 定时器a时钟源为aclk,增计数模式 _bis_sr(lpm0_bits + gie); / lpm0模式,总中断允许#pragma vector=timera0_vector_interrupt void timer_a (void) /定时器a0中断服务程序 p1out = 0x01; / p1.0取反3)仿真与结果分析程序虽然很短,但是它包含了定时器的基本使用方法。使用定时器前

36、,先设置好控制寄存器tactl,时钟源选择、计数模式选择、中断允许和定时时间间隔ccr0的值。增计数模式,定时器a的计数值达到ccr0,taccr0_ccifg中断标志建立,ccr0中断为单源中断,cpu响应中断,进入定时器a0中断服务程序后自动清除中断标志taccr0_ccifg。在中断服务程序中,对p1.0取反,得到周期2s的信号,其中高电平1s,低电平1s,如图5.8所示。仿真时设置参数mclk=(default),aclk=32768hz。图5.8 实例5.2仿真结果图实例5.3 定时器a产生4路周期信号任务要求:利用定时器a产生4路周期信号,周期分别为4s、2s、1s和0.25s,四

37、路周期信号分别从p1.0和 p1.1p1.4的a0a3输出。分析说明:定时器a有3个捕获比较寄存器ccr0、ccr1和ccr2。若设置定时器a工作在连续模式,利用3个比较器可以获得3路不同的周期信号,再利用定时器溢出中断可以再输出1路周期信号。因此,定时器a可以很方便的产生4路时间间隔不同的周期信号。1)硬件电路设计硬件电路如图5.9所示,用虚拟示波器观察p1.0p1.3四路引脚电平变化。图5.9 实例5.3电路图2)程序设计msp430f249单片机的程序运行主时钟mclk= dco=1.1mhz。定时器a采用连续模式,定时器a的时钟源为aclk=32768hz。时基单位为1/32768秒,

38、设置ccr0 = 32768,则定时时间间隔1s(周期2s);ccr1 = 32768/2,则定时时间间隔0.5s(周期1s);ccr2 = 32768/8,则定时时间间隔0.125s(周期0.25s);定时器a溢出中断,定时时间间隔2s(周期4s)。#include <msp430f249.h>void main(void) wdtctl = wdtpw + wdthold; /停止看门狗 p1sel |= 0x0e; / p1.1p1.4功能选择 p1dir |= 0x0f; / p1.0p1.4输出 cctl0 = outmod_4 + ccie; / ccr0翻转, 中断允

39、许 cctl1 = outmod_4 + ccie; / ccr1翻转, 中断允许 cctl2 = outmod_4 + ccie; / ccr2翻转, 中断允许 tactl = tassel_1 + mc_2 + taie; /定时器a时钟源为aclk,连续模式, 中断允许 _bis_sr(lpm0_bits + gie); / lpm0模式,总中断允许#pragma vector=timera0_vector_interrupt void timer_a0 (void) /定时器a0中断服务程序 ccr0 += 32768; /周期2s#pragma vector=timera1_vect

40、or_interrupt void timer_a1(void)/定时器a1中断服务程序 switch( taiv ) / taiv中断矢量 case 2: ccr1 += 32768/2; /周期1s break; case 4: ccr2 += 32768/8; /周期0.25s break; case 10: p1out = 0x01; /溢出中断,周期4s break; 3)仿真与结果分析仿真结果见图5.10所示,第1路信号周期为4s,定时器a溢出时间间隔为2s,在中断程序中对p1.0取反;第2路信号周期为2s,比较寄存器ccr0设置值为32768,1秒钟对ta0(p1.1)取反一次;

41、第3路信号周期为1s,比较寄存器ccr1设置值为32768/2,0.5秒钟对ta1(p1.2)取反一次;第4路信号周期为0.25s,比较寄存器ccr2设置值为32768/8,0.125秒钟对ta2(p1.3)取反一次。图5.10 实例5.3仿真结果图实例5.4 定时器a产生两路pwm信号 任务要求:利用定时器a产生占空比75%和15%的两路pwm信号,周期均为20ms。分析说明:定时器a有多种信号输出模式,其中输出模式3和模式7用来产生脉宽调制信号(pwm信号),在定时器a的增计数模式,用ccr0控制pwm信号的周期,ccr1、ccr2控制占空比,可以得到两路不同占空比的pwm信号。1)硬件电

42、路设计硬件电路如图5.11所示。图5.11 实例5.4电路图2)程序设计msp430f249单片机的程序运行主时钟mclk= dco=1.1mhz。smclk = xt2=8mhz,定时器a时钟源为smclk的8分频(即1mhz),增计数模式。时基单位1us,ccr0 = 20000,则定时时间间隔20ms(即pwm 周期=20ms)。两路pwm信号从p1.2(ta1)和p1.3(ta2)输出,设置ccr1=20000*75%=15000,则ta1的pwm信号占空比为75%,设置ccr2=20000*15%=3000,则ta2的pwm信号占空比为15%。#include <msp430f

43、249.h>void main(void) wdtctl = wdtpw + wdthold; /停止看门狗 bcsctl2 |= sels; / smclk = xt2 bcsctl2=divs0+divs1; /smclk 8分频 p1dir |= 0x0c; / p1.2 和 p1.3输出 p1sel |= 0x0c; / p1.2(ta1)和p1.3(ta2) 输出 ccr0 = 20000; / pwm 周期 cctl1 = outmod_7; / ccr1复位/置位 ccr1 = 15000; / ccr1 pwm 占空比75% cctl2 = outmod_7; / ccr

44、2复位/置位 ccr2 = 3000; / ccr2 pwm 占空比15% tactl = tassel_2 + mc_1; / 定时器a时钟源为smclk,增计数模式 _bis_sr(lpm0_bits); /进入低功耗lpm03)仿真与结果分析仿真结果如图5.12所示,第3路信号为ta1输出的pwm信号,周期为20ms,占空比75%;第4路信号为ta2输出的pwm信号,周期为20ms,占空比15%;图5.12 实例5.4仿真结果图实例5.5 定时器a精确测量输入信号的周期 任务要求:利用定时器a精确测量某输入信号的周期,周期范围0999999us。分析说明:利用定时器a的脉冲捕获功能可以精

45、确地测量外部输入信号的脉宽和周期。捕获模式测量输入信号的周期时,一般设置定时器a为连续模式,如果选定的引脚上出现设定的跳变沿(上升沿或者下降沿),那么定时器a的计数值被复制到taccrx中,并且中断标志taccifgx置位。在捕获中断程序中读取捕获值,相邻两次捕获值之差就是信号周期。由于事件(上升沿或者下降沿)发生的随机性,注意在需要时使能溢出中断,在溢出中断中记录溢出发生次数,周期=65536x溢出次数+两次捕获值之差。1)硬件电路设计低频晶振采用32768hz的晶振,xt2接8mhz晶振(xt2频率范围为400k16mhz),两个22pf匹配电容,供smclk选用。显示使用6位led共阳极

46、模块,单片机p4口输出每位数码管的段码,p5口的p5.0p5.5输出位码。输入信号源采用虚拟仪器中的信号发生器。硬件电路图如图5.13所示。图5.13 实例5.5的硬件电路图2)程序设计msp430f249单片机的程序运行主时钟mclk= dco=1.1mhz。smclk = xt2=8mhz,定时器a时钟源为smclk的8分频(即1mhz),连续计数模式。定时器a使用捕获模式测量信号周期时,可以让主计数器tar工作在连续计数模式。捕获模块设置tax(x=02)管脚上升沿触发,每次捕获事件发生后,在捕获中断程序中读取捕获值,相邻两次捕获值之差就是信号周期。对于计数值溢出的情况,可以在溢出中断程

47、序中记录溢出次数,扩展周期信号的测量范围。#include <msp430f249.h>#define num 16 /测量次数unsigned int new_cap=0;unsigned int old_cap=0;char n1; /溢出次数 long diffnum; / 周期测量值char index=0; long data; /计算测量周期的平均值char led = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff;/共阳极数码管char pos

48、ition=0x20,0x10,0x08,0x04,0x02,0x01;/位码char led_buf = 0,0,0,0,0,0; /显示缓冲区void data_to_buf(long data1) / 值送显示缓冲区函数 char i; for (i=0;i<6;i+) led_bufi = data1%10; /低位在前 data1=data1/10; void disp(void) / 动态扫描显示函数 char i; unsigned int k; for(i=0;i<6;i+) p4out = ledled_bufi; p5out = positioni; /if(i

49、=3) /p4out &=0x7f; /小数点 for ( k=0; k<600; k+); / 延时 p5out = 0x00; /关显示 void main(void) char k1; wdtctl = wdtpw + wdthold; / 停止看门狗 bcsctl2 |= sels; / smclk = xt2 bcsctl2=divs0+divs1; /smclk 8分频 p4dir=0xff; /设置p4口为输出 p5dir=0xff; /设置p5口为输出 p1sel = 0x02; /设置 p1.1(ta0)为输入信号管脚cctl0 = cm_1 + scs + c

50、cis_0 + cap + ccie; / 上升沿捕获+ cci0a (p1.1)输入+捕获模式+中断允许 tactl = tassel_2 + mc_2+ taie; /ta时钟源为smclk+连续模式+中断允许 _eint(); /总中断允许while(1) if(index=0) /多次测量周期值后,取平均值并更新数据 data=0; for(k1=0;k1<num;k1+) data+=diffk1; data=data/num; data_to_buf(data); /数据送显示缓冲区 disp(); / 动态扫描显示程序 #pragma vector=timera0_vector_interrupt void timera0(void) /ta0捕获中断服务程序 new_cap = taccr0; diffindex = 65536*n1+new_cap-old_cap; /计算周期值 index+; if (index =num) index = 0; old_cap = new_cap;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论