MSP430程序库<十一>定时器TA的PWM输出

2019-10-09来源: 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

[1] [2]
关键字:MSP430  程序库  定时器  PWM输出 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476517.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430程序库<十二>SVS(电源电压监控器)模块
下一篇:MSP430程序库<十>ADC12模块

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430程序库<十二>SVS(电源电压监控器)模块
电源电压监控对于单片机来说,也是经常要用的模块。当需要稳定的工业级产品时,经常要对电源电压监控,以保证单片机系统工作于正常环境或范围中。MSP430F16x提供了一个现成的电源电压监控器模块SVS,方便检测电源电压或者是外部电压,可以设置为电压过低时复位 或置标志位。本程序即完成SVS的设置使用的程序库(msp430f14x没有此模块)。硬件介绍:MSP430单片机含有的SVS模块可以很方便的监控电源电压或外部电压。电源电压监控器(SVS)是用于监控AVCC电源电压或外部电压。 SVS的可配置当电源电压或外部电压下降到低于用户选择的电压级别时设置一个标志,或产生POR复位。SVS模块有以下特点:可以监控AVCC电压;可选择产生
发表于 2019-10-09
MSP430程序库<十二>SVS(电源电压监控器)模块
MSP430程序库<十三>硬件乘法器使用
;/***************************************************************************** 名    称:main主程序* 功    能:硬件乘法器程序库使用演示* 入口参数:无* 出口参数:无****************************************************************************/void main( void ){    // Stop watchdog timer to prevent time out reset    WDTCTL = WDTPW + WDTHOLD; 
发表于 2019-10-09
MSP430程序库<十三>硬件乘法器使用
MSP430程序库<十四>DMA程序库
;     case 2: DMA2CTL |= DMAREQ;  break;      //2通道    }}这个和上个函数类似:仅仅设置一个控制位,函数很简单,不再解释啦。程序实现就这么多了,有关详细内容可以下载附件里的程序库,程序的注释很详细。使用示例:使用这个程序时,步骤和原来的相同:工程中加入DMA.c文件,然后源文件中包含DMA.h头文件即可。示例程序主要如下:#include <msp430x16x.h>#include "DMA.h"unsigned int
发表于 2019-10-09
MSP430程序库<十四>DMA程序库
MSP430程序库<十五>Flash控制器
一般,在单片机中的Flash存储器用于存放程序代码,属于只读型存储器。而在MSP430些列的单片机中,都可以通过内置的Flash控制器擦除或改写任何一段的内容。另外,msp430的单片机内部还专门留有一段Flash区域(information memory),用于存放掉电后需要永久保存的数据。利用430内部的Flash控制器,可以完成较大容量的数据记录、用户设置参数在掉电后的保存等功能。硬件介绍:要对Flash读写,首先要了解MSP430的存储器组织。430单片机的存储器组织结构采用冯诺依曼结构,RAM和ROM统一编址在同一寻址空间中,没有代码空间和数据空间之分。一般430的单片机都统一编址在0-64k地址范围中,只有少数高端
发表于 2019-10-09
MSP430程序库<十五>Flash控制器
MSP430程序库<十>ADC12模块
;   ADC12CTL0 &=~ ENC;                      //停止转换        i=0;    }}该程序实现的是多次A0-A2 32次转换,把结果存入results数组。单次时,仅仅采样一次(A0-A2)可用自己更改处理函数。程序部分就完成了,调用时注意要自己实现处理逻辑或存储逻辑。使用示例: 本程序使用方式还是加入C文件,包含H文件;不过和之前的程序不同的是要自己实现中断处理逻辑。使用示例参见程序库中
发表于 2019-10-09
MSP430程序库<十>ADC12模块
stm32 定时器5输入捕获
;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0复用tim5TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上
发表于 2019-10-09
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved