📄 ta_pwm.c
字号:
/*
MSP430F全系列单片机TA定时器PWM发生器程序库
说明:该驱动程序库利用定时器TA产生2路PWM调制脉冲,可用于功率、速度的
控制。该库包含了PWM发生器初始化、频率设置、占空比设置等常用的功
能函数。可以作为各种程序的底层驱动使用。
要使用该库函数,需要将本文件(TA_PWM.c)添加进工程,并在需要
调用ADC函数的文件开头处包含"TA_PWM.h"
(C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/19
*/
// MSP430FE425
// -----------------
// | XIN|-
// | | 32kHz
// | XOUT|-
// | |
// | P1.2/TA1|------------------------->
// | (CCR1) | _ _ _ _
// | | _| |__| |__| |__| |_
// | | 0%~100% PWM
// | |
// | |
// | P2.0/TA2|------------------------->
// | (CCR2) | _ _ _ _
// | | _| |__| |__| |__| |_
// | | 0%~100% PWM
#include "msp430X42X.h"
/****************************************************************************
* 名 称:TA_PWM_Init()
* 功 能:TA定时器作为PWM发生器的初始化设置函数
* 入口参数:Clk:时钟源 'S'=SMCLK; 'A'=ACLK ; _____
'E'=TACLK(外部输入) 'e'= TACLK(TACLK取反)
Div:时钟分频系数: 1/2/4/8
Mode1:通道1的输出模式 'P'设为高电平输出,'N'低电平 ,0=禁用
Mode2:通道2的输出模式 'P'设为高电平输出,'N'低电平 ,0=禁用
* 出口参数:1表示设置成功,0表示参数错误,设置失败。
* 说 明: 在调用PWM相关函数之前,需要调用该函数设置TA的模式和时钟源。
* 范 例: TA_PWM_Init('A',1,'P','P')TA时钟设为ACLK,通道1和通道2均为高电平输出
TA_PWM_Init('S',4,'N','N')TA时钟设为SMCLK/4, 通道1、2均为低电平输出
TA_PWM_Init('A',1,'P',0)TA时钟设为ACLK,通道1高电平输出,通道2不用,被
禁用的PWM通道的输出管脚仍可作为普通IO口使用。
****************************************************************************/
char TA_PWM_Init(char Clk,char Div,char Mode1,char Mode2)
{
TACTL =0;// 清除以前设置
TACTL|=MC_1; //定时器TA设为增量计数模式
switch(Clk) //为定时器TA选择时钟源
{
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); //设置参数有误,返回0
}
switch(Div) //为定时器TA选择分频系数
{
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); //设置参数有误,返回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); //设置参数有误,返回0
}
switch(Mode2) //设置PWM通道1的输出模式。
{
case 'P':case 'p': //如果设置为高电平模式
TACCTL2 =OUTMOD_7; //高电平PWM输出
P2SEL |= BIT0; //从P2.0输出 (不同型号单片机可能不一样)
P2DIR |= BIT0; //从P2.0输出 (不同型号单片机可能不一样)
break;
case 'N':case 'n': //如果设置为低电平模式
TACCTL2 =OUTMOD_3; //低电平PWM输出
P2SEL |= BIT0; //从P2.0输出 (不同型号单片机可能不一样)
P2DIR |= BIT0; //从P2.0输出 (不同型号单片机可能不一样)
break;
case '0':case 0: //如果设置为禁用
P2SEL &= ~BIT0; //P2.0恢复为普通IO口
break;
default : return(0); //设置参数有误,返回0
}
return(1);
}
/****************************************************************************
* 名 称:TA_PWM_SetPeriod()
* 功 能:设置PWM发生器的周期
* 入口参数:Period:周期(0~65535) 时钟个数
* 出口参数:无
* 说 明: 设置对2路PWM同时生效
* 范 例: TA_PWM_SetPeriod(500)设置PWM方波周期为500个时钟周期
****************************************************************************/
void TA_PWM_SetPeriod(unsigned int Period)
{
TACCR0=Period;
}
/****************************************************************************
* 名 称:TA_PWM_SetDuty()
* 功 能:设置PWM输出"有效"的时间
* 入口参数:Channel: 当前设置的通道号 1/2
Duty: PWM有效时间(0~65535) 时钟个数
* 出口参数:无
* 说 明: 若通道输出模式设为高电平输出模式,Duty值等于高电平时钟个数
若通道输出模式设为低电平输出模式,Duty值等于低电平时钟个数
* 范 例: TA_PWM_SetDuty(1,30)设置PWM通道1方波的高电平周期为30个时钟
TA_PWM_SetDuty(2,80)设置PWM通道2方波的高电平周期为80个时钟
****************************************************************************/
void TA_PWM_SetDuty(char Channel,unsigned int Duty)
{
switch(Channel)
{
case 1: TACCR1=Duty; break;
case 2: TACCR2=Duty; break;
}
}
/****************************************************************************
* 名 称:TA_PWM_SetPermill()
* 功 能:设置PWM输出的占空比(千分比)
* 入口参数:Channel: 当前设置的通道号 1/2
Percent: PWM有效时间的千分比 (0~1000)
* 出口参数:无
* 说 明: 1000=100.0% 500=50.0% ,依次类推
* 范 例: TA_PWM_SetPermill(1,300)设置PWM通道1方波的占空比为30.0%
TA_PWM_SetPermill(2,825)设置PWM通道2方波的占空比为82.5%
****************************************************************************/
void TA_PWM_SetPermill(char Channel,unsigned int Percent)
{
unsigned long int Period;
unsigned int Duty;
Period=TACCR0;
Duty=Period*Percent/1000;
TA_PWM_SetDuty(Channel,Duty);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -