一、与F28035不同,F280039c的架构更加灵活,可以通过映射来配置触发源。

根据用户手册提供的框图可知,GPIOx可通过 Input X-BRA 映射到TZ1~3,TRIP1~3,TRIP6,直接作用到ePWM模块。

我使用GPIO9作为触发源。   

    //配置GPIO9
    GPIO_setDirectionMode(9, GPIO_DIR_MODE_IN);//GPIO9作为输入
    GPIO_setPadConfig(9, GPIO_PIN_TYPE_STD);  //将GPIO9配置为标准模式
    GPIO_setPinConfig(GPIO_9_GPIO9);
    GPIO_setQualificationMode(9, GPIO_QUAL_ASYNC);

    void myINPUTXBARINPUT1_init()
    {
        //将GPIO9连接到input X-BAR 的INPUT1
        XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT1, 9);
        //锁定XBAR INPUT1的配置,防止意外修改    
        XBAR_lockInput(INPUTXBAR_BASE, XBAR_INPUT1);
    }

    initEPWM6()
    {
        ......//ePWM其他配置省略

        EPWM_setTripZoneAction(EPWM6_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
        //当TZA事件发生时,强制PWM输出A为低电平
        EPWM_setTripZoneAction(EPWM6_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_HIGH);
        //当TZB事件发生时,强制PWM输出B为高电平

        EPWM_enableTripZoneSignals(EPWM6_BASE, EPWM_TZ_SIGNAL_OSHT1);
        //使能一次性跳闸(One-Shot, OSHT)信号1作为Trip Zone信号源
        EPWM_enableTripZoneInterrupt(EPWM6_BASE, EPWM_TZ_INTERRUPT_OST);
        //使能一次性跳闸(OST)中断
    }

    //使能TZ中断
    Interrupt_enable(INT_EPWM6_TZ);
    Interrupt_register(INT_EPWM6_TZ, &epwm6TZISR);

    //中断程序
    Uint16  u16_GridFlag = 0;
    interrupt void epwm6TZISR(void)
    {
        u16_GridFlag++;
        //ePWM tz在第二组中断
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2);
    }

二、在特定场景,如做过流保护时,可以用CMPSS来作为ePWM TZ源。此时不能通过 input X-BAR来将信号源连接到ePWM模块,而是需要通过EPWMXBA连接到ePWM.

我使用CMPSS3的CTRIPL来作为触发源,CMPSS3_CTRIPL是通道5。

void InitCmpss()
{
    //
    // Note on F28004x there is an additional MUX on the CMPSS ,
    // configured in the analogsysctrl
    //
    ASysCtl_selectCMPLPMux(ASYSCTL_CMPLPMUX_SELECT_2,0x03);

    //
    //Enable CMPSS3
    //
    CMPSS_enableModule(CMPSS3_BASE);

    //
    //Use VDDA as the reference for comparator DACs
    //
    CMPSS_configDAC(CMPSS3_BASE,
                        CMPSS_DACVAL_SYSCLK | CMPSS_DACREF_VDDA |
                        CMPSS_DACSRC_SHDW);

    //
    //Set DAC to H~75% and L ~25% values
    //
    CMPSS_setDACValueLow(CMPSS3_BASE,DCSHORT_CURR);

    //
    // Make sure the asynchronous path compare high and low event
    // does not go to the OR gate with latched digital filter output
    // hence no additional parameter CMPSS_OR_ASYNC_OUT_W_FILT  is passed
    // comparator oputput is "not" inverted for high compare event
    //
    CMPSS_configLowComparator(CMPSS3_BASE, CMPSS_INSRC_DAC | CMPSS_INV_INVERTED);

    //
    // Comparator output is inverted for for low compare event
    //
    //CMPSS_configLowComparator(CMPSS2_BASE, CMPSS_INSRC_DAC | CMPSS_INV_INVERTED);

    CMPSS_configFilterLow(CMPSS3_BASE, 2, 10, 7);

    //
    //Reset filter logic & start filtering
    //
    CMPSS_initFilterLow(CMPSS3_BASE);
    //CMPSS_initFilterLow(CMPSS2_BASE);

    //
    //Comparator hysteresis control , set to 2x typical value
    //
    CMPSS_setHysteresis(CMPSS3_BASE, 2);

    //
    // Clear the latched comparator events
    //
    CMPSS_clearFilterLatchLow(CMPSS3_BASE);
    //CMPSS_clearFilterLatchLow(CMPSS2_BASE);

    //
       // 启用比较器输出到CTRIP信号
       //
       // 确保比较器输出能够传递到CTRIP信号(实测不加这一行好像也能触发中断,还不清楚为啥)
    CMPSS_configOutputsLow(CMPSS3_BASE,(CMPSS_TRIP_FILTER));
    //CMPSS_TRIP_FILTER - 数字滤波器输出(经过滤波处理)
}

void initePWM4()
{
        ......//其他配置省略
        if (base == EPWM4_BASE)
        {
            EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_DCAEVT1, EPWM_TZ_ACTION_LOW);
            
            //将CMPSS_CTRIPL连接到XBAR_TRIP4
            XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX05_CMPSS3_CTRIPL);
            //将XBAR_TRIP4连接到EPWMXBAR05
            XBAR_enableEPWMMux(XBAR_TRIP4, XBAR_MUX05);
            
            //将Trip4输入信号配置为数字比较器A的低输入(DCAL)
            EPWM_selectDigitalCompareTripInput(base, EPWM_DC_TRIP_TRIPIN4, EPWM_DC_TYPE_DCAL);
            //设置当数字比较器A的低输入(DCAL)为低电平时,触发Trip Zone数字比较事件A1
            EPWM_setTripZoneDigitalCompareEventCondition(base, EPWM_TZ_DC_OUTPUT_A1, EPWM_TZ_EVENT_DCXL_LOW);


            //配置ePWM模块,将数字比较器A事件1(DCAEVT1)作为Trip Zone的触发信号源
            EPWM_enableTripZoneSignals(base, EPWM_TZ_SIGNAL_DCAEVT1);
            //启用当DCAEVT1事件发生时产生中断的功能
            EPWM_enableTripZoneInterrupt(base, EPWM_TZ_INTERRUPT_DCAEVT1);
        }
}

Uint16  u16_DC_ShortFlag = 0;
interrupt void epwm4TZISR(void)
{
    u16_DC_ShortFlag ++;

    EPWM_clearTripZoneFlag(EPWM4_BASE, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_DCAEVT1));
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2);
}

    Interrupt_enable(INT_EPWM4_TZ);
    Interrupt_enable(INT_EPWM6_TZ);

三、注意事项

是否可以说明,ePWM X-BAR必须要经过DC子模块才能作用于ePWM TZ呢?

要先初始化CMPSS再初始化ePWM,否则可能出现刚上电,就触发TZ中断的诡异现象。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐