This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

开启和关断epwm_isr中断

Other Parts Discussed in Thread: CONTROLSUITE

28335里面,如何开启和关断epwm_isr中断,epwm_isr中断是怎么触发的,具体的寄存器配置方法是怎么样的?

  • 相关的寄存器不少 建议下载controlsuite 参考里面的例程
    如下面的这个中断配置
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example. This is useful for debug purposes.
    // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
    // This function is found in DSP2833x_PieVect.c.
    InitPieVectTable();

    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
    EALLOW; // This is needed to write to EALLOW protected registers
    PieVectTable.EPWM1_INT = &epwm1_timer_isr;
    PieVectTable.EPWM2_INT = &epwm2_timer_isr;
    PieVectTable.EPWM3_INT = &epwm3_timer_isr;
    PieVectTable.EPWM4_INT = &epwm4_timer_isr;
    PieVectTable.EPWM5_INT = &epwm5_timer_isr;
    PieVectTable.EPWM6_INT = &epwm6_timer_isr;
    EDIS; // This is needed to disable write to EALLOW protected registers

    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP2833x_InitPeripherals.c
    // InitPeripherals(); // Not required for this example
    InitEPwmTimer(); // For this example, only initialize the ePWM Timers

    // Step 5. User specific code, enable interrupts:

    // Initalize counters:
    EPwm1TimerIntCount = 0;
    EPwm2TimerIntCount = 0;
    EPwm3TimerIntCount = 0;
    EPwm4TimerIntCount = 0;
    EPwm5TimerIntCount = 0;
    EPwm6TimerIntCount = 0;

    // Enable CPU INT3 which is connected to EPWM1-6 INT:
    IER |= M_INT3;

    // Enable EPWM INTn in the PIE: Group 3 interrupt 1-6
    PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE;
    PieCtrlRegs.PIEIER3.bit.INTx2 = PWM2_INT_ENABLE;
    PieCtrlRegs.PIEIER3.bit.INTx3 = PWM3_INT_ENABLE;
    PieCtrlRegs.PIEIER3.bit.INTx4 = PWM4_INT_ENABLE;
    PieCtrlRegs.PIEIER3.bit.INTx5 = PWM5_INT_ENABLE;
    PieCtrlRegs.PIEIER3.bit.INTx6 = PWM6_INT_ENABLE;

    // Enable global Interrupts and higher priority real-time debug events:
    EINT; // Enable Global interrupt INTM
    ERTM; // Enable Global realtime interrupt DBGM
  • 建议您看一下例程,如C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_examples_ccsv5\epwm_timer_interrupts

    代码如下

    //###########################################################################
    // Description:
    //! \addtogroup f2833x_example_list
    //! <h1>ePWM Timer Interrupt (epwm_timer_interrupts)</h1>
    //!
    //! This example configures the ePWM Timers and increments a counter each
    //! time an interrupt is taken. \n
    //! In this example:
    //!  - All ePWM's are initialized.
    //!  - All timers have the same period.
    //!  - The timers are started sync'ed.
    //!  - An interrupt is taken on a zero event for each ePWM timer.
    //!  - ePWM1: takes an interrupt every event.
    //!  - ePWM2: takes an interrupt every 2nd event.
    //!  - ePWM3: takes an interrupt every 3rd event.
    //!  - ePWM4-ePWM6: takes an interrupt every event.
    //!
    //! Thus the Interrupt count for ePWM1, ePWM4, ePWM5, and ePWM6 should be
    //! equal.The interrupt count for ePWM2 should be about half that of ePWM1
    //! and the interrupt count for ePWM3 should be about 1/3 that of ePWM1.
    //!
    //! \b Watch \b Variables \n
    //! - EPwm1TimerIntCount
    //! - EPwm2TimerIntCount
    //! - EPwm3TimerIntCount
    //! - EPwm4TimerIntCount
    //! - EPwm5TimerIntCount
    //! - EPwm6TimerIntCount
    //
    //
    //###########################################################################
    // $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
    // $Release Date: November  1, 2016 $
    // $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
    //             http://www.ti.com/ ALL RIGHTS RESERVED $
    //###########################################################################
    
    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
    
    // Configure which ePWM timer interrupts are enabled at the PIE level:
    // 1 = enabled,  0 = disabled
    #define PWM1_INT_ENABLE  1
    #define PWM2_INT_ENABLE  1
    #define PWM3_INT_ENABLE  1
    #define PWM4_INT_ENABLE  1
    #define PWM5_INT_ENABLE  1
    #define PWM6_INT_ENABLE  1
    
    // Configure the period for each timer
    #define PWM1_TIMER_TBPRD   0x1FFF
    #define PWM2_TIMER_TBPRD   0x1FFF
    #define PWM3_TIMER_TBPRD   0x1FFF
    #define PWM4_TIMER_TBPRD   0x1FFF
    #define PWM5_TIMER_TBPRD   0x1FFF
    #define PWM6_TIMER_TBPRD   0x1FFF
    
    // Prototype statements for functions found within this file.
    __interrupt void epwm1_timer_isr(void);
    __interrupt void epwm2_timer_isr(void);
    __interrupt void epwm3_timer_isr(void);
    __interrupt void epwm4_timer_isr(void);
    __interrupt void epwm5_timer_isr(void);
    __interrupt void epwm6_timer_isr(void);
    void InitEPwmTimer(void);
    
    // Global variables used in this example
    Uint32  EPwm1TimerIntCount;
    Uint32  EPwm2TimerIntCount;
    Uint32  EPwm3TimerIntCount;
    Uint32  EPwm4TimerIntCount;
    Uint32  EPwm5TimerIntCount;
    Uint32  EPwm6TimerIntCount;
    
    void main(void)
    {
       int i;
    
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2833x_SysCtrl.c file.
       InitSysCtrl();
    
    // Step 2. Initialize GPIO:
    // This example function is found in the DSP2833x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    // InitGpio();  // Skipped for this example
    
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
       DINT;
    
    // Initialize the PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the DSP2833x_PieCtrl.c file.
       InitPieCtrl();
    
    // Disable CPU interrupts and clear all CPU interrupt flags:
       IER = 0x0000;
       IFR = 0x0000;
    
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
    // This function is found in DSP2833x_PieVect.c.
       InitPieVectTable();
    
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
       EALLOW;  // This is needed to write to EALLOW protected registers
       PieVectTable.EPWM1_INT = &epwm1_timer_isr;
       PieVectTable.EPWM2_INT = &epwm2_timer_isr;
       PieVectTable.EPWM3_INT = &epwm3_timer_isr;
       PieVectTable.EPWM4_INT = &epwm4_timer_isr;
       PieVectTable.EPWM5_INT = &epwm5_timer_isr;
       PieVectTable.EPWM6_INT = &epwm6_timer_isr;
       EDIS;    // This is needed to disable write to EALLOW protected registers
    
    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP2833x_InitPeripherals.c
    // InitPeripherals();  // Not required for this example
       InitEPwmTimer();    // For this example, only initialize the ePWM Timers
    
    // Step 5. User specific code, enable interrupts:
    
    // Initialize counters:
       EPwm1TimerIntCount = 0;
       EPwm2TimerIntCount = 0;
       EPwm3TimerIntCount = 0;
       EPwm4TimerIntCount = 0;
       EPwm5TimerIntCount = 0;
       EPwm6TimerIntCount = 0;
    
    // Enable CPU INT3 which is connected to EPWM1-6 INT:
       IER |= M_INT3;
    
    // Enable EPWM INTn in the PIE: Group 3 interrupt 1-6
       PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE;
       PieCtrlRegs.PIEIER3.bit.INTx2 = PWM2_INT_ENABLE;
       PieCtrlRegs.PIEIER3.bit.INTx3 = PWM3_INT_ENABLE;
       PieCtrlRegs.PIEIER3.bit.INTx4 = PWM4_INT_ENABLE;
       PieCtrlRegs.PIEIER3.bit.INTx5 = PWM5_INT_ENABLE;
       PieCtrlRegs.PIEIER3.bit.INTx6 = PWM6_INT_ENABLE;
    
    // Enable global Interrupts and higher priority real-time debug events:
       EINT;   // Enable Global interrupt INTM
       ERTM;   // Enable Global realtime interrupt DBGM
    
    // Step 6. IDLE loop. Just sit and loop forever (optional):
       for(;;)
       {
           __asm("          NOP");
           for(i=1;i<=10;i++)
           {}
       }
    }
    
    void InitEPwmTimer()
    {
       EALLOW;
       SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks
       EDIS;
    
       // Setup Sync
       EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // Pass through
       EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // Pass through
       EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // Pass through
       EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // Pass through
       EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // Pass through
       EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // Pass through
    
       // Allow each timer to be sync'ed
    
       EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
       EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
       EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;
       EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;
       EPwm5Regs.TBCTL.bit.PHSEN = TB_ENABLE;
       EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    
       EPwm1Regs.TBPHS.half.TBPHS = 100;
       EPwm2Regs.TBPHS.half.TBPHS = 200;
       EPwm3Regs.TBPHS.half.TBPHS = 300;
       EPwm4Regs.TBPHS.half.TBPHS = 400;
       EPwm5Regs.TBPHS.half.TBPHS = 500;
       EPwm6Regs.TBPHS.half.TBPHS = 600;
    
       EPwm1Regs.TBPRD = PWM1_TIMER_TBPRD;
       EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;    // Count up
       EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // Select INT on Zero event
       EPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE;  // Enable INT
       EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;           // Generate INT on 1st event
    
    
       EPwm2Regs.TBPRD = PWM2_TIMER_TBPRD;
       EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count up
       EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;      // Enable INT on Zero event
       EPwm2Regs.ETSEL.bit.INTEN = PWM2_INT_ENABLE;   // Enable INT
       EPwm2Regs.ETPS.bit.INTPRD = ET_2ND;            // Generate INT on 2nd event
    
    
       EPwm3Regs.TBPRD = PWM3_TIMER_TBPRD;
       EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count up
       EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;      // Enable INT on Zero event
       EPwm3Regs.ETSEL.bit.INTEN = PWM3_INT_ENABLE;   // Enable INT
       EPwm3Regs.ETPS.bit.INTPRD = ET_3RD;            // Generate INT on 3rd event
    
       EPwm4Regs.TBPRD = PWM4_TIMER_TBPRD;
       EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count up
       EPwm4Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;      // Enable INT on Zero event
       EPwm4Regs.ETSEL.bit.INTEN = PWM4_INT_ENABLE;   // Enable INT
       EPwm4Regs.ETPS.bit.INTPRD = ET_1ST;            // Generate INT on 1st event
    
    
       EPwm5Regs.TBPRD = PWM5_TIMER_TBPRD;
       EPwm5Regs.TBCTL.bit.CTRMODE= TB_COUNT_UP;      // Count up
       EPwm5Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;      // Enable INT on Zero event
       EPwm5Regs.ETSEL.bit.INTEN = PWM5_INT_ENABLE;   // Enable INT
       EPwm5Regs.ETPS.bit.INTPRD = ET_1ST;            // Generate INT on 1st event
    
    
       EPwm6Regs.TBPRD = PWM6_TIMER_TBPRD;
       EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count up
       EPwm6Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;      // Enable INT on Zero event
       EPwm6Regs.ETSEL.bit.INTEN = PWM6_INT_ENABLE;   // Enable INT
       EPwm6Regs.ETPS.bit.INTPRD = ET_1ST;            // Generate INT on 1st event
    
       EALLOW;
       SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         // Start all the timers synced
       EDIS;
    }
    
    // Interrupt routines uses in this example:
    __interrupt void epwm1_timer_isr(void)
    {
       EPwm1TimerIntCount++;
    
       // Clear INT flag for this timer
       EPwm1Regs.ETCLR.bit.INT = 1;
    
       // Acknowledge this interrupt to receive more interrupts from group 3
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
    }
    
    __interrupt void epwm2_timer_isr(void)
    {
       EPwm2TimerIntCount++;
    
       // Clear INT flag for this timer
       EPwm2Regs.ETCLR.bit.INT = 1;
    
       // Acknowledge this interrupt to receive more interrupts from group 3
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
    }
    
    __interrupt void epwm3_timer_isr(void)
    {
       EPwm3TimerIntCount++;
    
       // Clear INT flag for this timer
       EPwm3Regs.ETCLR.bit.INT = 1;
    
       // Acknowledge this interrupt to receive more interrupts from group 3
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
    }
    
    __interrupt void epwm4_timer_isr(void)
    {
       EPwm4TimerIntCount++;
    
       // Clear INT flag for this timer
       EPwm4Regs.ETCLR.bit.INT = 1;
    
       // Acknowledge this interrupt to receive more interrupts from group 3
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
    }
    
    __interrupt void epwm5_timer_isr(void)
    {
       EPwm5TimerIntCount++;
    
       // Clear INT flag for this timer
       EPwm5Regs.ETCLR.bit.INT = 1;
    
       // Acknowledge this interrupt to receive more interrupts from group 3
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
    }
    
    __interrupt void epwm6_timer_isr(void)
    {
       EPwm6TimerIntCount++;
    
       // Clear INT flag for this timer
       EPwm6Regs.ETCLR.bit.INT = 1;
    
       // Acknowledge this interrupt to receive more interrupts from group 3
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
    }
    
    
    
    
    //===========================================================================
    // No more.
    //===========================================================================
    

  • 可以参考这个路径的例程:
    C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_examples_ccsv5\epwm_up_aq
  • // Initialize counters:
    EPwm1TimerIntCount = 0;
    EPwm2TimerIntCount = 0;
    EPwm3TimerIntCount = 0;
    EPwm4TimerIntCount = 0;
    EPwm5TimerIntCount = 0;
    EPwm6TimerIntCount = 0;
    可不可以不需要初始化计数器这一步?计数器在什么地方,比如我的MainIsr(void)计数器在什么地方?
  • 您现在是要实现什么功能?能否稍微描述下?您现在不需要使用计数器?

    一般在程序内的用法如下

    // Every 10'th interrupt, change the CMPA/CMPB values
    if(epwm_info->EPwmTimerIntCount == 10)

    用于中断计数,每多少次中断执行特定操作

  • #include "DSP2833x_Device.h"
    #include "DSP2833x_Examples.h"
    #include "DSP2833x_GlobalConst.h"
    #include "DSP2833x_Globalpara.h"
    #include ".\source\app\AdcProcess.c"
    #include ".\source\app\Timer.c"
    #include ".\source\app\MotorCtrl.c"
    #include "485.c"
    #include "ECana.c"
    #include "dmctype.h"
    #include "rmp_cntl.h"
    //#include "AD.h"
    //#include "DA.h"
    #include "Resolver.h"

    CLARKE clarkeu=CLARKE_DEFAULTS;
    CLARKE clarkei=CLARKE_DEFAULTS;
    PARK parku=PARK_DEFAULTS;
    PARK parki=PARK_DEFAULTS;
    PIDREG3 pid1_PLL =PIDREG3_DEFAULTS;
    PIDREG3 pid1_Speed =PIDREG3_DEFAULTS;
    PIDREG3 pid1_idloop=PIDREG3_DEFAULTS;
    PIDREG3 pid1_iqloop=PIDREG3_DEFAULTS;
    IPARK iparku=IPARK_DEFAULTS;
    PIDREG3 pid1_vdc =PIDREG3_DEFAULTS;
    SPEED_ESTIMATION speed1=SPEED_ESTIMATION_DEFAULTS;
    RMPCNTL rc1=RMPCNTL_DEFAULTS;

    //AD Adv=AD_DEFAULTS;
    //DA DAv=DA_DEFAULTS;
    RESOLVER resolver=RESOLVER_DEFAULTS;

    //interrupt void MainIsr();
    //interrupt void AdcIsr();
    //interrupt void CpuTimer0Isr(void);
    //interrupt void CpuTimer1Isr(void);
    //interrupt void ISRExint(void);
    //interrupt void ECanaISR(void);
    //void InitMboxa(void);
    //void ClrStatup(void);
    float32 Ualpha1=0,Ubeta1=0,Ref_theta=0;
    float Freq1=0;
    int kk;
    float32 minus=0,oldElecTheta=0;
    Uint16 ledcont=0;
    Uint16 INT3Count=0;
    float32 Cosine1,Sine1;
    float theta1=0,vdc1flt=0;
    Uint32 iqcount=0;
    Uint32 ao1=0;
    int key=0,key1count=0,key2count=0;
    //int kji=0,kreset=0,nreset=0;
    /************************************************采样中断*******************************************************/

    Uint16 LoopCount;
    Uint16 ConversionCount;
    Uint16 Current1[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    Uint16 CURRENT1 = 0;
    Uint16 iLo = 0;
    Uint16 ILO_REF = 41800;
    Uint16 ILo = 0;
    Uint16 ILo_ref = 0;
    Uint16 ILo_error = 0;
    Uint16 ILo_Inter = 0;
    Uint16 ILo_out = 0;
    Uint16 Uzaibo = 0;
    Uint16 Uzaibo_out = 0;
    Uint16 ILo_P = 0.01;
    Uint16 ILo_I = 0.10;

    /*************************************************主函数*******************************************************/
    #pragma CODE_SECTION(main,"ramfuncs")
    void main(void)
    {
    DSP28x_usDelay(5000);
    // Initialize System Control registers, PLL, WatchDog, Clocks to default state
    // This function is found in the DSP280x_SysCtrl.c file
    InitSysCtrl();
    InitGpio();
    InitSci();
    DINT;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();
    InitPieVectTable();
    InitCpuTimers();
    InitAdc();

    // EALLOW;
    // SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    // EDIS;

    InitEPwm();

    // EALLOW;
    // SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    // EDIS;

    #if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT
    #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
    #endif
    #if (CPU_FRQ_100MHZ)
    #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz
    #endif

    EDIS;
    EALLOW;
    SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
    EDIS;
    EALLOW;

    DINT;

    InitPieCtrl();

    // Disable CPU interrupts and clear all CPU interrupt flags:
    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW; // This is needed to write to EALLOW protected register
    PieVectTable.ADCINT = &adc_isr;
    PieVectTable.EPWM1_INT = &MainIsr;
    EDIS; // This is needed to disable write to EALLOW protected registers

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    InitAdc(); // For this example, init the ADC
    InitEPwm();

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
    IER |=M_INT1; //开放CPUTimer0/AD/ePWM
    EINT; // Enable Global interrupt INTM
    ERTM; // Enable Global realtime interrupt DBGM

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
    IER |=M_INT3; //开放CPUTimer0/AD/ePWM
    EINT; // Enable Global interrupt INTM
    ERTM; // Enable Global realtime interrupt DBGM

    EALLOW;
    // Configure ADC
    AdcRegs.ADCTRL3.bit.SMODE_SEL= 0x0; //同步采样模式
    AdcRegs.ADCTRL1.bit.ACQ_PS = 0xf; //ADC采样时间选择
    AdcRegs.ADCTRL3.bit.ADCCLKPS = OSCCLOCK; //ADC内核分频
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联工作方式
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联工作方式
    AdcRegs.ADCMAXCONV.all = 0x0000; // Setup 1 conv's on SEQ1
    //AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //连续采样
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x1; //设置CONV0 为第一个通道
    AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; //Enable SOCA from ePWM to start SEQ1
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //Enable SEQ1 interrupt (every EOS)
    //AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //连续运行模式
    //AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; //完成排序后,排序器指针回到最初状态
    EDIS;

    for(;;)
    {
    }

    }
    /**********************************************************EPWM中断程序*******************************************************************/
    #pragma CODE_SECTION(MainIsr,"ramfuncs")
    interrupt void MainIsr(void)
    {
    // float32 vdcMaxPU;
    // float32 iMaxPU;
    // float Kiu,Kiv;

    ILo = iLo;
    ILo_ref = ILO_REF;
    ILo_error = ILo_ref-ILo;
    ILo_Inter += ILo_error*ILo_I;
    if(ILo_Inter > 400)
    ILo_Inter = 400;
    else if(ILo_Inter < -400)
    ILo_Inter = -400;
    ILo_out = ILo_Inter+ILo_P*ILo_error;
    if(ILo_out > 500)
    ILo_out = 500;
    else if(ILo_out < -500)
    ILo_out = -500;
    Uzaibo = ILo_out/500.0;
    // Uzaibo_out = -Uzaibo*30000/2+30000/2;

    EPwm2Regs.TBPHS.half.TBPHS = 0.0*30000;//1.06*30000;
    EPwm3Regs.TBPHS.half.TBPHS = 1.0*30000;//1.1538*30000;
    EPwm4Regs.TBPHS.half.TBPHS = (1.1+0.5*Uzaibo)*30000;//0.1438*30000;
    EPwm5Regs.TBPHS.half.TBPHS = (0.1+0.5*Uzaibo)*30000;//0.1438*30000;

    EPwm2Regs.CMPA.half.CMPA = (0.4+Uzaibo)*30000;
    EPwm3Regs.CMPA.half.CMPA = (0.4+Uzaibo)*30000;
    EPwm4Regs.CMPA.half.CMPA = (0.4+Uzaibo)*30000;
    EPwm5Regs.CMPA.half.CMPA = (0.4+Uzaibo)*30000;

    //EPwm1Regs.CMPA.half.CMPA=30000/2;
    //EPwm2Regs.CMPA.half.CMPA=30000/2;

    EPwm1Regs.ETCLR.bit.INT =1;
    DINT;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; //响应本次接收中断;
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //开CPUTimer0中断
    }
    /********************************************************************采样中断*************************************************************/
    #pragma CODE_SECTION(adc_isr,"ramfuncs")
    interrupt void adc_isr(void)
    {

    Current1[ConversionCount] = AdcRegs.ADCRESULT0 >>4;
    CURRENT1 +=Current1[ConversionCount];

    // If 40 conversions have been logged, start over
    if(ConversionCount == 19)
    {
    iLo = CURRENT1;
    ConversionCount = 0;
    CURRENT1= 0;

    }
    else
    {
    ConversionCount++;
    }

    // Reinitialize for next ADC sequence
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE

    return;
    }
    /**************************************************************************************************************************************/
    这是我的主函数,我要实现的功能是采集平均电流,并用PI闭环跟踪给定电流!