MSP430F5529学习笔记(四)——定时器|PWM

        本节我们讲述定时器的应用,在使用定时器前补充一点关于MSP430.H头文件自带的延时函数的知识,该头文件自带__delay_cycles(x);的延时函数,根据官方信息说延时时间是一个周期,内部可以放入常量和表达式,根据其特性我们可以运用其设计较为准确的US,MS级延时函数,操作方法为将以下函数段放入头文件之下宏定义即可在后续程序中调用。

#define CPU_F ((double)8000000)//CPU_F 为系统主时钟频率
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))//微秒
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))//毫秒

对应寄存器简述   

          在使用定时器之前我们首先要了解MSP430F5529片内片外的是时钟源,MSP430有4个时钟源,它们分别为TAxCLK,ACLK,SMCLK,INCLK(分别用TASSEL_0-TASSEL_3表示)。另外430的是时钟源支持二,四,八分频,  同时支持三种计数模式,分别为:

00  不分频                         01  二分频                                10  四分频                               11八分频

01:从0计数至TAxCCR0                    10:从0计数至0XFFFF                   11:从TAxCCR0计数至0

        寄存器其余位分别为为TACLR清零计数器,TAIE中断使能,TAIFG中断标志位。TA0CCRn为放置捕获数值和比较数值的寄存器。对应此寄存器对定时器进行基本的初始化配置为:

TA0CCTL0=CCIE;//CCR0中断使能
TA0CCR0=16;//中断计数值
TA0CTL=TASSEL_2+MC_1+ID_3+TACLR+TAIE;//SMCLK+增计数模式+不分频+清零计数器+使能中断
_BIS_SR(GIE);//将GIE位清零

        以上函数为配置定时器A的代码,同理配置定时器B的代码也是以这种模式,同时TA0CTL内可以缩略为TASSEL_2+MC_1(选择时钟源和计数模式),其余配置在需要时再进行设置。

中断服务函数

        对应定时器的操作最常用的即为定时器中断的使用,对应的也有定时器中断服务函数的书写,在MSP430中定时器中断服务函数和外部中断服务函数的书写方式近似:

#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    //函数内容
}

在使用过程中,还可以在进入中断后加入“TA0CTL &= ~TAIFG;//清除标志位”语句清楚中断标志位

输出模式

输出模式由 OUTMOD 位定义,TA0CCTLx寄存器的共有7中输出模式,对于除模式 0 以外的所有模式,OUTn 信号随定时器时钟的上升沿而改变。 输出模式 2、3、6 和 7对输出模式 0 没有用,因为 EQUn=EQU0。

OUTMODx模式描述
000OUTPUT输出信号OUTn 由OUT 位定义。OUTn 信号在OUT 更新时立即更新。
001SET当定时器计数到 TAxCCRn 值时设置输出。它保持设置直到定时器复位,或直到选择另一种输出模式并影响输出。
010Toggle/Reset当定时器计数到 TAxCCRn 值时输出切换。当定时器计数到 TAxCCR0 值时复位。
011Set/Reset当定时器计数到 TAxCCRn 值时设置输出。当定时器计数到 TAxCCRO 值时复位。
100 Toggled当定时器计数到 TAxCCRn 值时,输出切换。输出周期是定时器周期的两倍。
101Reset当定时器计数到 TAxCCRn 值时,输出复位。它保持复位直到|选择了另一种输出模式并影响输出。
110Toggle/Set当定时器计数到 TAxCCRn 值时,输出被切换。当定时器计数到 TAxCCR0 值时设置。
111Reset/set当定时器计数到 TAxCCRn 值时输出复位。当定时器计数到 TAxCCRO 值时设置。

单定时器多通道

      我们可以使用单个定时器产生多个通道的中断输出,例如:

#include <msp430.h>
void main(void)
{
    WDTCTL = WDTPW |WDTHOLD; // Stop WDT
    P1DIR =0x0C; // P1.0 output
    P1SEL=0x0C;

    TA0CCR0= 65534;
    TA0CCR1 = 25000;    //1sec (0.5+0.5)
    TA0CCR2 = 64000;    //

    TA0CCTL1 = OUTMOD_7; // CCR0 interrupt enabled
    TA0CCTL2 = OUTMOD_7; // CCR0 interrupt enabled
    TA0CTL = TASSEL_2 + MC_3+ID_3+TAIE+TACLR; // SMCLK, countmode

    _BIS_SR(LPM0_bits+GIE); // Enter LPM0 w/ interrupt
}

多定时器同时计数

        以下为timer_A,timer_B同时工作的配置方式,通过同时对定时器A和定时器B的配置可以实现对两个定时器的同时计数:

   TA0CCTL0=CCIE;
   TA0CCR0 =1000-1;
   TA0CTL = TASSEL_2 + MC_1; // SMCLK, contmode

   TB0CCTL0 = CCIE; // CCR0 interrupt enabled
   TB0CCR0 = 2000-1;
   TB0CTL = TBSSEL_2 + MC_1; // SMCLK, contmode

         同时对两个计数器分别写入对应的中断服务函数,通过其来实现不同的应用效果:

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
    x++;
    if(x>1000)
    {
        P1OUT ^= 0x01;
        x=0;
}
}

#pragma vector=TIMER0_B0_VECTOR
__interrupt void Timer_B0 (void)
{
    y++;
    if(y>1500)
    {
        P4OUT ^= 0x80;
        y=0;
}
}

 多源中断

中断服务函数的中断矢量(TIMER0_A1_VECTOR)以及本征函数(__even_in_range(TA0IV,14)) 对应TAxCCRx的不同中断标志位,通过对其进行判断可以设置不同中断的不同功能。



#pragma vector=TIMER0_A1_VECTOR
    __interrupt void TIMER0_A1_ISR(void)
    {
        switch(__even_in_range(TA0IV,14))
        // __even_in_range()本征函数,用于多源中断的查询。
        {
            case 0 :  break; // No interrupt
            case 2 :  P1OUT ^= BIT0; break; // CCR1 used
            case 4 :  break; // CCR2 not used
            case 6 :  break; // reserved
            case 8 :  break; // reserved
            case 10: break; // reserved
            case 12: break; // reserved
            case 14: P4OUT ^= BIT1;break; // TAIFG            
            default: break;
        }
    }

PWM波的输出

        PWM作为定时器的一个使用方式在我们学习51单片机时就早有了解,那时我们便为自己成功实现电机调速等欣喜,在单片机微控制芯片的使用中免不了会遇到电机调速,调光,舵机转动等使用情况,这里我们便要使用到PWM波进行调控,即在一定周期内设定高低电平的时长,通过改变时长来实现调速的效果。接下来我们简单用timer_A实现简单的PWM输出:

#include <msp430f5529.h>
int i = 0,d=0;
void main(void)
{    WDTCTL = WDTPW|WDTHOLD;//关闭看门狗

     P1DIR |= BIT2;//设置P1.2为输出模式
     P1SEL |= BIT2;//设置其IO口为特殊IO口

     TA0CCR0 = 16; // 设置好PWM的总周期
     TA0CCR1 = 0; // PWM的工作周期
     TA0CCTL1 = OUTMOD_3; // TA0CCR1为模式3,复位且高电平置位模式。
     TA0CTL = TASSEL_2 + MC_1 +ID_1+TAIE;// SMCLK,向上计数模式,二分频 触发中断
     _BIS_SR(LGIE); 
}
#pragma vector= TIMER0_A1_VECTOR
 __interrupt void timer(void)
 {
     TA0CTL &= ~TAIFG;   //清楚标志位
     if(d==0)
     {
         if(i<16 )
             TA0CCR1=++i;//其定时到一个中断就自加1,使PWM增大。
         else
             d=1;
     }
     else if(d==1)
     {
          if(i>1)
              TA0CCR1=--i;//同理自减
          else
              d=0;
     }
}

        以上是我对MSP430定时器的粗浅认识,后续如有加深理解会继续优化,也欢迎大家批评指正。

      

  • 19
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Msp430f5529是一种常用的微控制器,可以使用其中的PWM功能来实现呼吸灯效果。 首先,我们需要了解PWM(脉宽调制)技术。PWM是一种调节信号的方法,通过控制信号的高电平时间和低电平时间的比例来调节输出电压的大小。通过调节PWM的占空比,可以实现不同亮度的灯光效果。 接下来,我们可以通过Msp430f5529PWM模块来实现呼吸灯效果。首先,我们需要初始化PWM模块,设置频率和占空比。 首先,我们需要声明一个全局变量,用于表示呼吸灯亮度的变化范围。 ```C int brightness = 0; // 呼吸灯亮度变化范围 ``` 然后,我们需要初始化PWM模块,设置频率和占空比。 ```C // 初始化PWM模块 TA0CTL = TASSEL_2 + MC_1 + ID_2; // 选择SMCLK作为PWM时钟源,选择Up模式,选择8分频 TA0CCR0 = 255; // 定时器计数上限,决定PWM频率 TA0CCR1 = 0; // 脉冲宽度初始值,决定PWM占空比 TA0CCTL1 = OUTMOD_7; // TACCTL1的输出模式选择PWM输出模式 ``` 接下来,我们可以使用一个循环来控制呼吸灯效果的变化。 ```C while(1) { for (brightness = 0; brightness <= 255; brightness++) { TA0CCR1 = brightness; // 更新脉冲宽度 __delay_cycles(5000); // 稍微延时一下,使呼吸灯效果更加明显 } for (brightness = 255; brightness >= 0; brightness--) { TA0CCR1 = brightness; // 更新脉冲宽度 __delay_cycles(5000); // 稍微延时一下,使呼吸灯效果更加明显 } } ``` 以上就是使用Msp430f5529PWM模块实现呼吸灯效果的基本步骤。通过不断调整PWM信号的占空比,我们可以实现呼吸灯的灯光效果。 ### 回答2: MSP430F5529是德州仪器(TI)推出的低功耗微控制器系列中的一员,其提供了多种功能模块和引脚,可以实现各种应用。其中,PWM模块可以用于实现呼吸灯效果。 呼吸灯是一种通过改变灯光亮度的方法来营造渐变效果的灯光装饰。实现呼吸灯效果的关键是利用PWM控制灯光的亮度,使其由暗到亮再由亮到暗,形成渐变的感觉。 在MSP430F5529中,PWM模块可以通过配置计数器周期和占空比来实现对灯光亮度的控制。首先,我们需要初始化PWM模块的相关设置,包括选择PWM输出引脚、设定计数器周期和占空比等。然后,我们可以通过修改占空比的值来实现呼吸灯效果。 实现步骤如下: 1. 初始化PWM模块,选择合适的PWM输出引脚,如P1.2。 2. 设定计数器周期,可以根据需要设置合适的值,比如500。 3. 设置初始占空比为0。 4. 进入主循环,通过改变占空比的值来实现渐变效果。 5. 增加占空比的值,让灯光逐渐变亮。 6. 当占空比达到最大值时,递减占空比的值,让灯光逐渐变暗。 7. 当占空比递减到0时,重复从步骤5开始。 通过调整占空比的增减速度和计数器周期,可以控制呼吸灯的渐变速度和效果。 需要注意的是,在编程时需要合理设置延时,以确保呼吸灯效果的平滑过渡。另外,也可以在呼吸灯效果的基础上添加其他功能,比如通过按键来控制开关灯等。 通过MSP430F5529PWM模块实现呼吸灯效果,可以使灯光更具有美观性和吸引力。这只是一个简单的示例,具体的实现方法可以根据具体需求进行调整和扩展。 ### 回答3: MSP430F5529是一款低功耗的微控制器,具有PWM(脉宽调制)功能,可以用来实现呼吸灯效果。 首先,我们需要设置MSP430F5529定时器,来控制PWM的频率和占空比。定时器可以通过寄存器配置来实现,例如TA0CCR0用于设置PWM周期,TA0CCR1用于设置PWM占空比。通过改变TA0CCR1的值,我们可以实现呼吸灯效果。通过调整TA0CCR0的值,我们可以控制PWM的频率。 其次,我们需要在程序中轮流增加和减小TA0CCR1的值,以模拟呼吸灯效果。可以使用一个for循环或while循环来实现。当TA0CCR1的值增加到TA0CCR0时,即呼吸灯达到最亮的状态;当TA0CCR1的值减小到0时,即呼吸灯达到最暗的状态。这样循环之后,我们就实现了呼吸灯效果。 最后,我们需要将MSP430F5529连接到一个LED,以显示呼吸灯效果。可以通过配置GPIO口的输出模式,将LED连接到MSP430F5529的某个引脚上。在程序的主循环中,通过改变引脚的输出电平,即可控制LED的亮灭,从而实现呼吸灯效果。 综上所述,通过配置定时器和GPIO口,以及使用循环控制PWM的占空比,我们可以实现MSP430F5529呼吸灯的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值