[求助] 需要前辈们 指点一下 定时器的问题

t_shaojun126   2012-7-8 09:07 楼主
我这个程序是产生4路PWM其中2路和另2路相差90度 
我用示波器 显示出来的频率 不是我设置的50HZ  非常慢  是怎么回事啊 求指点啊
#include <msp430x14x.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char  
#define ulong  unsigned long

extern unsigned long PWM_T=20000;//20000;static
void delay(void);
void Init_Clock(void)       
{
  int i=0;
  BCSCTL1&=~XT2OFF;                       // XT2on
  do
  {
    IFG1&=~OFIFG;                           // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);               // Time for flag to set
  }
  while ((IFG1 & OFIFG));                   // OSCFault flag still set?
  BCSCTL2 |= SELM_2 + SELS;                 // MCLK = SMCLK = XT2 (safe)
  _EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句

void main(void)

  
  
  WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
  Init_Clock();
 
  P4SEL|= BIT1+BIT2+BIT3+BIT4;         // P1.2 TA1模式P1.3 TA2模式
  P4DIR|= BIT1+BIT2+BIT3+BIT4;         // P1.2 P1.3输出
  TBCTL = TBSSEL_2+MC_1+ID_3;         // SMCLK, 清零Tar,增减模式启动Timer_B,1/8分频
  TBCCR0=PWM_T;                        // PWM 周期 10MS(100HZ)CCR0初值10000-50MS(20HZ)CCR0初值50000
  CCTL0 = CCIE; 
  CCR0=5000;//5ms,12500-1;//12.5ms
  TACTL|=TASSEL_2+ID_3+MC_1+TAIE;  //ACLK 1/8 UPMODE
  
     
  TBCCTL1=OUTMOD_2;                      // CCR1 resett模式
  TBCCR1=(PWM_T/2);//;(2*PWM_T/3);                    // CCR1 PWM 任务周期
  TBCCTL2=OUTMOD_6;                      // CCR1 resett模式
  TBCCR2=(PWM_T/2);//;(1*PWM_T/3); 
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  TBCTL = TBSSEL_1+MC_3+ID_3;
  TBCCR0=PWM_T;
  TBCCTL3=OUTMOD_6;                      // CCR1 resett模式
  TBCCR3=(1*PWM_T/3);                    // CCR1 PWM 任务周期
  TBCCTL4=OUTMOD_2;                      // CCR1 resett模式
  TBCCR4=(2*PWM_T/3);   
  P3OUT ^= BIT4;                            // Toggle P3.4 using exclusive-OR
  CCTL0 |= 0;
//  TACTL=(TAIE&0)+MC_0;
   TACTL=0;
    _DINT();
 } 
/*******************************************
函数名称:delay
功    能:用于消抖的延时
参    数:无
返回值  :无
********************************************/
void delay(void)
{
  uint tmp;
  
  for(tmp = 12000;tmp > 0;tmp--);
}

回复评论 (1)

 
点赞  2012-7-9 13:57
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复