中断出来的PWM怎么没有时间差啊 祈求各位大神帮助 #include <msp430x14x.h> #include <math.h> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define keyin (P1IN & 0x0F) 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) { //uchar temp=0; //ulong PWM_T=50000; //static unsigned long PWM_T=65535;//20000; WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 Init_Clock(); P6DIR|= BIT2;P6OUT|= BIT2;//关闭电平转换 P1DIR= BIT7; //设置P1.0~P.3为输入状态,P.7为输出 P1OUT=0; P3DIR|= BIT4; //设置P3.4为输出状态 P3OUT|= BIT4; //P3.4输出1 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 // TBCCTL3=OUTMOD_2; // CCR1 reset/set模式 // TBCCR3=(PWM_T/2); TACCR0=5000;//5ms,12500-1;//12.5ms TACCTL0=CCIE; TACCR1=2500; TACCTL1=CCIE; TACTL|=TASSEL_2+ID_3+MC_1+TAIE; //ACLK 1/8 UPMODE } #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A0(void) { switch( TAIV ) { case 2:{
TBCCTL3=OUTMOD_2; // CCR1 reset/set模式 TBCCR3=(PWM_T/2); }break; // CCR1 case 4: break; // CCR2 not used case 10:{ TBCCTL1=OUTMOD_2; // CCR1 reset/set模式 TBCCR1=(PWM_T/2); CCTL0 |= 0; TACTL=0; _DINT(); } break; // overflow not used } } //#pragma vector=TIMERA1_VECTOR //__interrupt void Timer_A0(void) //{ //// TBCTL = TBSSEL_2+MC_1+ID_3; //// TBCCR0=PWM_T; //// TBCCTL1=OUTMOD_2; // CCR1 reset/set模式 //// TBCCR1=(PWM_T/2); // CCTL0 |= 0; // TACTL=0; // _DINT(); // //} //#pragma vector=TIMERA1_VECTOR //__interrupt void Timer_A1(void) //{ //TBCTL = TBSSEL_2+MC_1+ID_3; //TBCCR0=PWM_T; //TBCCTL3=OUTMOD_2; // CCR1 reset/set模式 //TBCCR3=(PWM_T/2); // }
|