⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ta_pwm.c

📁 MSP430FE425的16位低功耗单片机的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 + -