3467|1

18

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

DIY电调驱动三相电机的问题 [复制链接]

电路如下图所示(部分线路未接)
#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),但是三相电机只是抖动不转,请教大神这是哪里的问题

搜狗截图20170221184348.png (192.31 KB, 下载次数: 0)

搜狗截图20170221184348.png

最新回复

感谢~  详情 回复 发表于 2017-2-22 11:17
点赞 关注
 

回复
举报

4

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

感谢~
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表