社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 945|回复: 1

[求助] DIY电调驱动三相电机的问题

[复制链接]

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-2-21 18:47:54 | 显示全部楼层 |阅读模式
电路如下图所示(部分线路未接)
#include<msp430g2553.h>
//########################################################################
#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<timer;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<z;i++)
                _nop();
}

主函数不完整,这里只是想测试一下启动程序(65-75),但是三相电机只是抖动不转,请教大神这是哪里的问题
搜狗截图20170221184348.png


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-2-22 11:17:32 | 显示全部楼层

感谢~


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-11-24 02:43 , Processed in 0.303628 second(s), 18 queries , Redis On.

快速回复 返回顶部 返回列表