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.

TMS320F28377D: 关于CMPSS跳闸事件的问题

Part Number: TMS320F28377D
Other Parts Discussed in Thread: C2000WARE

按照下图3进行配置,下面是我电路的实际波形,绿色是PWM1A的驱动,紫色是PWM1B的驱动,黄色是引出的CTRIPOUT信号,现在有个问题 ,PWM1A是设置的TZA.FORCE LOW 动作,但是可以看到CTRIP信号到来时,经过了一定时间的延时,PWM1A才关断,延时时间好像跟我设置的DBRED(80ns)差不多,但是理论上TZA不经过DB的呀,不该有这个延时呀。

  • 你好,你测试的是CMPSS模块控制TZ模块拉低PWMA吗?看波形似乎看不出两者有什么动作关系啊。TZ是one ***?关键两种模式似乎都跟图片上的波形对不起了啊

    有没有参考过TI例程:C:\ti\c2000\C2000Ware_4_00_00_00\driverlib\f2837xd\examples\cpu1\epwm

  • 是的,TZ是CBC 计数器为0的时候清除的,动作关系是比较器输出信号TRIP为高时拉低PWMA呀,但是TRIP为高时,PWMA并没有马上被拉低

  • 这里可能需要你上传一下关键部分的配置代码。选择插入里面的代码上传,选择C语言格式的

  • // Included Files
    //pin define      Cmpss3 CMP3IN_P  to B2   vo_sense to A1    改EPWM6的话  ADC soc信号要改  EPWMENCK信号要改  TRIP路径EPWM bar   ET事件  低输入时不正常
                      //PWM1A TZA-FORCE LO  1B 在AQ中 T1事件动作通过同步TRIP EVENT
    #include "F28x_Project.h"
    
    // Defines
    //
    //definitions for selecting DACH reference
    #define REFERENCE_VDDA     0
    #define REFERENCE_VDAC     1
    //definitions for COMPH input selection
    #define NEGIN_DAC          0
    #define NEGIN_PIN          1
    //definitions for CTRIPH/CTRIPOUTH output selection
    #define CTRIP_ASYNCH       0
    #define CTRIP_SYNCH        1
    #define CTRIP_FILTER       2
    #define CTRIP_LATCH        3
    int i=0;
    //ADC定义
    #define Vo_ref 2470  //12V  2460
    float Vo_ave=0;
    #define chanel 1
    #define acqps  29    //采样窗   (acqps+1)*sysclk   *5ns
    //斜坡定义
    #define slopeval 10         /* Required slope compensation */
    #define dacval 8000
    //
    // Function Prototypes
    //
    void InitAdc(void);
    void InitCMPSS(void);
    void InitEPWM(void);
    void pid_init(void);
    interrupt void adc_isr(void);
    
    //
    // Main
    //
    void main(void)
    {
        //
        // Step 1. Initialize System Control:
        // PLL, WatchDog, enable Peripheral Clocks
        // This example function is found in the F2837xD_SysCtrl.c file.
        //
            InitSysCtrl();
        //
        // Step 2. Initialize GPIO:
        // This example function is found in the F2837xD_Gpio.c file and
        // illustrates how to set the GPIO to it's default state.
        //
            InitGpio();
        //
        // 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 F2837xD_PieCtrl.c file.
            InitPieCtrl();
        // Disable CPU interrupts and clear all CPU interrupt flags:
            IER = 0x0000;
            IFR = 0x0000;
       /* DSP28377D_PieVect.c */
            InitPieVectTable();
            /* Interrupt re-mapped to ISR function */
            EALLOW;
            PieVectTable.ADCA1_INT = &adc_isr;
            EDIS;
    
            InitAdc();
       /* Enable ADCA1INT1 in PIE */
    
            PieCtrlRegs.PIEIER1.bit.INTx1 = 1;/* Enable INT 1.1 in the PIE */
    
            IER |= M_INT1;/* Enable CPU Interrupt 1 */
            EINT;/* Enable Global interrupt INTM */
            ERTM;/* Enable Global realtime interrupt DBGM */
    
        // Configure Comparator COMP3H to accept POS input from pin and NEG input
        // from DAC
    
          InitEPWM();
          InitEPwm1Gpio();
          InitCMPSS();
    
        // Configure GPIO5() to output  OUTPUTXBAR3
        //
            GPIO_SetupPinMux(5, GPIO_MUX_CPU1, 3);
    
        //观察ctripout值 gpio5
        // Configure COMP3 to feed TRIP4 EPWM DC trip input
        //
    
    
    
            pid_init();
    
    
    
         while(1)
         {
    ;
         }
    
    }
    
    
    //
    // InitCMPSS - Initialize CMPSS3 and configure settings
    //
    void InitAdc(void)
    {
        //ADC时钟开启
        EALLOW;
        CpuSysRegs.PCLKCR13.bit.ADC_A=1;
        EDIS;
    
        EALLOW;
    
    
        AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
    
        AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
    
    
        AdcaRegs.ADCSOC0CTL.bit.CHSEL =chanel; //SOC0 will convert ADCINA1
        AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //SOC0 will use sample duration of 20 SYSCLK cycles
        AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; //SOC0 will begin conversion on ePWM1 SOCA   5 EPWM1A
    
        AdcaRegs.ADCSOC1CTL.bit.CHSEL =chanel; //SOC0 will convert ADCINA1
        AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps; //SOC0 will use sample duration of 20 SYSCLK cycles
        AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5; //SOC0 will begin conversion on ePWM1 SOCA
    
        AdcaRegs.ADCSOC2CTL.bit.CHSEL =chanel; //SOC0 will convert ADCINA1
        AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps; //SOC0 will use sample duration of 20 SYSCLK cycles
        AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5; //SOC0 will begin conversion on ePWM1 SOCA
    
        AdcaRegs.ADCSOC3CTL.bit.CHSEL =chanel; //SOC0 will convert ADCINA1
        AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps; //SOC0 will use sample duration of 20 SYSCLK cycles
        AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 5; //SOC0 will begin conversion on ePWM1 SOCA
    
    
        AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flag
        AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   //enable INT1 flag
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
        //Set pulse positions to late
        AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    
            //power up the ADC
        AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    
            //delay for 1ms to allow ADC time to power up
        DELAY_US(1000);
    
        EDIS;
    }
    
    void InitCMPSS(void)
    {
        EALLOW;
        CpuSysRegs.PCLKCR14.bit.CMPSS3 = 0; //禁用时钟
        //将CMPSS分配给CPU1
        DevCfgRegs.CPUSEL12.bit.CMPSS3 = 0;
        CpuSysRegs.PCLKCR14.bit.CMPSS3 = 1; //启用时钟
        EDIS;
    
        EALLOW;
        //
        //Enable CMPSS
        //
       Cmpss3Regs.COMPCTL.bit.COMPDACE = 1;
    
        //NEG signal comes from DAC
        //
       Cmpss3Regs.COMPCTL.bit.COMPHSOURCE = NEGIN_DAC;
    
        //
        //Use VDDA as the reference for DAC
        //
       Cmpss3Regs.COMPDACCTL.bit.SELREF = REFERENCE_VDDA;  //VDDA的值是多少 3.3
        //选择同步或异步比较器触发
     //  Cmpss3Regs.COMPCTL.bit.ASYNCHEN = 0; //High comparator asynchronous path enable. Allows asynchronous comparator output to feed into OR gate with latched digital filter signal when CTRIPHSEL=3 or CTRIPOUTHSEL=3
    
        //
        // Configure CTRIPOUT path
        // Asynch output feeds CTRIPH and CTRIPOUTH
        //
       Cmpss3Regs.COMPCTL.bit.COMPHINV=0;  //    0比较器同相输出    1 比较器反相输出
        //配置数字滤波器
        //最大SAMPWIN值提供最大数量的样本(5位)
      Cmpss3Regs.CTRIPHFILCTL.bit.SAMPWIN = 20 ;  // 0x1F & 0x00;
        //最大THRESH值需要整个窗口的静态值
        //(5 位 THRESH 应该大于 SAMPWIN 的一半)
       Cmpss3Regs.CTRIPHFILCTL.bit.THRESH = 17 ;    //0x1F & 0x01
        //最大 CLKPRESCALE 值提供样本之间的最长时间(12 位)
       Cmpss3Regs.CTRIPHFILCLKCTL.bit.CLKPRESCALE =2 ; //234       2 10 7   0x3FF & 0x001;
    
        //重置过滤逻辑并开始过滤
      Cmpss3Regs.CTRIPHFILCTL.bit.FILINIT = 1;
        //清除锁存器
        Cmpss3Regs.COMPSTSCLR.bit.HSYNCCLREN=1;   //1 EPWMSYNCPER will reset latch
      Cmpss3Regs.COMPSTSCLR.bit.HLATCHCLR = 1;    //清除锁存值
    //输出路径
        Cmpss3Regs.COMPCTL.bit.CTRIPHSEL = CTRIP_ASYNCH;
      // Cmpss3Regs.COMPCTL.bit.CTRIPHSEL = CTRIP_FILTER;
       Cmpss3Regs.COMPCTL.bit.CTRIPOUTHSEL = CTRIP_ASYNCH;
     //  Cmpss3Regs.COMPCTL.bit.CTRIPOUTHSEL = CTRIP_FILTER;
     //  Cmpss3Regs.COMPHYSCTL.bit.COMPHYS=2;  //设置 滞环宽度
       //同步清除使能
    // Cmpss3Regs.COMPSTSCLR.bit.HSYNCCLREN = 1;
        //
        // Configure CTRIPOUTH output pin
        // Configure OUTPUTXBAR3 to be CTRIPOUT1H
        //
        OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX4 = 0;
    
        //
        //Enable OUTPUTXBAR3 Mux for Output
        //
        OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX4 = 1;
    
    
    
        //
        //DAC source select. Determines whether DACHVALA is updated from DACHVALS or from the ramp generator
        //
        Cmpss3Regs.COMPDACCTL.bit.DACSOURCE = 1;       // 0 DAC updated from DACHVALS, 1 DAC updated from the ramp generator
        Cmpss3Regs.COMPDACCTL.bit.RAMPLOADSEL=1;  //斜坡加载模式  Ramp load select. Determines whether RAMPSTS is updated from RAMPMAXREFA or RAMPMAXREFS when COMPSTS[COMPHSTS] is triggered.
        Cmpss3Regs.COMPDACCTL.bit.SWLOADSEL=1;   /*Software load select. Determines whether DACxVALA is updated
                                                 from DACxVALS on SYSCLK or EPWMSYNCPER.
                                                   0 DACxVALA is updated from DACxVALS on SYSCLK
                                                    1 DACxVALA is updated from DACxVALS on EPWMSYNCPER
                                                         */
    
        //
        //Ramp generator source select. Determines which EPWMSYNCPER signal is used within the CMPSS module
        //
        Cmpss3Regs.COMPDACCTL.bit.RAMPSOURCE = 0;         // 0 EPWM1SYNCPER, 3 EPWM4SYNCPER 更改EPWM需要修改   Ramp generator source select. Determines which EPWMSYNCPER
                                                         // signal is used within the CMPSS module
    
        EDIS;
    
    
        Cmpss3Regs.RAMPDECVALS = slopeval;
    
      //  Cmpss3Regs.RAMPMAXREFS = dacval;  //2048==>  2048/16  *3.3(ref)  /4096=dacout   0.07
    }
    
    
    //
    // InitEPWM - Initialize EPWM1 module settings
    //
    void InitEPWM(void)
    {
        EALLOW;
       // ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1; //EPWM分频器
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    
        //
        //Configure EPWM to run at SYSCLK
        //
    //    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
        EPwm1Regs.TBCTL.bit.CLKDIV = 0;
        EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
    
        //Initialize dummy values for EPWM CTR/PRD
        //
        EPwm1Regs.TBCTR = 0;
        EPwm1Regs.TBPRD = 117;         // 850kHz PWM
    
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    
        EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading禁止计数器装载相位寄存器的值
        EPwm1Regs.TBPHS.bit.TBPHS= 0;/* Set Phase register to zero */
        EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // Sync down-stream module
    
        EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //影子装载模式
        EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
        EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;  // Load on Zero在CTR=0时,影子寄存器装载
        EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
        //
        //Configure TRIP4 to be CTRIP3H
        //
        EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX4 = 0;   // 0.4 是CMPSS3的CTRIPH
        //Enable TRIP4 Mux for Output
        //
        EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX4 = 1;
    
        // Enable PWM
        //
        EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
        EPwm1Regs.CMPA.bit.CMPA =95;   //max duty limit  97/117 考虑了死区  0.82最大占空比
        EPwm1Regs.CMPB.bit.CMPB =95;      //max duty limit  97/117 考虑了死区  0.82最大占空比
    
        // Set actions   AQ也配置 实际上A是通过跳闸
        //
        EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;      // Set PWM1A on event A, up count
        EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;    // Clear PWM1A on event A, up count  限制最大占空比防止一直高电平
     //   EPwm1Regs.AQCTLA2.bit.T1U = AQ_CLEAR;   // Action when event occurs on T2 in UP-Count
    
        EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;      // Set PWM1B on event B, up count
        EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;      // Set PWM1B on event B, up count  最小占空比限制
        EPwm1Regs.AQCTLB2.bit.T1U = AQ_CLEAR;   // Action when event occurs on T2 in UP-Count  1:DCAEVT2发生时动作
    
        EPwm1Regs.AQTSRCSEL.bit.T1SEL = 3;      // 0:DCAEVT1, 1:DCAEVT2, 2:DCBEVT1, 3:DCBEVT2 有TI T2事件  DCAEVT2事件被配置为异步跳闸 能否应用于B的T1事件触发
                                                //
        //---------------------------- Active Low PWMs - Setup Deadband
        //
    //    EPwm1Regs.DBCTL.bit.HALFCYCLE = 1;     // Half cycle clocking enabled
        EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
        EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
        EPwm1Regs.DBCTL.bit.DEDB_MODE=0;
        //EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
        EPwm1Regs.DBCTL.bit.IN_MODE =DBA_RED_DBB_FED;   //A RED  B FED+invert
        EPwm1Regs.DBRED.bit.DBRED = 8;  //死区时间  DBFED × TTBCLK(10nS @100Mhz)
        EPwm1Regs.DBFED.bit.DBFED = 10;
      //-----ET------------------------触发ADC采样-----------------------
          EPwm1Regs.ETSEL.bit.SOCAEN = 1; /* Enable SOC on A group */
          EPwm1Regs.ETSEL.bit.SOCASEL =1;   //001: Enable event time-base counter equal to zero. (TBCTR = 0x00)
    
          EPwm1Regs.ETPS.bit.SOCPSSEL = 1;  //EPWMxSOC A/B Pre-Scale Selection Bits  预分频
        //  EPwm1Regs.ETPS.bit.INTPSSEL=1;   //EPWM int中断
        //  EPwm1Regs.ETPS.bit.SOCAPRD=1;
          EPwm1Regs.ETSOCPS.bit.SOCAPRD2 = 4;  /* Generate pulse on 6st event */
       //   EPwm1Regs.ETCLR.bit.SOCA=1;        //清除SOCA中断标志位
    
          EPwm1Regs.TZSEL.bit.DCAEVT2 = 1;            // Enable DCAEVT2 as a CBC trip source for this ePWM module
          EPwm1Regs.TZCBCCLR.bit.DCAEVT2 = 1;   // Clear Flag for Digital Compare Output A Event 2 selected for CBC
          EPwm1Regs.TZCLR.bit.DCAEVT2=1  ;       // Clear Flag for Digital Compare Output A Event 2
                                                  // 0: Writing 0 has no effect. This bit always reads back 0.
                                                  //  1: Writing 1 clears the DCAEVT2 event trip condition.
          EPwm1Regs.TZCLR.bit.CBC=1  ;            //Clear Flag for Cycle-By-Cycle (CBC) Trip Latch 清除中断标志TZFLG
                                                   //  0: Has no effect. Always reads back a 0.
                                                   //  1: Clears this Trip (set) condition.
          EPwm1Regs.TZCLR.bit.CBCPULSE=0;     //00: CTR = zero pulse clears CBC trip latch. (Same as legacy  designs.)
    //------------------B通道 DCBEVT2--------------------------------------
      //   EPwm1Regs.TZSEL.bit.DCBEVT2 = 1;            // Enable DCAEVT2 as a CBC trip source for this ePWM module
      //       EPwm1Regs.TZCBCCLR.bit.DCBEVT2 = 1;   // Clear Flag for Digital Compare Output A Event 2 selected for CBC
      //       EPwm1Regs.TZCLR.bit.DCBEVT2=1  ;      //
           //  EPwm1Regs.TZCLR.bit.CBCPULSE=0;     //00: CTR = zero pulse clears CBC trip latch. (Same as legacy  designs.)
    
    
         EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;  /* EPWM1A will go low 这是锁存的*/
       //  EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;/* EPWM1B will go low */
         EPwm1Regs.TZCTL.bit.TZB = TZ_NO_CHANGE; /* EPWM1B has no action   在AQ中动作*/
    
      // EPwm1Regs.TZCTL.bit.DCAEVT2 = TZ_FORCE_LO;  // 10: Force EPWMxA to a low state    保护不用 通过T1 T2事件进行动作 可以避免直通 这是不锁存的
      //  EPwm1Regs.TZCTL.bit.DCBEVT2 = TZ_NO_CHANGE;  // 11: Do Nothing, trip action is disabled
     //   EPwm1Regs.TZCTL.bit.DCAEVT2 = TZ_NO_CHANGE;   //屏蔽DCA B动作 采用TZAB动作
        //  EPwm1Regs.TZCTL2.bit.ETZE = 1;   //0: Use trip action from TZCTL (legacy EPWM compatibility)   1: Use trip action defined in TZCTL2, TZCTLDCA and TZCTLDCB.   Settings in TZCTL are ignored
    
        EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 3;       // Trip IN4       3
        EPwm1Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 3;    // Trip 4    3
    
        EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_HI;    /*000: Event disabled   DCAH为高 产生一个DCAEVT2事件
                                                         001: DCAH = low, DCAL = don't care
                                                         010: DCAH = high, DCAL = don't care
                                                         011: DCAL = low, DCAH = don't care
                                                         100: DCAL = high, DCAH = don't care
                                                         101: DCAL = high, DCAH = low  */
    
        EPwm1Regs.TZDCSEL.bit.DCBEVT2 = TZ_DCBH_HI;  //TRIP4 产生DCAH与DCBH事件,DCAH配置CBC跳闸触发TZA   ,DCBH配置为事件T1 用于B pwm
    
    
        EPwm1Regs.DCACTL.bit.EVT2SRCSEL =1;        // 0: Source Is DCAEVT2 Signal;  1: Source Is DCEVTFILT Signal  TZ路径
        EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL =1;    // 0: Source is synchronized with EPWMCLK;   1: Source is passed through asynchronously  通过sync生成DCAEVT2.FORCE
        EPwm1Regs.DCBCTL.bit.EVT2SRCSEL =0;        // 0: Source Is DCBEVT2 Signal;  1: Source Is DCEVTFILT Signal
        EPwm1Regs.DCBCTL.bit.EVT2FRCSYNCSEL = 1;    // 0: Source is synchronized with EPWMCLK;   1: Source is passed through asynchronously
    
    //---空窗设置---事件过滤--可不配置--------------------------------------------------------------------------
        EPwm1Regs.DCFCTL.bit.SRCSEL = 1;            // 01: Source Is DCAEVT2 Signal
        EPwm1Regs.DCFCTL.bit.BLANKE = 1;            // 1: Blanking window is enabled
        EPwm1Regs.DCFCTL.bit.BLANKINV = 0;          // 0: Blanking window not inverted;  1: Blanking window inverted
        EPwm1Regs.DCFCTL.bit.PULSESEL = 1;          // 01: Time-base counter equal to zero
    
    
    //PWMSYNCSEL
        EPwm1Regs.HRPCTL.bit.PWMSYNCSELX = 0;         // EPWMSYNCPER is defined by PWMSYNCSEL  0 EPWM1
        EPwm1Regs.HRPCTL.bit.PWMSYNCSEL = 1;          // 1:CTR = zero;  0:CTR = PRD
    
        EDIS;
    
        EPwm1Regs.DCFOFFSET =0;
        EPwm1Regs.DCFWINDOW = 20;  //DCFWINDOW*TB_WINDOW(10nS @100Mhz)
    }
    
    struct pid{
        double err;        //定义偏差值
        double err_last;   //定义上一个偏差值
        double err_pre;   //定义上上一个偏差值
        double Kp,Ki,Kd;   //定义比例,积分,微分系数
        double det_err_pi;
        double out_pi;
    } pid;
    //初始化变量
    void pid_init()
    {
    
        pid.err=0;
        pid.err_last=0;
        pid.err_pre=0;
        pid.Kp=1.2;       //kp=0.05;ki=0.01   PI参数调节 0.02 0.0015
        pid.Ki=0.05;
    //  pid.Kd=1;
        pid.out_pi=0;     //初始duty
        pid.det_err_pi=0;
    
    }
    
    interrupt void  adc_isr(void)
    {
      //  i++;
      //  GpioDataRegs.GPASET.bit.GPIO12 = 1;/* Set GPIO12 (for timing purposes) */
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;/* Clr ADCINT1 flag for next SOC */
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;/* Acknowledge interrupt to PIE */
    
        Vo_ave=((AdcaResultRegs.ADCRESULT0)+(AdcaResultRegs.ADCRESULT1)+(AdcaResultRegs.ADCRESULT2)+(AdcaResultRegs.ADCRESULT3))>>2;
        pid.err=Vo_ref-Vo_ave;
        pid.err=0.5*(pid.err+pid.err_last);
    
        if (pid.err<=5&&pid.err>=-5)
               pid.err=0;
        pid.out_pi=pid.out_pi+pid.Kp*(pid.err-pid.err_last)+pid.Ki*pid.err;
        pid.err_last=pid.err;
        if  (pid.out_pi<0)
            pid.out_pi=0;
        if  (pid.out_pi>65530)
            pid.out_pi=65530;
    
    
        Cmpss3Regs.RAMPMAXREFS=(pid.out_pi);   //左移4位  DAC为12位  RAMPMAXREFS的高12位to DACHVALA 所以要左移4位
    
     //   GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;/* Set GPIO12 (for timing purposes) */
       // ;  //观察i值,判断有无进入中断
        return;
    }
    /****************************************************************************
    // No more.
    ****************************************************************************/
    

  • 代码已经上传了

  • 你好,因为我对CMPSS模块的掌握度也不高,所以需要将你的问题升级到英文E2E论坛。但由于现在是美国的节假日期间,没有工程师支持。需要等到1月3日之后才会有工程师开始接管论坛。需要麻烦你在1月3日之后再整理一个帖子发布一下新帖,到时候为你升级。(因为旧贴可能被刷下去,新帖的话系统有提示)