[资料分享] MSP430 定时器输出PWM

fish001   2018-8-11 21:45 楼主
本程序是直接从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提供的大量的例程,这些历程都很简洁、清晰。需要其他功能可以自己根据例程编写对应的程序。程序实现就这么多了,下面说下本程序的使用方法。

使用示例:
使用方式:依然是在工程中加入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的波形输出程序。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复