|
#include
//########################################################################
#define PWM_A_ON {P2DIR|=BIT1;P2DIR&=~(BIT2+BIT4);P2SEL|=BIT1;P2SEL&=~(BIT2+BIT4);} //A+输出PWM信号
#define PWM_B_ON {P2DIR|=BIT2;P2DIR&=~(BIT1+BIT4);P2SEL|=BIT2;P2SEL&=~(BIT1+BIT4);} //B+输出PWM信号
#define PWM_C_ON {P2DIR|=BIT4;P2DIR&=~(BIT1+BIT2);P2SEL|=BIT4;P2SEL&=~(BIT1+BIT2);} //C+输出PWM信号
#define PWM_OFF {P2DIR&=~(BIT1+BIT2+BIT4);P2SEL&=~(BIT1+BIT2+BIT4);TA1CCR0=0;TA1CCR1=0;TA1CCR2=0} //关闭PWM输出
#define STEUER_A_H {PWM_A_ON}
#define STEUER_B_H {PWM_B_ON}
#define STEUER_C_H {PWM_C_ON}
#define STEUER_A_L {P2DIR|=BIT0+BIT3+BIT5;P2OUT|=BIT0;P2OUT&=~(BIT3+BIT5);} //打开NA-场效应管
#define STEUER_B_L P2DIR|=BIT0+BIT3+BIT5;P2OUT|=BIT3;P2OUT&=~(BIT0+BIT5);} //打开NB-场效应管
#define STEUER_C_L {P2DIR|=BIT0+BIT3+BIT5;P2OUT|=BIT5;P2OUT&=~(BIT0+BIT3);} //打开NA-场效应管
#define STEUER_OFF {P2DIR&=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5);PWM_OFF;}
#define FETS_OFF {P2DIR&=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5);P2OUT&=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5);}
#define HIGH_A_EIN {P2DIR|=BIT1;P2OUT|=BIT1;}
#define HIGH_B_EIN {P2DIR|=BIT2;P2OUT|=BIT2;}
#define HIGH_C_EIN {P2DIR|=BIT4;P2OUT|=BIT4;}
#define LOW_A_EIN {P2DIR|=BIT0;P2OUT|=BIT0;}
#define LOW_B_EIN {P2DIR|=BIT3;P2OUT|=BIT3;}
#define LOW_C_EIN {P2DIR|=BIT5;P2OUT|=BIT5;}
#define SENSE_A {CACTL1|=CAEX;CACTL2 = P2CA0+P2CA2+P2CA3; } //NULL_A连接CA-
#define SENSE_B {CACTL1|=CAEX;CACTL2 = P2CA4+P2CA2+P2CA3; } //NULL_B连接CA-
#define SENSE_C {CACTL1|=CAEX;CACTL2 = P2CA0+P2CA4+P2CA2+P2CA3; } //NULL_C连接CA-
#define SENSE ((CACTL1&CAIFG))
#define SENSE_L (!(CACTL2&CAOUT)) //MITTEL电压低于NULL_X时表达式为真
#define SENSE_H ((CACTL2&CAOUT)) //MITTEL电压 高于NULL_X时表达式为真
#define ENABLE_SENSE_INT {CACTL1 |= CARSEL+CAON+CAIE;} //打开并使能CA中断
#define DISABLE_SENSE_INT {CACTL1 &= ~(CARSEL+CAON+CAIE);} //关闭并禁用CA中断
#define SENSE_FALLING_INT ((CACTL1|=CAIES)) //设置CA下降沿中断
#define SENSE_RAISING_INT ((CACTL1&=~CAIES)) //设置CA上升沿中断
void Manuell(void);
void TA0_Init();
unsigned int SetDelay(unsigned int t);
char CheckDelay(unsigned int t);
void Delay_ms(unsigned int w);
//########################################################################
unsigned char Phase=0;
volatile unsigned int CountMilliseconds=0;
void main()
{
WDTCTL=WDTPW+WDTHOLD;
TA0_Init();
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
BCSCTL3|=LFXT1S_2;
DISABLE_SENSE_INT;
TA1CTL = TASSEL_1 +TACLR+MC_1;
TA1CCR0 =12000;
TA1CCR1=5000;
TA1CCTL1=OUTMOD_7;
TA1CCR2=5000;
TA1CCTL2=OUTMOD_7;
while(1)
{
Delay_ms(500);
Manuell();
Phase++;
Phase%=6;
}
}
//########################################################################
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0()
{
CountMilliseconds++;
}
//########################################################################
//
unsigned int SetDelay(unsigned int t)
{
return(CountMilliseconds+t-1);
}
#pragma vector=COMPARATORA_VECTOR
__interrupt void COMPARATORA()
//########################################################################
{
unsigned char sense=0;
do
{
if(SENSE_H)
sense=1;
else
sense=0;
switch(Phase)
{
case 0:
STEUER_A_H;
if(sense)
{
STEUER_C_L;
SENSE_FALLING_INT;
SENSE_B;
Phase++;
}
else
STEUER_B_L;
break;
case 1:
STEUER_C_L;
if(!sense)
{
STEUER_B_H;
SENSE_A;
SENSE_RAISING_INT;
Phase++;
}
else
STEUER_A_H;
break;
case 2:
STEUER_B_H;
if(sense)
{
STEUER_A_L;
SENSE_FALLING_INT;
SENSE_C;
Phase++;
}
else
STEUER_C_L;
break;
case 3:
STEUER_A_L;
if(!sense)
{
STEUER_C_H;
SENSE_RAISING_INT;
SENSE_B;
Phase++;
}
else
STEUER_B_H;
break;
case 4:
STEUER_C_H;
if(sense)
{
STEUER_B_L;
SENSE_FALLING_INT;
SENSE_A;
Phase++;
}
else
STEUER_A_L;
break;
case 5:
STEUER_B_L;
if(!sense)
{
STEUER_A_H;
SENSE_RAISING_INT;
SENSE_C;
Phase=0;
}
else
STEUER_C_H;
break;
}
}
while((SENSE_L&&sense)||(SENSE_H&&!sense));
}
//########################################################################
//
void Manuell(void)
//########################################################################
{
switch(Phase)
{
case 0:
STEUER_A_H;
STEUER_B_L;
SENSE_C;
SENSE_RAISING_INT;
break;
case 1:
STEUER_A_H;
STEUER_C_L;
SENSE_B;
SENSE_FALLING_INT;
break;
case 2:
STEUER_B_H;
STEUER_C_L;
SENSE_A;
SENSE_RAISING_INT;
break;
case 3:
STEUER_B_H;
STEUER_A_L;
SENSE_C;
SENSE_FALLING_INT;
break;
case 4:
STEUER_C_H;
STEUER_A_L;
SENSE_B;
SENSE_RAISING_INT;
break;
case 5:
STEUER_C_H;
STEUER_B_L;
SENSE_A;
SENSE_FALLING_INT;
break;
}
}
//########################################################################
//
void TA0_Init()
//########################################################################
{
TACTL=TASSEL_2+MC_1;
CCTL0 = CCIE;
CCR0=1000;
_BIS_SR(GIE);
}
//########################################################################
//
//########################################################################
char CheckDelay(unsigned int t)
{
return(((t-CountMilliseconds)&0x8000)>>8);
}
//########################################################################
//
//########################################################################
void Delay_ms(unsigned int w)
{
unsigned int akt;
akt=SetDelay(w);
while(!CheckDelay(akt));
}
//########################################################################
为什么会出现如图所示的问题???
|
|