守时器是单片机常用的其本设备,用来发生准确计时或是其他功用;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的波形输出程序。