MSP430定时器的PWM输出

发布者:Haifeeng最新更新时间:2016-08-02 来源: eefocus关键字: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):

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(用户指南)。

        程序实现:

        本程序是直接从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  定时器  PWM输出 引用地址:MSP430定时器的PWM输出

上一篇:单片机C与汇编自由转换
下一篇:MSP430常用加密总结

推荐阅读最新更新时间:2024-03-16 15:02

基于单片机MSP430F147的自动寻边器下位机设计
寻边器是机电行业现场检测工件常用的光学计量仪器。长期以来,为保证光学投影仪或工业数控机床检测中的成像质量、测量准确度等技术指标,国内外传统自动寻边器生产厂家推出的投影仪其成像都是反像。为迎合部分顾客的特殊需求,各厂家相继推出其成像为正像的投影仪。该技术常利用寻边器装在主轴上,对孔壁、矩形工件外形进行寻点坐标后,将其坐标值记录下来,经手工计算,再输入到零点偏置。 在实际加工使用过程中,时有人为因素计算或误操作,导致工件零点不正确,造成不必要的废品或损失。随着自动化技术的应用,国内外出现了依靠先进智能算法寻找目标点的自动寻边系统。 1 寻边器介绍 如图1所示,本系统所采用寻边器件为光敏寻边器,其相当于一个阻值随光暗度变化而改变
[单片机]
基于单片机<font color='red'>MSP430</font>F147的自动寻边器下位机设计
MSP430内部上拉下拉使用注意——IO口测高低电平
简介:MSP430单片机IO口用来检测高低电平时,是不需要外部上拉下拉的,因为其内部有上拉和下拉。在用作高低电平检测时,需要开启上拉或下拉。 如果有效状态为高电平,则需要配置为REN为上拉使能,且配置OUT为0,即设置为下拉。 如果有效状态为低电平,则需啊哟配置REN为使能,且OUT位1,即设置为上拉。 如果不开启内部上拉下拉使能,则IO可能出现不固定状态。譬如,当IO被输入高后,外部输入被撤除,但IO寄存器仍然为高。 注意: 这里出现的情况是给IO输入高电平后,外部输入撤离,但是IO寄存器IN仍然保持高电平,而是用万用表量电压后,IO变为0. 出现这个情况的原因是IO对地串联了一个3K电阻和100nf电容
[单片机]
msp430与A7105实现单工通信
A7105是一款性价比不错的RF。单个人认为它的实现比较麻烦,好在还有手册,有参考程序,总算是实现了,现在拿来与大家分享一下。 先说一下大致流程: Master端: 1)timer=0ms 发送数据(采用调频发送) Slaver端: 2)timer=2ms接收数据,并送给PC 程序代码: //=================================================================================== //da ta.h 文件 //功能:常量与全局变量定义 //代码: //=====================================
[单片机]
msp430串口发送中断操作之简单三步
预备知识:本人用的msp430fr6989(msp430系列大同小异),datasheet中有句非常关键的一段话: 30.3.15.1 UART Transmit Interrupt Operation The UCTXIFG interrupt flag is set by the transmitter to indicate that UCAxTXBUF is ready to accept another character. An interrupt request is generated if UCTXIE and GIE are also set. UCTXIFG is automatically rese
[单片机]
STC89C52单片机 使用定时器使LED灯闪烁
#include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char sbit LED1 = P1^0;//LED1 //定时器1初始化 void timer1Init() { TR1 = 1; //启动定时器1 TMOD |= 0X10; //定时器1工作模式1,16位定时模式 TH1 = 0x4b; TL1 = 0xfd; //定时50ms } void main()//main函数自身会循环 { uchar mSec;//毫秒储存变量 timer1In
[单片机]
基于MSP430F449的数字频率计设计
本文利用前置分频器SAB6456A和高速数字分频器74HC390的分频功能,结合新型的MSP430F449单片机,给出了一种新颖的、全自动的数显测量射频频率的设计方案。 图1 信号的前端处理及分频电路 主要器件介绍 MSP430F449单片机   MSP430F449 采用16位RISC结构,具有丰富的片内外设和大容量的片内工作寄存器和存储器,性能价格比很高。它的特点包括: · 超低的功耗:能够在1.8V~ 3.6V的电压下工作;具有工作模式(AM)和5种低功耗模式(LPM)。在低功耗模式下,CPU可以被中断唤醒,响应时间小于6ps。 · 较强的运算能力:16位的RISC结构,丰富的寻址方式;具有16个中断源,可以任意嵌套
[应用]
MSP430单片机中的WDT研究
  引 言   软件的可靠性一直是一个关键问题。任何使用软件的人都可能会经历计算机死机或程序跑飞的问题,这种情况在嵌入式系统中也同样存在。由于单片机的抗干扰能力有限,在工业现场的仪器仪表中,常会由于电压不稳、电弧干扰等造成死机。在水表、电表等无人看守的情况下,也会因系统遭受干扰而无法重启。为了保证系统在干扰后能自动恢复正常,看门狗定时器(Watchdog TI mer)的利用是很有价值的。   1 看门狗的作用   看门狗定时器是一个计数器,基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗计数器正常工作时自动计数,程序流程定期将其复位清零,如果系统在某处卡死或跑飞,该定时器将溢出,并将进入中断。在定时器中断中执行一些
[单片机]
<font color='red'>MSP430</font>单片机中的WDT研究
STM32-定时器系统原理
STM32的定时器概述 STM32F1有TIME1和TIME8 等高级定时器,也有TIME2~TIME5等通用定时器,还有TIME6和TIME7等基本定时器。 关于高级定时器、通用定时器、基本定时器的区别: 基本定时器:具有最基本的计时功能,与通用和高级定时器的16位自动重装载计数器不同,他的计数器是一个累加计数器!基本定时器独有一个其他定时器没有的DAC的同步电路! 通用定时器:能满足大部分使用需求的定时器。 高级定时器:高级的骚操作比较多的定时器,但是一般不常用到,用到的时候可以再根据参考手册深入研究。 我们一般常用到的就是通用定时器。 通用定时器 通用定时器简介 主要功能 16位向上、向下、向上/向下
[单片机]
STM32-<font color='red'>定时器</font>系统原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved