中断出来的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);
// }
此帖出自
小平头技术问答
一周热门 更多>