Jump to content

Recommended Posts


//###########################################################################
#include "DSP2833x_Device.h"

// external function prototypes
extern void InitSysCtrl(void);
extern void InitCpuTimers(void);

// Prototype statements for functions found within this file.
void Gpio_select(void);
void Setup_HS1(void);
void Setup_HS2(void);
void Setup_HS3(void);
void Setup_HS4(void);
void Setup_HS5(void);
void Setup_HS6(void);

// Global Variables
int Hall_1_result, Hall_2_result, Hall_3_result, Hall_State, x=0 , P_State=0;

#define Hall_1 GpioDataRegs.GPADAT.bit.GPIO24
#define Hall_2 GpioDataRegs.GPADAT.bit.GPIO25
#define Hall_3 GpioDataRegs.GPADAT.bit.GPIO26

//###########################################################################
//                      main code
//###########################################################################
void main(void)
{

    InitSysCtrl();  // Basic Core Init from DSP2833x_SysCtrl.c

    Gpio_select();


    while(1)
    {

        if(Hall_1 ==1)     //eCAP1_Hall1

            Hall_1_result = 1;
        else Hall_1_result = 0;

        if (Hall_2 == 1)
                              //eCAP2_Hall2
            Hall_2_result = 1;
        else Hall_2_result = 0;

        if (Hall_3 == 1)
                              //eCAP3_Hall3
            Hall_3_result = 1;
        else Hall_3_result = 0;

        Hall_State = (4*Hall_3_result) + (2*Hall_2_result) + (1*Hall_1_result);

        if (Hall_State >=1 && Hall_State <=6)
        {
            P_State = Hall_State;


        switch (Hall_State)
        {
            case 1 :
            {
                x = 1;
                Setup_HS1();
                break;
            }

            case 2 :
            {
                x = 2;
                Setup_HS2();
                break;
            }

            case 3 :
            {
                x = 3;
                Setup_HS3();
                break;
            }

            case 4 :
            {
                x = 4;
                Setup_HS4();
                break;
            }

            case 5 :
            {
                x = 5;
                Setup_HS5();
                break;
            }

            case 6 :
            {
                x = 6;
                Setup_HS6();
                break;
            }


        }

    }


                        if (Hall_State == 0 || Hall_State == 7)
                    {
                        EPwm1Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM1A(S1)
                        EPwm1Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM1B(S4)
                        EPwm2Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM2A(S3)
                        EPwm2Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM2B(S6)
                        EPwm3Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM3A(S5)
                        EPwm3Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM3B(S2)
                    }

    }        // end of infinite loop
}      // end of main

void Gpio_select(void)
{
    EALLOW;
    GpioCtrlRegs.GPAMUX1.all = 0;       // GPIO15 ... GPIO0 = General Puropse I/O
    GpioCtrlRegs.GPAMUX2.all = 0;       // GPIO31 ... GPIO16 = General Purpose I/O
    GpioCtrlRegs.GPBMUX1.all = 0;       // GPIO47 ... GPIO32 = General Purpose I/O
    GpioCtrlRegs.GPBMUX2.all = 0;       // GPIO63 ... GPIO48 = General Purpose I/O
    GpioCtrlRegs.GPCMUX1.all = 0;       // GPIO79 ... GPIO64 = General Purpose I/O
    GpioCtrlRegs.GPCMUX2.all = 0;       // GPIO87 ... GPIO80 = General Purpose I/O

    GpioCtrlRegs.GPAMUX1.bit.GPIO0= 1;  //ePWM1A active
    GpioCtrlRegs.GPAMUX1.bit.GPIO1= 1;  //ePWM1B active
    GpioCtrlRegs.GPAMUX1.bit.GPIO2= 1;  //ePWM2A active
    GpioCtrlRegs.GPAMUX1.bit.GPIO3= 1;  //ePWM2B active
    GpioCtrlRegs.GPAMUX1.bit.GPIO4= 1;  //ePWM3A active
    GpioCtrlRegs.GPAMUX1.bit.GPIO5= 1;  //ePWM3B active

    GpioCtrlRegs.GPADIR.all = 0;
    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO24 = 0;  // gpio pin as input
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO25 = 0;  //gpio pins as input
    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO26 = 0;  //gpio pins as input

    GpioCtrlRegs.GPBDIR.all = 0;
    GpioCtrlRegs.GPCDIR.all = 0;
    GpioCtrlRegs.GPAPUD.all = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;
    EDIS;
}

void Setup_HS1(void)
{
    EPwm1Regs.TZCTL.all =  0;           //ePWM on S1 (ePWM1A)
    EPwm1Regs.TBCTL.bit.CLKDIV =  0;    // CLKDIV = 1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;  // HSPCLKDIV = 2
    EPwm1Regs.TBCTL.bit.CTRMODE = 2;    // up - down mode
    EPwm1Regs.AQCTLA.all = 0x0060;      // SET=CMPA CLEAR=CAD
    EPwm1Regs.TBPRD = 7500;             // 5KHz - PWM signal
    EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD/2;  //value of CMPA   (Duty Ratio)
    EPwm3Regs.AQCSFRC.bit.CSFB = 2;     //force continuous high on output of ePWM3B(S2)
    EPwm3Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM3A(S5)
    EPwm2Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM2B(S6)
    EPwm2Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM2A(S3)
    EPwm1Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM1B(S4)
}

void Setup_HS2(void)
{
    EPwm3Regs.TZCTL.all =  0;           //ePWM on S5 (ePWM3A)
    EPwm3Regs.TBCTL.bit.CLKDIV =  0;    // CLKDIV = 1
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = 1;  // HSPCLKDIV = 2
    EPwm3Regs.TBCTL.bit.CTRMODE = 2;    // up - down mode
    EPwm3Regs.AQCTLA.all = 0x0060;      // SET=CMPA CLEAR=CAD
    EPwm3Regs.TBPRD = 7500;             // 5KHz - PWM signal
    EPwm3Regs.CMPA.half.CMPA = EPwm3Regs.TBPRD/2;  //value of CMPA   (Duty Ratio)
    EPwm2Regs.AQCSFRC.bit.CSFB = 2;     //force continuous high on output of ePWM2B(S6)
    EPwm1Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM1A(S1)
    EPwm3Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM3B(S2)
    EPwm2Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM2A(S3)
    EPwm1Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM1B(S4)
}



void Setup_HS3(void)
{
    EPwm1Regs.TZCTL.all =  0;           //ePWM on S1 (ePWM1A)
    EPwm1Regs.TBCTL.bit.CLKDIV =  0;    // CLKDIV = 1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;  // HSPCLKDIV = 2
    EPwm1Regs.TBCTL.bit.CTRMODE = 2;    // up - down mode
    EPwm1Regs.AQCTLA.all = 0x0060;      // SET=CMPA CLEAR=CAD
    EPwm1Regs.TBPRD = 7500;             // 5KHz - PWM signal
    EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD/2;  //value of CMPA   (Duty Ratio)
    EPwm2Regs.AQCSFRC.bit.CSFB = 2;     //force continuous high on output of ePWM2B(S6)
    EPwm3Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM3A(S5)
    EPwm3Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM3B(S2)
    EPwm2Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM2A(S3)
    EPwm1Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM1B(S4)
}

void Setup_HS4(void)
{
    EPwm2Regs.TZCTL.all =  0;            //ePWM on S3 (ePWM2A)
    EPwm2Regs.TBCTL.bit.CLKDIV =  0;    // CLKDIV = 1
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 1;  // HSPCLKDIV = 2
    EPwm2Regs.TBCTL.bit.CTRMODE = 2;    // up - down mode
    EPwm2Regs.AQCTLA.all = 0x0060;      // SET=CMPA CLEAR=CAD
    EPwm2Regs.TBPRD = 7500;             // 5KHz - PWM signal
    EPwm2Regs.CMPA.half.CMPA = EPwm2Regs.TBPRD/2;  //value of CMPA  (Duty Ratio)
    EPwm1Regs.AQCSFRC.bit.CSFB = 2;     //force continuous high on output of ePWM1B(S4)
    EPwm1Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM1A(S1)
    EPwm2Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM2B(S2)
    EPwm3Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM3A(S5)
    EPwm3Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM3B(S2)
}

void Setup_HS5(void)
{

    EPwm2Regs.TZCTL.all =  0;           //ePWM on S3 (ePWM2A)
    EPwm2Regs.TBCTL.bit.CLKDIV =  0;    // CLKDIV = 1
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 1;  // HSPCLKDIV = 2
    EPwm2Regs.TBCTL.bit.CTRMODE = 2;    // up - down mode
    EPwm2Regs.AQCTLA.all = 0x0060;      // SET=CMPA CLEAR=CAD
    EPwm2Regs.TBPRD = 7500;             // 5KHz - PWM signal
    EPwm2Regs.CMPA.half.CMPA = EPwm2Regs.TBPRD/2;  //value of CMPA  (Duty Ratio)
    EPwm3Regs.AQCSFRC.bit.CSFB = 2;     //force continuous high on output of ePWM3B(S2)
    EPwm1Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM1A(S1)
    EPwm1Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM1B(S4)
    EPwm3Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM3A(S5)
    EPwm2Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM2B(S6)


}

void Setup_HS6(void)
{
    EPwm3Regs.TZCTL.all =  0;            //ePWM on S5 (ePWM3A)
    EPwm3Regs.TBCTL.bit.CLKDIV =  0;    // CLKDIV = 1
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = 1;  // HSPCLKDIV = 2
    EPwm3Regs.TBCTL.bit.CTRMODE = 2;    // up - down mode
    EPwm3Regs.AQCTLA.all = 0x0060;      // SET=CMPA CLEAR=CAD
    EPwm3Regs.TBPRD = 7500;             // 5KHz - PWM signal
    EPwm3Regs.CMPA.half.CMPA = EPwm3Regs.TBPRD/2;  //value of CMPA (Duty Ratio)
    EPwm1Regs.AQCSFRC.bit.CSFB = 2;     //force continuous high on output of ePWM1B(S4)
    EPwm1Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM1A(S1)
    EPwm2Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM2B(S2)
    EPwm2Regs.AQCSFRC.bit.CSFA = 1;     //force continuous low on output of ePWM2A(S3)
    EPwm3Regs.AQCSFRC.bit.CSFB = 1;     //force continuous low on output of ePWM3B(S2)
}


//===========================================================================
// End of SourceCode.
//===========================================================================

Hi,

I want to run a BLDC motor with the help of my DSP (TMS320F28335). While it is able to detect change in Hall State ( I confirmed it by rotating rotor with hand), as soon as Hall State is changing, corresponding gate driver signals are not developed. However if  I stop debugging in the IDE (CCS) and debug it again then corresponding correct pulses are produced. I am not getting how to develop gate driver signals continuously according to change in hall state. I am using following code-

 

code.txt

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...