您的位置 首页 电子

MSP430定时器的PWM输出

定时器是单片机常用的其本设备,用来产生精确计时或是其他功能;msp430的定时器不仅可以完成精确定时,还能产生PWM波形输出,和捕…

守时器单片机常用的其本设备,用来发生准确计时或是其他功用;msp430的守时器不只能够完结准确守时,还能发生PWM波形输出,和捕获时刻值(上升沿或是下降沿到来的时分)。这儿完结一个比较通用的PWM波形发生程序。

硬件介绍: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):

计数形式:

增计数形式

捕获/比较寄存器CCR0用作Timer_A增计数形式的周期寄存器,由于CCR0为16位寄存器,所以该形式适用于守时周期小于65 536的接连计数状况。计数器TAR能够增计数到CCR0的值,当计数值与CCR0的值持平(或守时器值大于CCR0的值)时,守时器复位并从0开端从头计数。

接连计数形式

在需求65 536个时钟周期的守时运用场合常用接连计数形式。守时器从当时值计数到0FFFFH后,又从0开端从头计数。

增/减计数形式

需求对称波形的状况常常能够运用增/减计数形式,该形式下,守时器先增计数到CCR0的值,然后反向减计数到0。计数周期仍由CCR0界说,它是CCR0计数器数值的2倍。

TA守时器有比较、捕获两种作业方法;比较能够发生PWM波形等,捕获能够准确的丈量时刻;这儿用的是比较输出。

硬件介绍就这么多了,其他的能够参阅msp430x1xx_family_users_guide(用户攻略)。

程序完结:

本程序是直接从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;    //ACLKcase S: case s:  TACTL|=TASSEL_2; break;    //SMCLKcase E:            TACTL|=TASSEL_0; break;    //外部输入(TACLK)case e:            TACTL|=TASSEL_3; break;    //外部输入(TACLK取反)default :  return(0);                           //参数有误} switch(Div)                 //挑选分频系数{ case 1:   TACTL|=ID_0; break;   //1case 2:   TACTL|=ID_1; break;   //2case 4:   TACTL|=ID_2; break;   //4case 8:   TACTL|=ID_3; break;   //8default :  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/2Percent: 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 resetWDTCTL = 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的波形输出程序。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/275083.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部