MSP程序库十一定时器TA的PWM输出.docx

上传人:b****2 文档编号:18058696 上传时间:2023-08-07 格式:DOCX 页数:26 大小:157.78KB
下载 相关 举报
MSP程序库十一定时器TA的PWM输出.docx_第1页
第1页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第2页
第2页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第3页
第3页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第4页
第4页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第5页
第5页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第6页
第6页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第7页
第7页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第8页
第8页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第9页
第9页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第10页
第10页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第11页
第11页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第12页
第12页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第13页
第13页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第14页
第14页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第15页
第15页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第16页
第16页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第17页
第17页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第18页
第18页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第19页
第19页 / 共26页
MSP程序库十一定时器TA的PWM输出.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MSP程序库十一定时器TA的PWM输出.docx

《MSP程序库十一定时器TA的PWM输出.docx》由会员分享,可在线阅读,更多相关《MSP程序库十一定时器TA的PWM输出.docx(26页珍藏版)》请在冰点文库上搜索。

MSP程序库十一定时器TA的PWM输出.docx

MSP程序库十一定时器TA的PWM输出

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

 

定时器是单片机常用的其本设备,用来产生精确计时或是其他功能;msp430的定时器不仅可以完成精确定时,还能产生PWM波形输出,和捕获时刻值(上升沿或是下降沿到来的时候)。

这里完成一个比较通用的PWM波形产生程序。

1.硬件介绍:

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时置位,并保持置位到定时器复位或选择另一种输出模式为止。

 

输出模式2PWM翻转/复位模式:

输出在TAR的值等于CCRx时翻转,当TAR的值等于CCR0时复位。

 

输出模式3PWM置位/复位模式:

输出在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位寄存器,所以该模式适用于定时周期小于65536的连续计数情况。

计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。

连续计数模式 

在需要65536个时钟周期的定时应用场合常用连续计数模式。

定时器从当前值计数到0FFFFH后,又从0开始重新计数

增/减计数模式 

需要对称波形的情况经常可以使用增/减计数模式,该模式下,定时器先增计数到CCR0的值,然后反向减计数到0。

计数周期仍由CCR0定义,它是CCR0计数器数值的2倍。

TA定时器有比较、捕获两种工作方式;比较可以产生PWM波形等,捕获可以精确的测量时间;这里用的是比较输出。

硬件介绍就这么多了,其他的可以参考msp430x1xx_family_users_guide(用户指南)。

2.程序实现:

本程序是直接从msp430f42x移植的,只改动了端口就能正常使用了。

由此,430的模块在不同的系列中是通用的,有关寄存器是一样的;只是也许外部端口不太一样。

程序初始化部分:

完成TA相关寄存器的初始化。

charTAPwmInit(charClk,charDiv,charMode1,charMode2)

{

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)//选择分频系数

{

case1:

TACTL|=ID_0;break;//1

case2:

TACTL|=ID_1;break;//2

case4:

TACTL|=ID_2;break;//4

case8:

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':

case0:

//如果设置为禁用

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':

case0:

//如果设置为禁用

P1SEL&=~BIT3;//P1.3恢复为普通IO口

break;

default:

return(0);//参数有误

}

return

(1);

}

 

 

 

 

主要是设置TACTL寄存器,让TA工作于增模式,设置时钟源和分频;CCTLx设置对应的输出模式;并且打开相应端口的第二功能。

设置周期函数:

设置PWM波形的周期,单位是多少个TACLK周期。

voidTAPwmSetPeriod(unsignedintPeriod)

{

TACCR0=Period;

}

工作于增模式时,TA计数到TACCR0,设CCR0就完成了周期的设置。

设置占空比:

设置TA的PWM输出的有效电平的时间。

voidTAPwmSetDuty(charChannel,unsignedintDuty)

{

switch(Channel)

{

case1:

TACCR1=Duty;break;

case2:

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%

*/

voidTAPwmSetPermill(charChannel,unsignedintPercent)

{

unsignedlongintPeriod;

unsignedintDuty;

Period=TACCR0;

Duty=Period*Percent/1000;

TAPwmSetDuty(Channel,Duty);

}

这个函数用千分比来设置PWM输出的有效时间。

方便程序的使用。

有关定时器,TI提供的大量的例程,这些历程都很简洁、清晰。

需要其他功能可以自己根据例程编写对应的程序。

程序实现就这么多了,下面说下本程序的使用方法。

3.使用示例:

使用方式:

依然是在工程中加入c文件;文件包含h头文件;然后就可以正常使用本函数了。

详细参考示例工程和main.c。

main主要程序如下:

#include"msp430x16x.h"//430寄存器头文件

#include"TAPwm.h"//TAPWM输出程序库头文件

voidmain()

{

//Stopwatchdogtimertopreventtimeoutreset

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的波形输出程序。

有什么不足之处,欢迎评论,讨论。

电设工作小结之——MSP430G2553学习笔记——1

 

(2012-08-1822:

00:

24)

转载▼

标签:

 

电设

 

msp430学

 

设计

分类:

 学习探讨

把这几天的工作做一个小结:

第一版

MSP430G2553学习笔记

 

  Created on:

 2012-8-18

      Author:

 zhang bin

 

学习笔记

for msp430g2553

redesigned by zhangbin

2012-08-18

versions:

12_08_01

 

 

 

 

 

 

 

一,MSP430G2553单片机的各个功能模块

  

(一),IO口模块,

  1,我们所用的MSP430G2553有两组IO口,P1和P2。

  2,IO口的寄存器有:

方向选择寄存器PxDIR,输出寄存器PxOUT,输入寄存器PxIN,IO口内部上拉或下拉电阻使能寄存器PxREN, IO口功能选择寄存器PxSEL和PxSEL2,IO口中断使能寄存器PxIE,中断沿选择寄存器PxIES,IO口中断标志寄存器PxIFG。

  3,所有的IO都带有中断,其中所有的P1口公用一个中断向量,所有的P2口公用一个中断向量。

所以在使用中断时,当进入中断后,还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。

   4,中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。

注意:

在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。

程序如下:

void IO_interrupt_init()     //IO中断初始化函数

{

  P1REN |= BIT4+BIT5+BIT6+BIT7;     // pullup 内部上拉电阻使能

  //使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断

  P1OUT = BIT4+BIT5+BIT6+BIT7;   // 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来

          //0:

下拉,1:

上拉

 

  P1IE |= BIT4+BIT5+BIT6+BIT7;       // interrupt enabled P13中断使能

  P1IES |= BIT4+BIT5+BIT6+BIT7;          // Hi/lo edge  下降沿中断

  //P1IES &= ~BIT3;                         //上升沿触发中断

  P1IFG &= ~(BIT4+BIT5+BIT6+BIT7);         //中断标志位清零

 

}

 

5,PxOUT:

如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:

下拉,1:

上拉

6,当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。

所以不用的IO口可以设为输出状态,或设为输入状态但通过外围电路接至VCC或GND,或接一个上拉/下拉电阻。

7,当使用msp430g2553的IO口时要注意,因为g2553的IO口寄存器的操作,不像51,它不能单独针对某一位进行操作,必须对整个寄存器进行操作。

所以就不像51,g2553不可以定义bit型的数据。

所以在使用msp的IO口时要注意对需要位的操作,而不要影响其他无关的位,可以 用 |  &  ^等按位操作的符号。

在使用IO都控制其他外围模块时也要注意要使用的IO口的定义,可以用如下的定义方法:

#define CLR_RS P2OUT&=~BIT0;    //RS = P2.0

#define SET_RS P2OUT|=BIT0;

#define CLR_RW P2OUT&=~BIT1; //RW = P2.1

#define SET_RW P2OUT|=BIT1;

#define CLR_EN P2OUT&=~BIT2; //EN = P2.2

#define SET_EN P2OUT|=BIT2;

 

#define DataPort    P1OUT

 

8,g2553的P27和P26脚分别接外部晶体的输出和输入脚XOUT和XIN,默认是自动设为了晶振管脚功能,但是当想把它们用为普通的IO时,也可以,设置对应的SEL设为普通的IO即可,如下:

P2DIR |= BIT6+BIT7;    //把P26和P27配置为普通IO 并为输出脚  默认为晶振的输入和输出引脚 作为dac0832的

    P2SEL &= ~(BIT6+BIT7);   //cs和wr控制端

    P2SEL2 &= ~(BIT6+BIT7);

 

 

 

(二),时钟系统

     1,msp430能做到超低功耗,合理的时钟模块是功不可没的。

但是功能强大的时钟模块设置起来也相对复杂一些。

     2,msp430的时钟源有:

(1),外接低频晶振LFXT1CLK:

低频模式接手表晶体32768Hz,高频模式450KHz~8MHz;

(2),外接高速晶振XT2CLK:

8MHz;

(3),内部数字控制振荡器DCO:

是一个可控的RC振荡器,频率在0~16MHz;

(4),超低功耗低频振荡器VLO:

不可控,4~20KHz 典型值为12KHz;

     3,时钟模块:

430的时钟模块有MCLK  SMCLK  ACLK :

(1),主系统时钟MCLK:

提供给MSP430的CPU时钟。

可以来自LFXT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。

(2),子系统时钟SMCLK:

 提供给高速外设。

可以来自LFXT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。

(3),辅助系统时钟ACLK:

提供给低速外设。

可来自LFXT1CLK  VLO。

 

     4,内部的振荡器DCO和VLO提供的时钟频率不是很精确,随外部环境变化较大。

DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。

DCO可以用CCS提供的宏定义进行相对比较精确的设置,如下:

DCOCTL = CALDCO_12MHZ;   //DCO设为12MHz   这种方法设DCO频率比较精确,实际测得为12.08MHz左右 正弦波

BCSCTL1 = CALBC1_12MHZ;

用这种方法可以设置1,8,12,16MHz

宏定义如下:

#ifndef __DisableCalData

 

SFR_8BIT(CALDCO_16MHZ);                       

SFR_8BIT(CALBC1_16MHZ);                       

SFR_8BIT(CALDCO_12MHZ);                       

SFR_8BIT(CALBC1_12MHZ);                       

SFR_8BIT(CALDCO_8MHZ);                        

SFR_8BIT(CALBC1_8MHZ);                        

SFR_8BIT(CALDCO_1MHZ);                        

SFR_8BIT(CALBC1_1MHZ);                        

 

#endif 

 

5,使用超低功耗低频振荡器VLO可以很大程度地降低系统功耗,下面的例子是设置ACLK为VLO,MCLK为VLO的8分频:

#include  

 

//1延时

//#define CPU_F ((double)16000000)//cpu frequency16000000

#define CPU_F ((double)1630)//cpu frequency1630   //CPU的实际MCLK大约为13.05/8=1.63KHz

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))

#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

 

 

void main(void)

{

  volatile unsigned int i;                  // Volatile to prevent removal

  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

 

  BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO  低频时钟选择为VLO ACLK选为VLO

 

  IFG1 &= ~OFIFG;                           // Clear OSCFault flag  清除振荡器错误中断标志

 

  __bis_SR_register(SCG1 + SCG0);           // Stop DCO  SCG1禁止SMCLK  SCG0禁止DCO

 

  BCSCTL2 |= SELM_3 + DIVM_3;               // MCLK = LFXT1/8

  //因为前面已经选择了LFXT1 = VLO 所以MCLK选为VLO  8分频  所以CPU的MCLK大约为1.5KHz

 

  P1DIR = 0xFF;                             // All P1.x outputs

  P1OUT = 0;                                // All P1.x reset

  P2DIR = 0xFF;                             // All P2.x outputs

  P2OUT = 0;                                // All P2.x reset

 

  P1SEL |= BIT0+BIT4;                // P10 P14options  功能选择为外围模块

  //p10输出ACLK,来自VLO,p14输出SMCLK,  因为禁止了SMCLK,所以P14脚无波形输出

  //VLO典型值为12KHz  实际用示波器测得为:

13.05KHz 左右波动

  //所以CPU的实际MCLK大约为13.05/8=1.63KHz

 

 

  for (;;)

  {

    P1OUT ^= BIT6;          // P1.6 闪烁

    delay_ms(1000);

  }

}

 

  6,如上面的程序所示,其中的延迟函数用那种方法,使用系统的延迟周期函数__delay_cycles(int n); 可以达到比较精确的延迟,如下:

 

//more_

//1延时

//#define CPU_F ((double)16000000)//cpu frequency16000000

#define CPU_F ((double)12000000)//cpu frequency12000000

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))

#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

//2空函数

#define nop() _NOP();

 

   7,系统上电后默认使用的是DCO时钟,DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。

 

 

 

 (三),定时器Timer_A

   1,MSP430g2553具有两个16位的定时器:

Timer0_A   Timer1_A。

分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。

可以产生定时中断,也可以产生PW

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2