MSP430 定时器输出PWM波形

  1. 硬件介绍:

    MSP430系列单片机的TimerA结构复杂,功能强大,适合应用于工业控制,如数字化电机控制,电表和手持式仪表的理想配置。它给开发人员提供了较多灵活的选择余地。当PWM 不需要修改占空比和时间时,TimerA 能自动输出PWM,而不需利用中断维持PWM输出。

    MSP430F16x和MSP430F14x单片机内部均含有两个定时器,TA和TB;TA有三个模块,CCR0-CCR2;TB含有CCR0-CCR67个模块;其中CCR0模块不能完整的输出PWM波形(只有三种输出模式可用);TA可以输出完整的2路PWM波形;TB可以输出6路完整的PWM波形。

    定时器的PWM输出有有8种模式:

    输出模式0  输出模式:输出信号OUTx由每个捕获/比较模块的控制寄存器CCTLx中的OUTx位定义,并在写入该寄存器后立即更新。最终位OUTx直通。 
    输出模式1 置位模式:输出信号在TAR等于CCRx时置位,并保持置位到定时器复位或选择另一种输出模式为止。 
    输出模式2 PWM翻转/复位模式:输出在TAR的值等于CCRx时翻转,当TAR的值等于CCR0时复位。 
    输出模式3 PWM置位/复位模式:输出在TAR的值等于CCRx时置位,当TAR的值等于CCR0时复位。 
    输出模式4 翻转模式:输出电平在TAR的值等于CCRx时翻转,输出周期是定时器周期的2倍。 
    输出模式5复位模式:输出在TAR的值等于CCRx时复位,并保持低电平直到选择另一种输出模式。 
    输出模式6PWM翻转/置位模式:输出电平在TAR的值等于CCRx时翻转,当TAR值等于CCR0时置位。 
    输出模式7PWM复位/置位模式:输出电平在TAR的值等于CCRx时复位,当TAR的值等于CCR0时置位。

    下图是增计数模式下的输出波形(本程序使用的是增模式3和7):

    image

    计数模式:

    增计数模式 
    捕获/比较寄存器CCR0用作Timer_A增计数模式的周期寄存器,因为CCR0为16位寄存器,所以该模式适用于定时周期小于65 536的连续计数情况。计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。

    image

    连续计数模式 
    在需要65 536个时钟周期的定时应用场合常用连续计数模式。定时器从当前值计数到0FFFFH后,又从0开始重新计数

    image

    增/减计数模式 
    需要对称波形的情况经常可以使用增/减计数模式,该模式下,定时器先增计数到CCR0的值,然后反向减计数到0。计数周期仍由CCR0定义,它是CCR0计数器数值的2倍。

    image

    TA定时器有比较、捕获两种工作方式;比较可以产生PWM波形等,捕获可以精确的测量时间;这里用的是比较输出。

    硬件介绍就这么多了,其他的可以参考msp430x1xx_family_users_guide(用户指南)。

  2. 程序实现:

    本程序是直接从msp430f42x移植的,只改动了端口就能正常使用了。由此,430的模块在不同的系列中是通用的,有关寄存器是一样的;只是也许外部端口不太一样。

    程序初始化部分:完成TA相关寄存器的初始化。

    char TAPwmInit(char Clk,char Div,char Mode1,char Mode2)
    {
        TACTL = 0;                  //清除以前设置
        TACTL |= MC_1;              //定时器TA设为增计数模式  
        switch(Clk)                 //选择时钟源
        { 
            case 'A': case 'a':  TACTL|=TASSEL_1; break;    //ACLK
            case 'S': case 's':  TACTL|=TASSEL_2; break;    //SMCLK
            case 'E':            TACTL|=TASSEL_0; break;    //外部输入(TACLK)
            case 'e':            TACTL|=TASSEL_3; break;    //外部输入(TACLK取反)
            default :  return(0);                           //参数有误
        } 
        switch(Div)                 //选择分频系数
        { 
            case 1:   TACTL|=ID_0; break;   //1
            case 2:   TACTL|=ID_1; break;   //2
            case 4:   TACTL|=ID_2; break;   //4
            case 8:   TACTL|=ID_3; break;   //8
            default :  return(0);           //参数有误
        } 
        switch(Mode1)               //设置PWM通道1的输出模式。
        { 
            case 'P':case 'p':          //如果设置为高电平模式
                TACCTL1 = OUTMOD_7;     //高电平PWM输出
                P1SEL |= BIT2;          //从P1.2输出 (不同型号单片机可能不一样)
                P1DIR |= BIT2;          //从P1.2输出 (不同型号单片机可能不一样)              
                break;
            case 'N':case 'n':          //如果设置为低电平模式          
                TACCTL1 = OUTMOD_3;     //低电平PWM输出
                P1SEL |= BIT2;          //从P1.2输出 (不同型号单片机可能不一样) 
                P1DIR |= BIT2;          //从P1.2输出 (不同型号单片机可能不一样)                
                break; 
            case '0':case 0:            //如果设置为禁用          
                P1SEL &= ~BIT2;         //P1.2恢复为普通IO口              
                break;                 
            default :  return(0);       //参数有误
        } 
        switch(Mode2)                   //设置PWM通道1的输出模式。
        { 
            case 'P':case 'p':          //如果设置为高电平模式
                TACCTL2 =OUTMOD_7;      //高电平PWM输出
                P1SEL |= BIT3;          //从P1.3输出 (不同型号单片机可能不一样)
                P1DIR |= BIT3;          //从P1.3输出 (不同型号单片机可能不一样)
                break;
            case 'N':case 'n':          //如果设置为低电平模式          
                TACCTL2 =OUTMOD_3;      //低电平PWM输出
                P1SEL |= BIT3;          //从P1.3输出 (不同型号单片机可能不一样)  
                P1DIR |= BIT3;          //从P1.3输出 (不同型号单片机可能不一样)              
                break; 
            case '0':case 0:            //如果设置为禁用          
                P1SEL &= ~BIT3;         //P1.3恢复为普通IO口              
                break;                 
            default :  return(0);       //参数有误
        }    
        return(1);  
    }

    主要是设置TACTL寄存器,让TA工作于增模式,设置时钟源和分频;CCTLx设置对应的输出模式;并且打开相应端口的第二功能。

    设置周期函数:设置PWM波形的周期,单位是多少个TACLK周期。

    void TAPwmSetPeriod(unsigned int Period)
    {
        TACCR0 = Period;
    }

    工作于增模式时,TA计数到TACCR0,设CCR0就完成了周期的设置。

    设置占空比:设置TA的PWM输出的有效电平的时间。

    void TAPwmSetDuty(char Channel,unsigned int Duty)
    {
        switch(Channel)
        {
            case 1: TACCR1=Duty; break; 
            case 2: TACCR2=Duty; break;    
        }
    }

    根据参数分别设置每一路的参数。

    设置占空比,用千分比设置:

    * 入口参数:Channel: 当前设置的通道号  1/2
                Percent: PWM有效时间的千分比 (0~1000) 
    * 出口参数:无
    * 说    明: 1000=100.0%  500=50.0% ,依次类推        
    * 范    例: TAPwmSetPermill(1,300)设置PWM通道1方波的占空比为30.0%
                TAPwmSetPermill(2,825)设置PWM通道2方波的占空比为82.5%
                */
    void TAPwmSetPermill(char Channel,unsigned int Percent)
    {
        unsigned long int Period;
        unsigned int Duty;
        Period = TACCR0;
        Duty = Period * Percent / 1000;
        TAPwmSetDuty(Channel,Duty);
    }

    这个函数用千分比来设置PWM输出的有效时间。方便程序的使用。

    有关定时器,TI提供的大量的例程,这些历程都很简洁、清晰。需要其他功能可以自己根据例程编写对应的程序。程序实现就这么多了,下面说下本程序的使用方法。

  3. 使用示例:

    使用方式:依然是在工程中加入c文件;文件包含h头文件;然后就可以正常使用本函数了。详细参考示例工程和main.c。

    main主要程序如下:

    #include "msp430x16x.h"     //430寄存器头文件
    #include "TAPwm.h"          //TA PWM输出程序库头文件
    
    void main()
    {
        // Stop watchdog timer to prevent time out reset
        WDTCTL = WDTPW + WDTHOLD;
        ClkInit();
        
        TAPwmInit('A',1,'P','P');   //将定时器TA初始化成为PWM发生器
                      //时钟源=ACLK ; 无分频;  通道1和通道2均设为高电平模式。
        TAPwmSetPeriod(500);        //通道1/2的PWM方波周期均设为500个时钟周期
        TAPwmSetDuty(1,200);        //1通道 有效200个时钟周期
        TAPwmSetPermill(2,200);     //2通道 20.0%
    
        LPM0;
    }

    本程序调用程序库,产生两路PWM波形。

TA的PWM输出就到这儿了,如果需要更多路的PWM波,可以使用TB,他可以产生6路完整的PWM波形;可以参考本程序编写TB的波形输出程序。有什么不足之处,欢迎评论,讨论。

  • 13
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
msp430f5529是一款德州仪器的单片机,它具有多个定时器模块可以用来生成PWM信号。以下是使用msp430f5529定时器模块生成PWM输出的步骤: 1. 配置定时器模块:选择一个可用的定时器模块,并设置它的工作模式为PWM模式。 2. 设置定时器计数器:根据需要设置定时器的计数值,决定PWM信号的频率。 3. 设置占空比:根据需要设置CCR(捕获比较寄存器)的值,控制PWM信号的占空比。 4. 配置GPIO引脚:选择一个可用的GPIO引脚,并将其配置为PWM输出模式。 5. 启动定时器:启动定时器模块,开始生成PWM信号。 下面是一个使用msp430f5529定时器A0生成PWM输出的示例代码: ```c #include <msp430.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停用看门狗定时器 P1DIR |= BIT2; // 配置P1.2为输出 P1SEL |= BIT2; // 设置P1.2为TA0.1引脚 TA0CCR0 = 1000; // 设置计数器上限,决定PWM信号的频率 TA0CCTL1 = OUTMOD_7; // 设置TA0CCR1为PWM模式 TA0CCR1 = 500; // 设置占空比为50%(CCR0的一半) TA0CTL = TASSEL_2 + MC_1; // 设置时钟源为SMCLK,选择增计数模式 __bis_SR_register(LPM0_bits); // 进入低功耗模式 } ``` 上述代码中,P1.2引脚被配置为TA0.1引脚,连接到了定时器A0的CCR1输出。TA0CCR0的值决定了PWM信号的频率,而TA0CCR1的值决定了PWM信号的占空比。 请注意,以上代码仅为示例,具体的配置和使用方法可能需要根据你的实际需求进行调整。你可以根据msp430f5529的手册和参考资料进一步了解定时器模块的详细配置和使用方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值