打印

求一个定时器B的pwm例程

[复制链接]
1001|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanghqi|  楼主 | 2018-10-10 19:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
jiajs| | 2018-10-10 19:39 | 只看该作者

//******************************************************************************
//  MSP430F54x Demo - Timer_B, Toggle P1.0, Overflow ISR, 32kHz ACLK
//
//  Description: Toggle P1.0 using software and the Timer_B overflow ISR.
//  In this example an ISR triggers when TB overflows. Inside the ISR P1.0
//  is toggled. Toggle rate is exactly 0.25Hz = [32kHz/FFFFh]/2. Proper use of the
//  TBIV interrupt vector generator is demonstrated.
//  ACLK = TBCLK = 32kHz, MCLK = SMCLK = default DCO ~ 1.045MHz
//
//           MSP430F5438
//         ---------------
//     /|\|               |
//      | |               |
//      --|RST            |
//        |               |
//        |           P1.0|-->LED
//
//   M Smertneck / W. Goh
//   Texas Instruments Inc.
//   September 2008
//   Built with CCE Version: 3.2.2 and IAR Embedded Workbench Version: 4.11B
//******************************************************************************

#include "msp430x54x.h"

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // Set P1.0 to output direction
  TBCTL = TBSSEL_1 + MC_2 + TBCLR + TBIE;   // ACLK, contmode, clear TBR,
                                            // enable interrupt

  __bis_SR_register(LPM3_bits + GIE);       // Enter LPM3, enable interrupts
  __no_operation();                         // For debugger
}

// Timer_B7 Interrupt Vector (TBIV) handler
#pragma vector=TIMERB1_VECTOR
__interrupt void TIMERB1_ISR(void)
{
  /* Any access, read or write, of the TBIV register automatically resets the
  highest "pending" interrupt flag. */
  switch( __even_in_range(TBIV,14) )
  {
    case  0: break;                          // No interrupt
    case  2: break;                          // CCR1 not used
    case  4: break;                          // CCR2 not used
    case  6: break;                          // CCR3 not used
    case  8: break;                          // CCR4 not used
    case 10: break;                          // CCR5 not used
    case 12: break;                          // CCR6 not used
    case 14: P1OUT ^= 0x01;                  // overflow
            break;
    default: break;
  }
}

使用特权

评论回复
板凳
jiajs| | 2018-10-10 19:44 | 只看该作者
哪个芯片的?一般在ti官网就有现成的程序的。自己修改一下就行的。

使用特权

评论回复
地板
zhanghqi|  楼主 | 2018-10-10 19:48 | 只看该作者

搞定了,呵呵,犯了低级错误……结贴啦,多谢各位

使用特权

评论回复
5
10299823| | 2018-10-15 21:41 | 只看该作者
void main( void )
{
   // Stop watchdog timer to prevent time out reset
   WDTCTL = WDTPW + WDTHOLD;
   FLL_CTL0 |= XCAP14PF;                   // 匹配14pf电容
   __delay_cycles(20000);                    //延时20ms,等待晶振起振稳定

   do
   {
     IFG1 &= ~OFIFG;
     for(unsigned int i=5000;i>0;i--);
   }
   while(IFG1&OFIFG);

   TACTL |= TASSEL_1 + MC_1 + TACLR;
   TACCR0 = 32767;                            //T=1s
   TACCTL1 |= OUTMOD_7;
   TACCR1 = 19661;                           //占空比60%

   P1DIR |= 0x04;
   P1SEL |= 0x04;
   while(1);
}

使用特权

评论回复
6
jimmhu| | 2018-10-15 21:41 | 只看该作者
TB含有CCR0-CCR67个模块

使用特权

评论回复
7
lihuami| | 2018-10-15 21:42 | 只看该作者
PWM翻转/置位模式?

使用特权

评论回复
8
xiaoyaozt| | 2018-10-15 21:42 | 只看该作者
void main()
{
    // Stop watchdog timer to prevent time out reset
    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;
}

使用特权

评论回复
9
uptown| | 2018-10-15 21:43 | 只看该作者
需要哪个芯片的

使用特权

评论回复
10
cehuafan| | 2018-10-15 21:43 | 只看该作者
msp430f5529 pwm源程序

使用特权

评论回复
11
usysm| | 2018-10-15 21:43 | 只看该作者
5529舵机的PWM信号控制的程序吗?

使用特权

评论回复
12
typeof| | 2018-10-15 21:44 | 只看该作者
定时器TA的PWM输出可以吗

使用特权

评论回复
13
yujielun| | 2018-10-15 21:44 | 只看该作者
设定一个变量来选择初始占空比,然后通过Timer_B定时1s,每隔一秒

使用特权

评论回复
14
htmlme| | 2018-10-15 21:45 | 只看该作者
能用定时器A中断定时?

使用特权

评论回复
15
uptown| | 2018-10-15 21:45 | 只看该作者
msp430吗?

使用特权

评论回复
16
10299823| | 2018-10-15 21:45 | 只看该作者
msp430简单pwm程序

使用特权

评论回复
17
lihuami| | 2018-10-15 21:45 | 只看该作者
PWM复位/置位模式?

使用特权

评论回复
18
jimmhu| | 2018-10-15 21:45 | 只看该作者
TB可以输出6路完整的PWM波形。

使用特权

评论回复
19
htmlme| | 2018-10-15 21:45 | 只看该作者
楼主也没有说明具体的要求的

使用特权

评论回复
20
yujielun| | 2018-10-15 21:45 | 只看该作者
void main(void)
{
  
  WDTCTL = WDTPW + WDTHOLD; // Stop WDT
  
   P1DIR |= 0x0C; // P1.2 and P1.3 output
   P1SEL |= 0x0C; // P1.2 and P1.3 TA1/2 options

   Init_TIMER_B();
   
   TACTL = TASSEL_2 + TACLR; // SMCLK, up mode
   
   CCR0 = 512-1; // PWM Period
   CCTL1 = OUTMOD_7 ; // CCR1 reset/set
   CCTL2 = OUTMOD_7 ; //CCR2 reset/set
   if(v==5)
   {
     CCR1 = 128; // CCR1 PWM duty cycle
     CCR2 = 384; // CCR2 PWM duty cycle
   }
   else if (v==12)
   {
     CCR1 = 384; // CCR1 PWM duty cycle
     CCR2 = 128; // CCR2 PWM duty cycle
   }
   else
   {
     CCR1 = 128; // CCR1 PWM duty cycle
     CCR2 = 384; // CCR2 PWM duty cycle
   }
   
   TACTL |= MC_1;      // Start Timer_A in up mode
   TBCTL |= MC_1;      // Start Timer_B in up mode
  
   _EINT();         //开全局中断
   _BIS_SR(LPM0_bits); // Enter LPM0
   
}




void  Init_TIMER_B()
{
    TBCTL |= TBSSEL0 +TBCLR; //ACLK
    TBCCTL0 = CCIE;
    TBCCR0 =32768;  //定时1s  
}





// Timer B0 interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
if(CCR1 >511)
   CCR1 = 64;
else CCR1 += 32;      // 调整占空比

if(CCR2 < 10)
   CCR2 = 448;
else  CCR2 -= 32;                        
   
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

852

主题

11757

帖子

5

粉丝