|
电路如下图所示(部分线路未接)
#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 Delay_us(unsigned int z);
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;
unsigned int i;
unsigned int timer=300;
TA0_Init();
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
BCSCTL3|=LFXT1S_2;
DISABLE_SENSE_INT;
TA1CTL = TASSEL_1 +TACLR+MC_1;
TA1CCR0 =255;
TA1CCR1=200;
TA1CCTL1=OUTMOD_7;
TA1CCR2=200;
TA1CCTL2=OUTMOD_7;
Manuell();
Delay_ms(200);
while(timer>25)
{
for(i=0;i
Delay_us(25);
Manuell();
Phase++;
Phase%=6;
}
}
#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);
}
//########################################################################
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0()
{
CountMilliseconds++;
}
//########################################################################
//
unsigned int SetDelay(unsigned int t)
{
return(CountMilliseconds+t-1);
}
//########################################################################
//
//########################################################################
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));
}
//########################################################################
void Delay_us(unsigned int z)
{
int i;
for(i=0;i
_NOP();
}
主函数不完整,这里只是想测试一下启动程序(65-75),但是三相电机只是抖动不转,请教大神这是哪里的问题
|
|