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.

TMS320F28377S: TMS320F28377S: issue in use of digital filter after Comparator (not always switch of) -->Peak-Current-Mode Slope-Compensation

Part Number: TMS320F28377S
Other Parts Discussed in Thread: C2000WARE

hello Community,

What I got:
At the moment I got a working Peak-Current with slope-compensation.
The PWM starts (ON) at the beginning of the PWM-period with a CounterCompare.
The Off-Switching happens when the meausred Signal is same or higher the Comparator-Value. Positive-Pin is the measured external signal and the Negative Pin is feed by DAC-Output. The DAC-Value is configured with the internal Ramp-Generator. (At the Beginning of the PWM-Period is a fine working blanking-window)

Until now the Comparator-Sts is sychron read and feed through x-bar and so into Trip-Zone as a CBC-Event.

I noticed, that my DIGITAL FILTER right after the comparator is not working. I need this Filter to avoid peaks from 2nd switching device.


What I want:
I read, that I have to configure this
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = CTRIP_SYNCH

to this
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = CTRIP_FILTER;
or this
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = CTRIP_LATCH;

to use the right output of the digital Filter.

For some unkown reason the Switching-Off not happen often enough. The picture in this post shows it. Every PWm-Period should the PWM switch off at the same ponit, but nothings happen.

Channel1 (yellow) -PWM2A

Channel3(blue)-The input-Signal for the Comparator

Channel4(green)-PWM7A -shows the Beginnning of a new PWM-period and covers the on the ON-Time the Blanking-Window

After The Green-PWM rises the DAC produces 3,3V-Output and this falls until a new PWM-period stars to 1,66V

Here I put the relevant Code:

 Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;

    Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = NEGIN_DAC;

    Cmpss1Regs.COMPDACCTL.bit.SELREF = REFERENCE_VDDA;


    Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = CTRIP_FILTER;

    Cmpss1Regs.CTRIPHFILCTL.bit.FILINIT=1;//Aktivierung des zusätzlichen Filters
    Cmpss1Regs.CTRIPHFILCTL.bit.SAMPWIN=15; //Es müssen 6 Samples +Sample high sein zum Durschalten
    Cmpss1Regs.CTRIPHFILCTL.bit.THRESH=10; //Die Mehrheit also 4-Abtasttung müssen wenigstens high sein
    Cmpss1Regs.CTRIPHFILCLKCTL.bit.CLKPRESCALE=0; //2-->es wird nur jede zweite Periode ein Sample generriert (system clk)
    Cmpss1Regs.COMPSTSCLR.bit.HLATCHCLR=1;//HSYNCCLREN=1;//jeder PWMSYNC will reset latch
    Cmpss1Regs.COMPSTSCLR.bit.HSYNCCLREN=1;

    Cmpss1Regs.RAMPMAXREFS=65535;//2048; //Shadow-Register für die maximale Rampe -->Regelung -->Einstellung für 15A bei 00A-30A möglicher Strom
    Cmpss1Regs.RAMPMAXREFA=65535;//2048; //maximaler Rampen-Wert Startwert

    Cmpss1Regs.RAMPDECVALA=33; //in 2000 Schritten müssten nur 2048 Stufen herunter gezählt werden -->Rampe so -15A
    Cmpss1Regs.RAMPDECVALS=33;//Shadow-Register

//configuration in ePWM
        EPwm2Regs.TZDCSEL.bit.DCBEVT2 = TZ_DCBH_HI;		//CBC-Event wird ausgelöst, wenn Comparator B high (1) ist

        EPwm2Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 3;		//Trip 4 wird in das Digital-Compare-Modul geladen


        EPwm2Regs.TZSEL.bit.DCBEVT2 = 1;				//CBC-Event wird bei einem Signal vom Komparator (außerhalb des Filters) gesetzt

        EPwm2Regs.DCBCTL.bit.EVT2SRCSEL = 1;					//CBC-Events werden im digitalen Filter vorgefiltert
        EPwm2Regs.DCBCTL.bit.EVT2FRCSYNCSEL = DC_EVT_SYNC;		//CBC-Events werden synchron erezugt zur TBCLK

        EPwm2Regs.HRPCTL.bit.PWMSYNCSEL=0;						//PWMSYNC = CNT_zero signal pulse

        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;	

I hope Somebody can help me.

Regards Basti

  • Hi Basti,

    I'll be glad to help. Not exactly clear on what you want to happen and what you think is happening. The CMPSS is designed to work well with the EPWM but since the EPWM is it's own complicated module, it's usually a good idea to scope signals going into the EPWM from the CMPSS in order to isolate where the problem might lie.

    So keep your code configuration the same and add this: Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = CTRIP_FILTER. You will also need to configure the OUTPUTXBAR to route it to a GPIO. If you need help on how to route the CMPSS output directly to the GPIO, you can follow the example "cmpss_asynch_cpu01.c" in C2000Ware.

    Basically, i want you to send the same CMPSS output to both the EPWM and GPIO. Plot the GPIO output on the scope and this should make things a little more clear.

  • Hello,

    thanks for this fast Response.
    This is really good tip for testing. (I would like to vote for this comment with ++.)
    Tomorrow I will test it.

    (I want to avoid Filter-Results at the End of the PWM, that influences the next PWM.) At the picture 2 of 5 PWMs switch OFF because the Compartor (inkl. decremting Ramp) fill the Filter with enough high Samples. These trips a Event that shutdown the PWM.

    3 of 5 PWMs never switched OFF and I guess this is a Problem with reseting the latch or PWM-Sync don´t work. Or something else....
    Without using the Filter all works fine and every PWM switched at the same Time in each cycle.
    I want to understand how I can get the same result by collecting Samples (for avoiding peaks in Voltage and current) before the Trip-Event happens.

    Would this Code be suitable?

    Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = CTRIP_FILTER; //Filter-STS to Output
    OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX0 = 0; //Link CTRIPOUTH and OutputXBAR3
    OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX0 = 1; //Enable OutputXBAR3 Mux
    GPIO_SetupPinMux(15, 0, 1); //PIN15,CPU1,MUX-PIO-Option is 1

    Regards Basti

  • Basti,

    It would also be good to compare your CMPSS Digital Filter initialization sequence against the TRM recommendation:

    -Tommy

  • Hello tlee,
    I used the TRM recommendation to config, but under point 4, there is for me too less information to handle it right.
    The behaviour of the RAMP and the genereal CMPSTS at different events for me is not clear. PWM-Sync should reset both, but the DIGITAL Filter have to run some cycles to produce a low Output (run out of high Samples)and so on...
    How and when to reset the LATCH of CMPSTS right and whats happend in the crossing of PWM END and START in Combine with a Blanking-Window....
    Regards Basti
  • Basti,

    To clear COMPSTS during initialization, you can reset the RAMP generator by setting the DACSOURCE bit.

    For clearing COMPSTS during operation, I would encourage you to see the CMPSS advisories in the errata in case you are experiencing a known issues.

    -Tommy

  • My Code, to show what comes out the CMPSS, don't work. The Pin 15 is still low.
    Can anyone help me?
    I insert the whole Code here in TXT-file.

    In the picture:
    ch1(yellow) PWM2A
    ch3(blue) Signal-Generator Ramps from 1,66V to 3,3V with 100kHz asychn to the PWM and Board
    ch4(green) only PWM7 that shows every new PWM-Cycle (sync to PWM2)
    -->the green On-Time also covers the Blanking-Window-Time of PWM2

    The internal for comparator is feed by DAC that produce a Output with falling Ramp from 2,425V to 1,6V.
    The PWM in my opion have to switch more OFF.

    //###########################################################################
    //Peak-Current-Mode mit Sllope-Compensation
    //-1phasige L�sung
    //-Spulenstrom-Messbereich von -30A bis 30A (bzw. 0 bis 60A, da nur positive verarbeitet werden k�nnen)
    // Included Files
    //
    #include "F28x_Project.h"
    
    //
    // Defines
    //
    #define EXTTrig     // Leave Uncommented for Testing with External Trigger.
    #define DB_UP          	   1
    //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
    //
    // Globals
    //
    Uint32  EPwm7TZIntCount;
    Uint32  EPwm2TZIntCount;
    Uint16 EPwm2_DB_Direction;
    Uint16 EPwm7_DB_Direction;
    //
    // Function Prototypes
    //
    //void InitEPwm7Example(void);
    void InitEPwm2Example(void);
    void InitEPwm7Example();
    //raus gestrichen
    //void InitTzGpio(void);
    //__interrupt void epwm7_tzint_isr(void);
    __interrupt void epwm2_tzint_isr(void);
    __interrupt void epwm7_isr(void);
    void InitEPwmGpio_TZ(void);
    void InitCMPSS(void);
    //
    // Main
    //
    void main(void)
    {
    //
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the F2837xS_SysCtrl.c file.
    //
        InitSysCtrl();
    //Diese komplexe Funktion befolgt folgendes
    //OSCCLK=!PLLSYSCLK -->PLLSYSCLK=100MHz (wenn die Doku nur von SYSCLK redet)
    //Wichtig um von den richtigen Takt-Frequenzen auszugehen (Bsp. muss ePWMCLK/2=PLLSYSCLK)
    //
    // Step 2. Initialize GPIO:
    // This example function is found in the F2837xS_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    //
        InitGpio();
    
    //
    // Einschalten der CLKs der PWM-Module
    //
        CpuSysRegs.PCLKCR2.bit.EPWM7=1;
        CpuSysRegs.PCLKCR2.bit.EPWM2=1;
    
    //
    // For this case just init GPIO pins for ePWMs
    //
        InitEPwmGpio_TZ();
    //	Zus�tzlicher PIN zur Analyse der Ausgae des Comparators CMPSS1H
        GPIO_SetupPinMux(15, 0, 1); //PIN15,CPU1,MUX-PIO-Option is 1
    //
    // 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 F2837xS_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 F2837xS_DefaultIsr.c.
    // This function is found in F2837xS_PieVect.c.
    //
        InitPieVectTable();
    //
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
    //Trip-Zones Interrupts
        EALLOW; // This is needed to write to EALLOW protected registers
        PieVectTable.EPWM2_TZ_INT = &epwm2_tzint_isr;
        PieVectTable.EPWM7_TZ_INT = &epwm7_isr;
        EDIS;   // This is needed to disable write to EALLOW protected registers
    //
    // Step 4. Initialize the Device Peripherals:
    //
    //  Alles zwischen den ******* wird synchron ausgef�hrt durch die Sync Befehle
        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
        EDIS;
    //Intitialisierung/Einstellung der EPWM2 und der EPWM7
        InitEPwm7Example();
        InitEPwm2Example();
    // Configure Comparator COMP1H to accept POS input from pin and NEG input from DAC
    //sowie Slope-Compensation Einstellungen
        InitCMPSS();
    
        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =1;
        EDIS;
    // ******
    
    //
    // Step 5. User specific code, enable interrupts:
    //
        EPwm7TZIntCount = 0;
        EPwm2TZIntCount = 0;
    //
    // Enable CPU INT2 which is connected to EPWM1-3 INT:
    //
        IER |= M_INT1;//Interrupt f�r ePWM2
        IER |= M_INT6;//Interrupt f�r ePWM7
    //
    // Enable EPWM INTn in the PIE: Group 3 interrupt 1-3
    //
        PieCtrlRegs.PIEIER2.bit.INTx7 = 1;
        PieCtrlRegs.PIEIER2.bit.INTx2 = 1;
    //
    // 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");
        }
    }
    
    //
    // epwm2_tzint_isr - EPWM2 TZ ISR
    //
    __interrupt void epwm2_tzint_isr(void)
    {
    	EPwm2TZIntCount++;
        //
        // Clear the flags - we will continue to take
        // this interrupt until the TZ pin goes high
        //
        EALLOW;
        EPwm2Regs.TZCLR.bit.CBC = 1;
        //L�scht des CBC -Flag und es kann ein weiteres Interrupt erfolgen
    
        //Alternativ CBCPULSE nutzen, da Interrupt unabh�ngig
        //EPwm2Regs.TZCLR.bit.CBCPULSE = 0;
        EDIS;
        //
        // Acknowledge this interrupt to receive more interrupts from group 2
        //
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
    }
    
    
    //
    // InitEPwm2Example - Initialize EPWM2 configuration
    //
    void InitEPwm2Example()
    {
    
        EALLOW;//gesch�tze Register �berschreiben
        // Enable TZ1 as a cycle-by-cycle trip sources
        EPwm2Regs.TZSEL.bit.CBC1 = 1;
        //
        //Befehle zum Sezten/L�schen der PWMs
        //nur f�r Trip-Evente
        EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;		//ePWM2A l�schen bei Trip
        EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_HI;		//ePWM2B setzen bei Trip
        //
        // Enable TZ interrupt f�r CBC-Events
        EPwm2Regs.TZEINT.bit.CBC = 1;
        EPwm2Regs.TZCLR.bit.CBCPULSE = 0; //R�cksetzetn bei Zero und PRD
        EDIS;
        //Einstellung der PWM-Periodendauer und Phasenverschiebung
        //PWM frequency = 1/( (TBPRD + 1 ) � TTBCLK )	//	gilt nur f�r das Hochz�hlen
        //TBPRD= (1/(PWM frequency � TTBCLK ))-1	 //	TTBCLK=1/TBCLK -->20ns=1/(50MHz)
        //TBPRD= (1/(100kHz � 20ns ))-1=499
        EPwm2Regs.TBPRD = 499;						//499, da hochgez�ht wird (siehe Rechnung)// Set timer period
        EPwm2Regs.TBPHS.bit.TBPHS = 0x0000;         // Phase is 0
        EPwm2Regs.TBCTR = 0x0000;                   // Clear counter
        //
        // Setup TBCLK
        EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;		// Count up
        EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;			// Disable phase loading
        EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;		// Clock ratio to SYSCLKOUT //Wert/Teiler 1
        EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;			// Slow just to observe on //Wert/Teiler 1
        //ePWM laufen wie alle Pheripherie-Module mit eigener CLK (Processor(PLLCLK)=100MHz und ePWM-Modul=50MHz[EPWMCLK])
        //Berechnung der zeitlichen Aufl�sung der ePWM (TBCLK)
        //TBCLK = EPWMCLK / (HSPCLKDIV x CLKDIV)//Formel aus Referenz-Guide
        //TBCLK = 50MHz / (1 x 1)=50MHz //Formel
        //Hinweis:PLLCLK siehe oben
        //
        // Setup compare
        EPwm2Regs.CMPA.bit.CMPA = 450;//Aussteuergrad unter 1, 5*20ns=100ns lang wird vor dem Ende der PWM-Periode PWM2A ausgeschaltet (PWM2B ein) -->max. Aussteuergrad 99%
        //Dummy-Wert kann genutzt werden um den Aussteuergrad zu begrenzen und unter 1 zu halten
        EPwm2Regs.CMPC= 485;//Erzwingen PWM-SYNC
        //EPwm2Regs.EPWMSYNCOUTEN.bit.CMPCEN=1;//EPWMxSYNCO signal is pulsed for one PWM clock period upon a time-base counter equal to counter compare C event
        //neben dem CMPA gibt es noch den CMPB, beim Erreichen dieser Compar-Werte k�nnen Aktionen �ber Action-Qualifier-Modul erfolgen
        //weiter gibt es noch CMPC und CMPD, welche genutzt werden k�nnen um z.B. eine PWM-Sync zu erzwingen
    
        // Set actions
        EPwm2Regs.AQCTLB.bit.ZRO =AQ_CLEAR; 	//Beim Counter-Wert Null (Beginn jeder PWM-Periode) wird PWM2B gel�scht
    	EPwm2Regs.AQCTLA.bit.ZRO =AQ_SET; 		//Beim Counter-Wert Null (Beginn jeder PWM-Periode) wird PWM2A gesetzt
    	//Begrenzung des Aussteuergrades mittels CMPA
    	EPwm2Regs.AQCTLB.bit.CAU =AQ_SET; 		//Beim Counter-Wert CMPA (nur beim Hochz�hlen) wird PWM2B gesetzt
    	EPwm2Regs.AQCTLA.bit.CAU =AQ_CLEAR; 	//Beim Counter-Wert CMPA (nur beim Hochz�hlen) wird PWM2A gel�scht
    
     /////////////////////////////////////////////////////////////////////////////////
    		//Hinzuf�gen der Deadband Einstellungen
    		//Achtung bei Verwendung auf Polarit�ts-�nderung beachten
            // Active Low complementary PWMs - setup the deadband
            //
            //EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;	//Aktiviert das Deadband-Modul
            //EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HI;			//Active high (AH) mode. Neither EPWMxA nor EPWMxB is inverted (default)
            //EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;			//EPWMxA In (from the action-qualifier) is the source for both falling-edge and rising-edge delay.
            //EPwm2Regs.DBRED.bit.DBRED = 8;					//Rising edge delay value
            //EPwm2Regs.DBFED.bit.DBFED = 8;					//Falling edge delay value
            //EPwm2_DB_Direction = DB_UP;						//es wird hochgez�hlt
            //
            // Interrupt where we will modify the deadband
            //EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // Select INT on Zero event
            //EPwm2Regs.ETSEL.bit.INTEN = 1;                // Enable INT
            //EPwm2Regs.ETPS.bit.INTPRD = ET_3RD;           // Generate INT on 3rd event
            //////////////////////////////////////////////////////////////////////////
    		//
    		/////////////////////////////////////////////////////////////////////////
    		//Einstellungen f�r die Weiterleitung aus der x-Bar ins Trip-Zone-Sub-Modul
            EALLOW;
            //
            //Configure DCB to be TRIP4
            //EPwm8Regs.TZDCSEL.bit.DCBEVT1 = TZ_DCBH_HI;	//ONS-Event wird ausgel�st
    
            EPwm2Regs.TZDCSEL.bit.DCBEVT2 = TZ_DCBH_HI;		//CBC-Event wird ausgel�st, wenn Comparator B high (1) ist
            //Digital Compare Output B Event 2 Selection-->DCBH = high, DCBL = don't care
    
            EPwm2Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 3;		//Trip 4 wird in das Digital-Compare-Modul geladen
            //3=nur Trip 4 ist aktiv, (ab Trip 4 sind CMPSSx-Events), um ein Filtern mit dem Blanking-Window zu erm�glichen
    
            //F�r den kombinierten Input von Trip4 und einem weiteren Trip (bewirken nur gemeinsam ein Event)
            //EPwm2Regs.DCTRIPSEL.bit.DCBHCOMPSEL =15; 		//muss auf folgenden Wert gesetzt werden
            //EPwm2Regs.DCBHTRIPSEL.bit.TRIPINPUT4 = 1;		//Input 1 selected as combinational ORed input to DCBH mux
    
            //Auswahl was f�r ein Event aus dem digitalen Filter kommt
            //Enable DCAEVT2 as a CBC trip source for this ePWM module
            EPwm2Regs.TZSEL.bit.DCBEVT2 = 1;				//CBC-Event wird bei einem Signal vom Komparator (au�erhalb des Filters) gesetzt
    
            //
            //Configure DCB path to be unfiltered & async
            EPwm2Regs.DCBCTL.bit.EVT2SRCSEL = 1;					//CBC-Events werden im digitalen Filter vorgefiltert
            EPwm2Regs.DCBCTL.bit.EVT2FRCSYNCSEL = DC_EVT_SYNC;		//CBC-Events werden synchron erezugt zur TBCLK
    
            //Synchronisierung mit CMPSS -->wichtig da in Doku nur unter HRPWM dokumentiert
            EPwm2Regs.HRPCTL.bit.PWMSYNCSEL=0;						//PWMSYNC = CNT_zero signal pulse
            EPwm2Regs.HRPCTL.bit.PWMSYNCSEL=4;						//PWMSYNC bei CMPC
    
            CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;					//EPWM Time Base Clock sync: When set PWM time bases of all the PWM modules start counting.
            //
            //Configure TRIP4 to be CTRIP1H
            EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0 = 0;
    
            //
            //Enable TRIP4 Mux for Output
            EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX0 = 1;
    
    /////////////////////////////////////////////////////////////////////////////////
            //Hinzuf�gen des Blanking
            EPwm2Regs.DCFCTL.bit.BLANKE= 1;		//Aktiviert Blanking-Window
            EPwm2Regs.DCFCTL.bit.PULSESEL=1; 	//Startet mit Zero
            EPwm2Regs.DCFCTL.bit.SRCSEL=3; 		//Filter Block Signal Aussuchen --> DCBEVT2
            EPwm2Regs.DCFOFFSET=0;				//Fenster wird null TBCLK von PRD statt finden alternativ geht auch CTR
            EPwm2Regs.DCFWINDOW=60;				//Setzen eHines Blanking Fenster mit 60 = 1200ns --> 50Mhz = 20e-9 s --> 60 * 20e-9 = 1200ns
    ////////////////////////////////////////////////////////////////////////////////
            EDIS;
    }
    
    
    //
    // InitEPwmGpio_TZ - Initialize EPWM1A and EPWM2A GPIOs
    //
    void InitEPwmGpio_TZ(void)
    {
        EALLOW;
        GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;    // Disable pull-up on GPIO2 (EPWM2A)
        GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;   // Configure GPIO2 as EPWM2A
        GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;    // Disable pull-up on GPIO3 (EPWM2B)
        GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;   // Configure GPIO3 as EPWM2B
    
        GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;    // Disable pull-up on GPIO10 (EPWM7A)
        GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 1;   // Configure GPIO10 as EPWM7A
        GpioCtrlRegs.GPAPUD.bit.GPIO13 = 1;    // Disable pull-up on GPIO11 (EPWM7B)
        GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 1;   // Configure GPIO11 as EPWM7B
    
        GpioCtrlRegs.GPAPUD.bit.GPIO15 = 1;    // Disable pull-up on GPIO15 (EPWM8B)
        GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 1;   // Configure GPIO15 as EPWM8B
        EDIS;
    }
    
    
    // InitCMPSS - Initialize CMPSS1 and configure settings
    //
    void InitCMPSS(void)
    {
        EALLOW;
    
        Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;					//Enable CMPSS
        //////////////////////////////////////////////////////////////////////////////////////////
        //Nur Configuration des CMPSS H - dieser l�st gefilterte CBC-Events aus
        //////////////////////////////////////////////////////////////////////////////////////////
        Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = NEGIN_DAC;			//NEG signal comes from DAC
        Cmpss1Regs.COMPDACCTL.bit.SELREF = REFERENCE_VDDA;		//Use VDDA as the reference for DAC
        //Set DAC
        //Cmpss1Regs.DACHVALS.bit.DACVAL = 1048;//bei aktiver Rampe wird dies nicht mehr ben�tigt
    
        //Bestimmen welches Ereignis hinter dem Comparator den Ausgang spei�t (und welcher Ausgang)
        //Nur CTRIPH wird zu ePWM-X-Bar weiter gegeben --> CTRIPOUTH wird nicht ben�tigt
        Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = CTRIP_FILTER;
        //Optionen
        //CTRIP_ASYNCH= sofortige Weitergabe f�r z.B. ONS-Events
        //CTRIP_SYNCH= sofotige Weitergabe synchrin mit der SYSCLK
        //CTRIP_FILTER= nach dem digitalen Filter sobald der Threshold �berwunden ist
        //CTRIP_LATCH= Status nach dem Filter wird festgehalten (aktiv nur) und muss h�ndisch oder mit anderen Ereignissen zur�ck gesetzt werden
    /////////////////////////////////////////////////////////////////////////////////
    //Filter f�r Comparator
        Cmpss1Regs.CTRIPHFILCTL.bit.FILINIT=1;			//Aktivierung des zus�tzlichen Filters
        Cmpss1Regs.CTRIPHFILCTL.bit.SAMPWIN=15;			//Es m�ssen 15 Samples +1 Sample im FIFO-Fenster sein
        Cmpss1Regs.CTRIPHFILCTL.bit.THRESH=10;			//Die Mehrheit also (10 Samples) m�ssen wenigstens high sein
        Cmpss1Regs.CTRIPHFILCLKCTL.bit.CLKPRESCALE=0;	//0-->es wird nur jede Periode ein Sample generriert (system clk)
        Cmpss1Regs.COMPSTSCLR.bit.HSYNCCLREN=1;			//jeder PWMSYNC will reset latch
        Cmpss1Regs.COMPSTSCLR.bit.HLATCHCLR=1;//Zum h�ndischen l�schen, des Statuses
        /////////////////////////////////////////////////////////////////////////////////
        //Zusatz-Funktionalit�t zur Untersuchung und Inbetriebnahme
        //Durch die nachfolgende Zeilen kann das Ergebnis des Comparators direkt auf einen Port der GPIOs gelegt werden
        //CTRIPHSEL und CTRIPOUTHSEL sollten die gleichen Ergebnisse weiter leiten, um die ergebnisse auszuwerten
        Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = CTRIP_FILTER; //Filter-STS to Output
        OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX0 = 1; //Link CTRIPOUTH and OutputXBAR3
        OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX0 = 1; //Enable OutputXBAR3 Mux
        /////////////////////////////////////////////////////////////////////////////////
        //Rampe f�r Comparator
        Cmpss1Regs.COMPDACCTL.bit.DACSOURCE=1;			//Aktivierung der Rampe als DAC-Quelle
        Cmpss1Regs.COMPDACCTL.bit.RAMPSOURCE=1;			//Wird mit dem PWMSync-Signal 2 synchronisiert
        //es werden 12-Bit nur genutzt im DACH (16-Bit f�r Berechnungen nutzen!)
        Cmpss1Regs.RAMPMAXREFS=49151;//65535;					//Shadow-Register f�r die maximale Rampe -->Regelung -->Einstellung f�r 15A bei -30A - 30A m�glicher Strom (oder 0A - 60A)
        Cmpss1Regs.RAMPMAXREFA=49151;//65535;					//maximaler Rampen-Wert Startwert
        //bei 100MHz Sysclk ergebn sich 1000 cycles pro PWM-Periode (500*20ns=10us --> 10us/100MHz=1000)
        //um innerhalb der PWM Periode von 15A auf 0A =~16,384
        Cmpss1Regs.RAMPDECVALA=17;						//in 1000 Schritten m�ssten nur 16384 Stufen herunter gez�hlt werden -->Rampe so -15A
        Cmpss1Regs.RAMPDECVALS=17;						//Shadow-Register
        //1000*16=16000(16-Bit) -->1000(12-Bit)-->DAC-Wert=~0,80567V-->Rampe von 14,648A
        //1000*17=17000(16-Bit) -->1062(12-Bit)-->DAC-Wert=~0,85561V-->Rampe von 15,557A
        //Cmpss1Regs.RAMPDLYA=0; //hiermit kann das Subrtahiern sp�ter gesatrte werden (einmaliger Delay pro Periode)
        //besitzt ebenfalls ein Shadow-Register
    
        //////////////////////////////////////////////////////////////////////////////////////////
        //Ab hier Configuration des CMPSS L - dieser l�st ungefilterte ONS-Events aus
        //////////////////////////////////////////////////////////////////////////////////////////
        Cmpss1Regs.COMPCTL.bit.COMPLSOURCE = NEGIN_DAC;			//NEG signal comes from DAC
        Cmpss1Regs.COMPDACCTL.bit.SELREF = REFERENCE_VDDA;		//Use VDDA as the reference for DAC
        //Set DAC
        Cmpss1Regs.DACLVALS.bit.DACVAL = 4095;//Strom auf 30A zu begrenzen (max.DAC-Wert)
        //Sollte dieser Wert kurz erreicht werden, dann sollen beiden Schalter ausgeschaltet werden!!!
        //Nur der h�ndische Neustart kann das beenden oder ein manueller Befehl -->Siehe Eisntellungen im EPWM2A-Modul
    
        //Bestimmen welches Ereignis hinter dem Comparator den Ausgang spei�t (und welcher Ausgang)
        //Nur CTRIPH wird zu ePWM-X-Bar weiter gegeben --> CTRIPOUTH wird nicht ben�tigt
        Cmpss1Regs.COMPCTL.bit.CTRIPLSEL = CTRIP_ASYNCH;
        //////////////////////////////////////////////////////////////////////////////////////////
        EDIS;
    }
    
    //EPM7 nur f�r Test-Zwecke
    void InitEPwm7Example()
    {
    	EALLOW;
    
        EPwm7Regs.TBPRD = 499;                       // Set timer period
        EPwm7Regs.TBPHS.bit.TBPHS = 0x0000;           // Phase is 0
        EPwm7Regs.TBCTR = 0x0000;                     // Clear counter
        //
        // Setup TBCLK
        //
        EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//DOWN; // Count up
        EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
        EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT//am ende von 4 auf 1 geandert
        EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV1;          // Slow just to observe on
                                                       // the scope
        //
        // Setup compare
        //
        //EPwm2Regs.CMPA.bit.CMPA = 125;
    //Anpassung auf Regeler
        EPwm7Regs.CMPA.bit.CMPA = 60;
        //EPwm7Regs.CMPB.bit.CMPB = 125;
        //
        // Set actions
        //
        //EPwm7Regs.AQCTLB.bit.ZRO =AQ_CLEAR;
    	EPwm7Regs.AQCTLA.bit.ZRO =AQ_SET;
        //EPwm7Regs.AQCTLA.bit.CAU = AQ_SET;            // Set PWM2A on Zero
        EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR;
        //EPwm7Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // Set PWM2A on Zero
        //EPwm7Regs.AQCTLB.bit.CAD = AQ_SET;
        //
    
        // Active Low complementary PWMs - setup the deadband
        //
    
        EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
        EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//DB_ACTV_LOC;
        EPwm7Regs.DBCTL.bit.IN_MODE = DBA_ALL;
        EPwm7Regs.DBRED.bit.DBRED = 0;//EPWM2_MIN_DB;
        EPwm7Regs.DBFED.bit.DBFED = 0;//EPWM2_MIN_DB;
        EPwm7_DB_Direction = DB_UP;
        //
        // Interrupt where we will modify the deadband
        //
    
    
        EPwm7Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // Select INT on Zero event
        EPwm7Regs.ETSEL.bit.INTEN = 1;                // Enable INT
        EPwm7Regs.ETPS.bit.INTPRD = ET_3RD;           // Generate INT on 3rd event
        EDIS;
    }
    __interrupt void epwm7_isr(void)
    {
    
        EPwm7Regs.ETCLR.bit.INT = 1;
    
    }
    

  • This is what I get without Filter-Use...

    And this is what I more expected.

  • Basti,

    I have looked through your attached code. The code you have that enables the comparator output on GPIO is not correct. The code below should work.

    OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX0 = 0; // Setup MUX0 as CMPSS1.CTRIPOUTH

    OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX0 = 1; // Enable MUX0

    GPIO_SetupPinMux(14,GPIO_MUX_CPU1,6); // Setup GPIO14 as OutputXbar3

    Also, the filter initialization sequence you have is not correct. As Tommy highlighted, this is important to follow so filter behavior will be as expected. To correctly initialize the filter, you can easily follow the initialize sequence done in the "cmpss_digital_filter_cpu01" example in C2000Ware.
  • Hi Frank,
    thanks for your help. Next Week I can test this.

    I checked my code twice for the Cmpss, but I see no difference between my code and the initializing or the "cmpss_digital_filter_cpu01".

    Can check my code again please?

    Ignore my comments...

    Regards Basti



    void InitCMPSS(void) { EALLOW; Cmpss1Regs.COMPCTL.bit.COMPDACE = 1; //Enable CMPSS Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = NEGIN_DAC; //NEG signal comes from DAC Cmpss1Regs.COMPDACCTL.bit.SELREF = REFERENCE_VDDA; //Use VDDA as the reference for DAC Cmpss1Regs.CTRIPHFILCTL.bit.FILINIT=1; //Aktivierung des zusätzlichen Filters Cmpss1Regs.CTRIPHFILCTL.bit.SAMPWIN=15; //Es müssen 15 Samples +1 Sample im FIFO-Fenster sein Cmpss1Regs.CTRIPHFILCTL.bit.THRESH=10; //Die Mehrheit also (10 Samples) müssen wenigstens high sein Cmpss1Regs.CTRIPHFILCLKCTL.bit.CLKPRESCALE=0; //0-->es wird nur jede Periode ein Sample generriert (system clk) Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = CTRIP_FILTER;
    Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = CTRIP_FILTER; //Filter-STS to Output OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX0 = 0; //Link CTRIPOUTH and OutputXBAR3 OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX0 = 1; //Enable OutputXBAR3 Mux Cmpss1Regs.COMPDACCTL.bit.DACSOURCE=1; //Aktivierung der Rampe als DAC-Quelle Cmpss1Regs.COMPDACCTL.bit.RAMPSOURCE=1; //Wird mit dem PWMSync-Signal 2 synchronisiert Cmpss1Regs.RAMPMAXREFS=49151;//65535; //Shadow-Register für die maximale Rampe -->Regelung -->Einstellung für 15A bei -30A - 30A möglicher Strom (oder 0A - 60A) Cmpss1Regs.RAMPMAXREFA=49151;//65535; //maximaler Rampen-Wert Startwert Cmpss1Regs.RAMPDECVALA=17; //in 1000 Schritten müssten nur 16384 Stufen herunter gezählt werden -->Rampe so -15A Cmpss1Regs.RAMPDECVALS=17; //Shadow-Register EDIS; }

  • Basti,

    You are initializing the filter before it is configured.

    Cmpss1Regs.CTRIPHFILCTL.bit.FILINIT = 1; should be called after the filter is configured. Also, you should make filter initialization code the last CMPSS configuration code. What i mean by this is, lines 8 to 12 should be relocated to after RAMPGEN is configured.
  • Hi Frank,
    thanks for this helpful reply!
    I will test this as fast as possible, for me it was not apparent that the these steps have to take in this discret order. Thanks!
    Now I get it.
    Regards,
    Basti
  • Basti,

    Because the filter has memory, initialization sequence is important. It might not be where your problem lies but let us know what you find from the test.