TMS320F280039C的ePWM TZ功能调试记录
本文记录了两种触发源——GPIO和CMPSS来触发ePWM TZ中断的调试记录及心得,理解不一定正确。
·
一、与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中断的诡异现象。
更多推荐



所有评论(0)