471|2

1907

帖子

0

资源

一粒金砂(高级)

MSP430G2553之timerA产生PWM [复制链接]

总结:选SMCLK(可以测出来)
         若选ACLK,经示波器PWM时有时无

举例一:

#include <MSP430G2553.h>

 #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))

//功能:TA0.1输出PWM
//说明:TA0.1由P1.2 p1.6输出
void timerA0_1_init()
{
  TACTL |= TASSEL_2 + MC_1; //选SMCLK(可以测出来),增计数
                            //若选ACLK,经示波器PWM时有时无
  CCTL1 = OUTMOD_7; //输出模式为复位/置位
  CCR0 = 1115000/1000; //SMCLK时钟频率为1.115MHZ,PWM(频率):1.115MHZ/CCR0
  CCR1 = (1115000/1000) * 30/100; //占空比:CCR1/CCR0 ;
}

//功能:TA1.1输出PWM
//说明:TA1.1由P2.1 P2.2输出;
//TA1.1与TA1.2共用TA1CCR0,TA1CTL
void timerA1_1_init()
{
  TA1CCTL1 = OUTMOD_7;
  TA1CCR1 = (1115000/200) * 10/100; ; //占空比:TACCR1/TACCR0
}

//功能:TA1.2输出PWM
//说明:TA1.2由P2.4 P2.5输出
void timerA1_2_init()
{
  TA1CTL |= TASSEL_2 + MC_1;  //选SMCLK,增计数
                            //若选ACLK,经示波器PWM时有时无
  TA1CCTL2 = OUTMOD_7;  //输出模式为复位/置位
  TA1CCR0 = 1115000/200;  ///SMCLK时钟频率为1.115MHZ,PWM(频率):1.115MHZ/CCR0
  TA1CCR2 = (1115000/200) * 60/100; //占空比: CCR2/CCR0
}

void port_init()
{
  P1SEL |= BIT2 + BIT6;
  P1DIR |= BIT2 + BIT6;
  //P1.2/6 设为输出TA0.1  
 
  P2SEL |= BIT1 + BIT2;
  P2DIR |= BIT1 + BIT2;
  //P2.1/2设为输出TA1.1
 
  P2SEL |= BIT4 + BIT5;
  P2DIR |= BIT4 + BIT5;
  //P2.4/5 设为输出TA1.2
    
}

void main()
{
  WDTCTL = WDTPW + WDTHOLD;
 
  port_init();

  timerA0_1_init();
  timerA1_2_init();
  timerA1_1_init();
  _BIS_SR(CPUOFF); // Enter LPM0  进入低功耗模式0 SMCLK ON,ACLK ON
  //while(1);
}

 

举例2:

  #include <MSP430G2553.h>

  void set_timerA(void) {
          P2DIR |= 0x12;                    // P2.1 and P2.4 output
          P2SEL |= 0x12;                    // P2.1 and P2.4 TA1 options
          TA1CCR0 = 1000000/1000-1;            // PWM Period
          TA1CCTL1 = OUTMOD_7;              // CCR1 reset/set
          TA1CCTL2 = OUTMOD_7;                              

   TA1CCR1 =(1115000/1000)*80/100;
          TA1CCR2 = (1115000/1000)*20/100;
          TA1CTL = TASSEL_2 + MC_1;                // SMCLK, up mode
//        CCTL0 = CCIE;                       // CCR0 interrupt enabled
}

//参数说明:duty是占空比,50是代表百分之50,范围1-100
void pwm_sinit(unsigned char duty)
{
  TACTL = TASSEL_2 + MC_1;
  CCR0 = 1115000/500;   //通过示波器观察此时SMLK=1115000
  CCTL1 = OUTMOD_7;         
  CCR1 = (1115000*duty)/(100*500);
  P1DIR |= 0x44;              //P1.2/6 output
  P1SEL |= 0x44;     //通过特殊功能口输出
  
}
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
Set_TimerA();
pwm_sinit(50);
while(1);
}


回复

15

帖子

12

资源

一粒金砂(初级)

不错不错。代码和硬件图,是最有用的知识帖子了。


回复

3140

帖子

0

资源

纯净的硅(高级)

谢谢分享。


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表