MSP430F5529 (六)定时器Timer_A-2

发布者:快乐旅行最新更新时间:2015-08-20 来源: eefocus关键字:MSP430F5529  定时器  Timer_A-2 手机看文章 扫描二维码
随时随地手机看文章
6.4  捕获比较模块
这是在以上介绍的基础上正式讲TA的重要功能。
先看一个寄存器TACCTL0-TACCTL6:(TA中最复杂的寄存器,用到的时候查表啦)

点击看大图CMx:捕获模式设定    00 不捕获 
01 上升沿捕获 
10 下降沿捕获 
11上升和下降沿都捕获
 
 
 
       CCISx:捕获源的选择           00 CCIxA 
01 CCIxB 
10 GND 
11 VCC 
SCS:同步捕获源,设定是否与时钟同步
                                                 0 异步捕获 
1 同步捕获 
SCCI:选择的CCI输入信号由EQUx信号锁存,并可通过该位读取。
CAP: 0-比较模式     1-捕获模式
OUTMOD:输出模式控制位。(之后会在输出模块详细解释)     
CCIE:中断使能,该位允许相应的CCIFG标志中断请求 。
0-中断禁止      1 -中断允许 
CCI 3 :捕获比较输入,所选择的输入信号可以通过该位读取
OUT : 对于输出模式0,该位直接控制输出状态 。
0-输出低电平    1-输出高电平
COV:捕获溢出位。该位表示一个捕获溢出发出,COV必须由软件复位。 
0-没有捕获溢出发生   1-有捕获溢出发生
CCIFG:捕获比较中断标志位。
 0-没有中断挂起    1-有中断挂起
 
 
最后一个寄存器TAIV:(还记得外部中断寄存器吗,里面同样存储的只是一个中断代号)
              里面没有TACCR0的中断标志,因为TACCR0优先级最高,有一个专门的中断向量)

点击看大图这里面的标志位需要软件手动清零。一种情况例外:两个中断同时发生,先响应优先级高的中断,当该中断服务程序结束后,该位的中断标志会自动清零,然后去响应另外一个中断。
 
6.4.1比较模式
                     TA启动时默认为比较模式。
                     (CAP=0时选择比较模式)
 
比较模式简介:(也就是一般意义上的定时计时模式)
这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值(将终值写入TACCRx),开启定时器,当TAR的值增加到和某个TACCRx里面的值相等的的时候,相应的中断标志位CCIFGx置一,同时中断标志位TAIFG置位。若中断允许未开启则只将中断标志位CCIFGx置一。
(还记得51单片机的定时器吗)
 
注意:当Timer_A要用到TACCR0的值作为终值来计数(也就是增模式或者增减模式),很显然TACCR0的值一定要大于其TACCRx的值,否则那些比TACCR0大的计数值就没有存在的意义了。
下面是我画的一个图。比较形象的解释了工作原理。(期间TACCR的值不改变)
所谓的比较就是,如果计数器TAR中的值和某个TACCRx中的值相等了,那么相应的标志位就会置位。

点击看大图                            这只是一个原理,实际应用的时候,会很灵活,通过一个一个设定每次的TACCR值,可以得到想要的各种时间间隔。
                     总结:比较模式用于选择PWM输出信号或在特定的时间间隔中断。当TAR计数到TACCRx的值时: 
                                   ○相应的中断标志CCIFG置位;
 ○内部信号EQUx=1 
                               ○EQUx根据输出模式来影响输出信号 
 ○输入信号CCI锁存到SCCI 
 
 [page]
6.4.2  捕获模式
                     当CAP=1时,选择捕获模式。捕获模式用于记录时间事件,比如速度估计或时间测量。捕获输入CCIXA和CCLXB连接外部的引脚或内部的信号,这通过CCISX位来选择。CMX位选择捕获输入信号触发沿;上升沿、下降沿或两者都捕获。当输入信号的触发沿到来时,捕获事件发生: 
 ○定时器的TAR值复制到TACCRX寄存器中 
                     ○中断标志位CCIFG置位 
注意:①捕获信号可能会和定时器时钟不同步,并导致竞争条件的发生。将SCS位置位可以在下个定时器时钟使捕获同步
              ②如果第二次捕获发生时,第一次捕获的TAR值还没有及时被存到TACCRx,捕获比较寄存器就会产生一个溢出逻辑,COV位在此时置位, COV位必须软件清除。
 
6.5 输出模块
                            传统的定时器,都是通过标志位的判断来定时触发事件的。而430则具有输出模块,通过和定时结合起来,可以方便的产生PWM信号或者其它控制信号
                            每个捕获/比较器都有一个输出口,如P1.1-P1.5对应TA0.0-TA0.4这5个捕获比较器的输出。
 
                            输出模式: 输出模式由OUTMODx位来确定,如下表对于所有模式来说(模式0除外),OUTx信号随着定时器时钟的上升沿而改变。输出模式2,3,6和7对输出模式0无效,因为此模式下,EQUx=EQU0。
                                                                      (复位指的是置0)
 

OUTMODX 模式 说明
000 输出 输出信号OUTx由OUT位定义。当OUT位更
新时,OUTx信号立刻更新 
001 置位 当定时器计数到TACCRX值时,输出置位,并保
持置位直到定时器复位或选择了另一个输出模式
010 翻转/复位 当定时器计数到TACCRX值时,输出翻转。当定
时器计数到TACCR0值时,输出复位 
011 置位/复位 当定时器计数到TACCRX值时,输出置位。当定
时器计数到TACCR0值时,输出复位 
100 翻转 当定时器计数到TACCRX值时,输出翻转。输出
信号的周期将是定时器的2倍
101 复位 当定时器计数到TACCRX值时,输出复位,并保
持复位直到选择了另一个输出模式 
110 翻转/置位 当定时器计数到TACCRX值时,输出翻转。当定
时器计数到TACCR0值时,输出置位
111 复位/置位 当定时器计数到TACCRX值时,输出复位。当定
时器计数到TACCR0值时,输出置位

 
举一个例子:结合上表看下图
 
              注意:在模式转换的时候,一定要保持OUTMOD至少一位置位,除非转向0模式。所以最好的做法是:先把OUTMOD置为7,然后再清除掉不需要的位。
              做一个说明:比较模式下,当计数器TAR中的值和TACCRX中的设计值相等时,相应捕获/比较器的EQUx就会置位。那么EQU0、EQUx和OUTMOD是怎么来影响输出的呢?以模式2(翻转/复位)为例,该模式的定义是这样的:当定时器计数到TACCRX值时,输出翻转。当定时器计数到TACCR0值时,输出复位。于是,这句话就也可以翻译成在模式2的条件下,当EQUX=1时,输出翻转;当EQU0等于1的时候,输出复位。这两个信号这里相当于两个触发(使能)信号了。
 
总结
实验一:
/*利用Timer_A比较模式下的多路定时,让LED闪烁*/
#include
void main(void)
{
   WDTCTL=WDTPW+WDTHOLD;
   P1DIR|=(BIT1+BIT2+BIT3+BIT4+BIT5);//P1.1-P1.5为输出方向
   P1OUT=0x00;        //全部拉低,初始化LED全灭
   TA0CCTL1=CCIE;     //捕获比较器1开启CCIFG位中断
   TA0CCR1=13107;        //置入要比较的数值0xff/5=13107
   TA0CCTL2=CCIE;     //捕获比较器2开启中断
   TA0CCR2=26214;        //13107*2=26214
   TA0CCTL3=CCIE;     //捕获比较器3开启中断
 
   TA0CCR3=39321;        //13107*3=39321
   TA0CCTL4=CCIE;     //捕获比较器4开启中断
   TA0CCR4=52428;        //13107*4=52428
   TA0CTL|=TACLR+TAIE;      //开启中断并清零
   TA0CTL|=TASSEL_1+MC_2+TAIE;//选择SCLK32.768KHZ作为时钟,选用连续模式,并开启中断
   /*这样的话,5个灯闪一遍的时间为0xffff/32768=2S*/
   __enable_interrupt();    //开启总中断
   while(1);
}
/*TIMER0_A0_VECTOR是计时器0的CCR0的中断寄存器,TIMER0_A1_VECTOR是计时器0的CCR1-CCR4、TA的寄存器*/
/*同理定时器TA1也是分为两个TIMER1_A0_VECTOR和TIMER1_A1_VECTOR*/
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TimerA(void)
{
   switch(__even_in_range(TA0IV,14))
   /* 这句话的意思是:只有在TA0IV的值是在0--14内的偶数时才会执行switch函数内的语句
            其作用是提高switch语句的效率*/
   {
      case 2:P1OUT=BIT1;break; //TACCR1 CCIFG置位,表明计数值和设定的13107相等了,也就是说计了0.4S了
      case 4:P1OUT=BIT2;break; //TACCR2 CCIFG置位,表明计了0.8S了
      case 6:P1OUT=BIT3;break; //TACCR3 CCIFG置位,表明计了1.2S了
      case 8:P1OUT=BIT4;break; //TACCR4 CCIFG置位,表明计了1.6S了
      case 14:P1OUT=BIT5;break;   //TAIFG置位,表明计了2S了
      default:break;
   }
  
}[page]
 
实验二:比较模式-增减模式输出PWM波

点击看大图/*在比较和增减模式下产生PWM波(矩形波) */
/*提一个PWM波的用处:驱动直流电机。我们知道对于直流电机,驱动它的电流的频率并不影响转速 ,只有占空比会影响转速*/
/*开发板上P2.0是有外接排针的,所以用这一端口输出PWM*/
/*看CPU引脚发现,P2.0为TA1.1,也就是定时器A1的1号捕获比较器输出口*/
#include
void main(void)
{
   WDTCTL=WDTPW+WDTHOLD;
   P2SEL|=BIT0;   //声明有特殊功能,不做普通I/O使用
   P2DIR|=BIT0;   //输出
   P2DS |=BIT0; //全力驱动,否则可能无法驱动电机
   P2OUT&=~BIT0;   //初始化输出低电平
   /*把SMCL配置为XT2 4MHZ*/
   P5SEL=BIT2+BIT3;   //声明特殊功能,将用作外部时钟晶振XT2输入
   UCSCTL6&=~XT2OFF;  //开启XT2
   while(SFRIFG1 & OFIFG)
   {
      UCSCTL7 &=~(XT2OFFG+DCOFFG+XT1LFOFFG);//清除3种时钟错误标志
      SFRIFG1&=~(OFIFG);//清除时钟错误标志位
   }  //直到XT2从起振到振荡正常,没有错误发生
   UCSCTL4|=SELS_5;   //把SMCLK的时钟源选为XT2 4MHZ
   TA1CCTL0=CCIE;     //定时器A1的捕获比较器0开启CCIFG位中断
   TA1CCR0=200;       //置入计数终值,则PWM频率为10KHZ
   TA1CCTL1=CCIE;     //捕获比较器1开启中断
   TA1CCR1=50;        //占空比为75%
   TA1CTL|=TACLR;     //将计时器A1清零
   TA1CTL|=TASSEL_2+MC_3;   //定时器选择SMCLK作为时钟源,且为增减模式
   TA1CCTL1=OUTMOD_4; //定时器A1中的捕获比较器1,输出模式为4翻转
   while(1);
}
 
 
 
 
              //呼吸灯//
//  介绍: 该程序利用TIMER A 的 UP模式 在P1.3脚产生PWM输出
//  将CCR0设置为1500来定义PWM的周期,利用循环不断改变CCR1的值,
//  实现利用改变PWM的占空比来改变LED亮度.
//  SMCLK = MCLK = TACLK = default DCO
#include
void delay_nms(unsigned int n)// 延时函数
  {
    unsigned int j;
    for (j=0;j<(n);j++)
    {
      __delay_cycles(400);   //太短会使LED显得好像在常亮,太长就要等较长时间来观察了
    }
  }
void main(void)
{
  unsigned const PWMPeriod = 1500; //设置PWM周期参数,const声明此值不允许改变.该数值太大,会导致LED闪烁
  volatile unsigned int i;        //声明变量i是随时可变的,系统不要去优化这个值
  WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗
  P1DIR |=BIT3;              // 设置 P1.3为输出
  P1SEL |=BIT3;              // 设置 P1.3为TA0.2输出
  TA0CCR0 = PWMPeriod;           // 设置PWM 周期
  TA0CCTL2 = OUTMOD_7;           // 设置PWM 输出模式为:7 - PWM复位/置位模式,
                              // 即输出电平在TAR的值等于CCR2时复位为0,当TAR的值等于CCR0时置位为1,改变CCR2,从而产生PWM。其实模式2也可以
  TA0CTL= TASSEL_2 +MC_1;    // 设置TIMERA的时钟源为SMCLK, 计数模式为up,到CCR0再自动从0开始计数
  while(1)
  {
   TA0CCR2=0;//确保最开始是暗的
    //渐亮过程:不断设置TA0CCR2的值,使翻转的时间变长,改变PWM的占空比
    for(i=0;i     {
      TA0CCR2=i;
      delay_nms(4-(i/500));  //占空比变化的延时,调整延迟时间可改变呼吸灯变暗的速度
                             //在暗的时候延长delay时间,可增强效果
     }
    //渐暗过程:不断设置TA0CCR2的值,使翻转的时间变短,改变PWM的占空比
    for(i=PWMPeriod;i>0;i-=1)
    {
      TA0CCR2=i;
      delay_nms(4-(i/500));           //占空比变化的延时,调整延迟时间可改变呼吸灯变暗的速度
                                    //在暗的时候延长delay时间,可增强效果
    }
     TA0CCR2=0;  //确保灯暗
     delay_nms(250); //时间长一点,增强视觉效果
  }
}
关键字:MSP430F5529  定时器  Timer_A-2 引用地址:MSP430F5529 (六)定时器Timer_A-2

上一篇:MSP430F5529 (七)定时器B
下一篇:MSP430F5529 (六)定时器Timer_A-1

推荐阅读最新更新时间:2024-03-16 14:29

MSP430F5529 多通道ADC定时器触发+DMA传输
竞赛之前学习了一下从没有使用过的MSP430单片机,使用的是MSP430F5529的demo板,这块板子应该是MSP430中比较流行的一块了。使用这块板子实现了一个双通道ADC的定时器触发DMA传输,这里记录一下给别人一点参考,同时也为以后需要用到的时候提供笔记。废话不多说直接上源码,代码如下。 #include msp430.h #include stdint.h int data_buf0 ; int data_buf1 ; /** * main.c */ int main(void) { unsigned int i; WDTCTL = WDTPW | WDTHOLD; // stop watchdog
[单片机]
<font color='red'>MSP430F5529</font> 多通道ADC<font color='red'>定时器</font>触发+DMA传输
stm32 定时器知识总结
一 定时器的种类 STM32F103系列有11个定时器: 2个高级定时器(TIM1,TIM8) 4个通用定时器(TIM2,TIM3,TIM4,TIM5) 2个基本定时器(TIM6,TIM7) 2个看门狗定时器(IWDG,WWDG) 1个系统滴答定时器 二 定时器主要功能 基本定时器(TIM6,TIM7)的主要功能就是定时,由各自的可编程预分频器驱动。 通用定时器(TIM2~TIM5)除了基本的定时功能以外,还具有输入捕获和输出比较,产生pwm波形的功能。 高级定时器除了具有以上两种定时器的功能以外,还具有输出互补带死区的信号,以及刹车等功能。 看门狗定时器用于监测程序是否故障的,在超出一定时间程序跑飞
[单片机]
STM32F4系列HAL库配置定时器实验——输入捕获
输入捕获简单讲解 输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量周期和频率为例,用一个简图来说明输入捕获的原理 假定定时器工作在向上计数模式, 图中 t1~t2 时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x 为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道 x为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。 在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数
[单片机]
STM32F4系列HAL库配置<font color='red'>定时器</font>实验——输入捕获
MSP430f5529之PWM控制舵机程序
#include msp430.h //函数库 int sum=0; //全局变量 int main(void) { volatile unsigned int i; //局部变量 //设置timerA相关参数 WDTCTL = WDTPW+WDTHOLD; // 关闭看门狗 P1DIR |= BIT2; // 将P1.2设置为输出端口,验证状态 P2DIR |= BIT0; //P2.0输出PWM波 TA0CCTL1 = OUTMOD_7;
[单片机]
【STM32】HAL库-系统滴答定时器SysTick
SysTick定时器被捆绑在NVIC中,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。 系统滴答定时器有4个寄存器 时钟源 该定时器的时钟源可以是 内部时钟(FCLK,CM3上的自由运行时钟) 外部时钟( CM3处理器上的STCLK信号) 通过SysTick控制及状态寄存器的第2位来确定 STM32的时钟树 RCC通过AHB时钟(HCLK)8分频或者不分
[单片机]
【STM32】HAL库-系统滴答<font color='red'>定时器</font>SysTick
stm32f103——通用定时器输出PWM
通用定时器 ----输出 1,输出一个PWM 2,检测脉冲宽度 1》PWM---脉冲宽度调制 占空比:高电平占整个周期的百分比 2》PWM作用:调节灯的亮度,声音的大小,速度的快慢----平均电压值 什么是PWM信号? PWM,英文名Pulse Width Modulation,是脉冲宽度调制(记住这个名词)缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%. PWM脉冲宽度
[单片机]
stm32f103——通用<font color='red'>定时器</font>输出PWM
MSP430F5529 I2C 程序
MSP430板子到了好久,一直没有时间来写程序,前两天终于有空了,把I2C调试了下,参照TI给的例程,把发送和接收整合到一起。期间中断屏蔽处理的不好,经常进不了中断。网上也没有可参照的例程。只有仔细读了MSP430F55xx的用户手册,才调通。用户手册才是王道呀! #include msp430.h #include i2c.h extern unsigned char RXData,TXData,TXByteCtr,ATXData ; void I2C_Init(uint8_t SlaveAddress) { P3SEL |= 0x03; // Assign I2C pins to USCI_B0 UCB0CTL1 |=
[单片机]
具有四个输出并基于微处理器的双定时器
基于Freescale半导体公司MCC908QY型8位闪存微型计算机的图1所示电路,可提供一个低成本通用双定时器,该定时器可代替单触发电路。您可以通过修改汇编语言软件来满足特定应用要求。该电路采用微处理器 IC1的内部12.8MHz 时钟振荡器。内部时钟除以4即获得3.2 MHz时钟频率,此频率进一步除以定时器预定比例 64即获得50 kHz时钟。将定时器模数计数器除以 50000,可获得可产生1次/秒实时中断与主定时间隔 的1Hz 时基。   每组4个的两组开关(S3至S6及S7至S10),分别以1"16秒的递量设置时间间隔 t1和 t2。尽管该图只给出了单独的DIP 开关,但您也可采用十六进制编码的旋钮式开关来设置时
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved