历史上的今天
今天是:2025年05月03日(星期六)
2018年05月03日 | MSP430 定时器输出PWM波形
2018-05-03 来源:eefocus
硬件介绍:
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; //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的波形输出程序。有什么不足之处,欢迎评论,讨论。
下一篇:MSP430晶振配置详解
史海拾趣
|
来源:电子产品世界/ 西北工业大学 航海学院 任绪科 赵俊渭 周明 引言 在电子工程设计与测试中,常常需要一些复杂的、具有特殊要求的信号,要求其波形可任意产生,频率方便可调。通常的信 ...… 查看全部问答> |
|
学单片机通常都会学到24C02这东西,但实际现在的单片机片内都有继承EEPROM 而且传输速度,容量明显都远远大于24C02这东西 但貌似用的人不大多,网上找相关例子太少了,摸着资料写了这个程序,只要是STC的单片机,大部分都通用,童鞋们只要修改相应 ...… 查看全部问答> |
|
本人实验室用的Rockwell的PAC,提供了RSLinx Classic作为OPC server。 现在想利用MATLAB的OPC Toolbox建立OPC client来读取现场数据,可以用来在线辨识之类的。 OPC server能够连上,但是每次想读取某个Group下的Item数据时,总是提示“服务器出 ...… 查看全部问答> |
|
使用研华pcm-3370 pc104主板,但没找到合适的BSP,请问各位高手是否有现成的BSP?还是自己裁剪一个?望详解,100分相送,不够再加 … 查看全部问答> |
|
对于这个无线鼠标能不能如期完成,我真的不敢打包票,但我一定会竭尽全力,我只能这么说。 但是,仍然很希望有一个机会接触MSP430,学会对它编程。 因为一直没什么把握,所以一直没提交这份申请,想把无线鼠标的相应资料。不过刚 ...… 查看全部问答> |
|
请问大家我在仿真的时候.OUT文件总是不能load program 我的程序在编译和连接的时候都是没有错的 但是当我要仿真的时候点LOAD PROGRAM时就是没有办法登陆。OUT文件 总是提示说是请检查BUILD OPTION 和or use the setuo program 但是我不觉得里面也没有什么可以设置的 请问是怎么回事了?… 查看全部问答> |
|
请问师兄师姐们谁有关于msp430f169和PTR8000(nrf905)相连的电路图和c代码啊 小弟急需啊 谢谢啦 [ 本帖最后由 li84006800 于 2011-7-13 23:45 编辑 ]… 查看全部问答> |




