查看: 634|回复: 0

MSP430G2553之timerA产生PWM

[复制链接]

该用户从未签到

发表于 2020-11-18 17:28:53 | 显示全部楼层 |阅读模式
分享到:

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

举例一:

  1. #include <MSP430G2553.h>

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

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

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

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

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

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

  33. void port_init()
  34. {
  35.   P1SEL |= BIT2 + BIT6;
  36.   P1DIR |= BIT2 + BIT6;
  37.   //P1.2/6 设为输出TA0.1  

  38.   P2SEL |= BIT1 + BIT2;
  39.   P2DIR |= BIT1 + BIT2;
  40.   //P2.1/2设为输出TA1.1

  41.   P2SEL |= BIT4 + BIT5;
  42.   P2DIR |= BIT4 + BIT5;
  43.   //P2.4/5 设为输出TA1.2
  44.    
  45. }

  46. void main()
  47. {
  48.   WDTCTL = WDTPW + WDTHOLD;

  49.   port_init();

  50.   timerA0_1_init();
  51.   timerA1_2_init();
  52.   timerA1_1_init();
  53.   _BIS_SR(CPUOFF); // Enter LPM0  进入低功耗模式0 SMCLK ON,ACLK ON
  54.   //while(1);
  55. }
复制代码

举例2:

  1. #include <MSP430G2553.h>

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

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

  13. //参数说明:duty是占空比,50是代表百分之50,范围1-100
  14. void pwm_sinit(unsigned char duty)
  15. {
  16.   TACTL = TASSEL_2 + MC_1;
  17.   CCR0 = 1115000/500;   //通过示波器观察此时SMLK=1115000
  18.   CCTL1 = OUTMOD_7;         
  19.   CCR1 = (1115000*duty)/(100*500);
  20.   P1DIR |= 0x44;              //P1.2/6 output
  21.   P1SEL |= 0x44;     //通过特殊功能口输出
  22.   
  23. }
  24. int main( void )
  25. {
  26.   // Stop watchdog timer to prevent time out reset
  27.   WDTCTL = WDTPW + WDTHOLD;
  28. Set_TimerA();
  29. pwm_sinit(50);
  30. while(1);
  31. }
复制代码


回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /5 下一条



手机版|小黑屋|与非网

GMT+8, 2024-12-24 09:12 , Processed in 0.105012 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.