主题中讨论的其他器件:C2000WARE、 LAUNCHXL-F280025C
您好!
我使用的是 Motorcontrol SDK 示例通用电机控制实验室、配置了 nFault GPIO34来触发 ePWM 模块并关闭控制器。
我现在想添加另一个 GPIO 跳闸输入、但无法使其正常工作。
我所做的工作:
在 hal.h 中-将 GPIO 25配置为额外的 TRIP 引脚:
//! \brief Defines the gpio for the nFAULT of Power Module #define MTR1_PM_nFAULT_GPIO 34 //! \brief Defines the gpio for the nFAULT of Power Module #define MTR1_PM_nFAULT_2_GPIO 25 ... //------------------------------------------------------------------------------ // XBAR-EPWM #define MTR1_XBAR_TRIP_ADDRL XBAR_O_TRIP7MUX0TO15CFG #define MTR1_XBAR_TRIP_ADDRH XBAR_O_TRIP7MUX16TO31CFG #define MTR1_IDC_XBAR_EPWM_MUX XBAR_EPWM_MUX05_CMPSS3_CTRIPL // CMPSS3-LP #define MTR1_IDC_XBAR_MUX XBAR_MUX05 // CMPSS3-LP #define MTR1_IU_XBAR_EPWM_MUX XBAR_EPWM_MUX00_CMPSS1_CTRIPH // CMPSS1-HP #define MTR1_IV_XBAR_EPWM_MUX XBAR_EPWM_MUX04_CMPSS3_CTRIPH_OR_L // CMPSS3-HP&LP #define MTR1_IW_XBAR_EPWM_MUX XBAR_EPWM_MUX01_CMPSS1_CTRIPL // CMPSS1-LP #define MTR1_IU_XBAR_MUX XBAR_MUX00 // CMPSS1-HP #define MTR1_IV_XBAR_MUX XBAR_MUX04 // CMPSS3-HP&LP #define MTR1_IW_XBAR_MUX XBAR_MUX01 // CMPSS1-LP #define MTR1_XBAR_INPUT1 XBAR_INPUT1 #define MTR1_XBAR_INPUT2 XBAR_INPUT2 #define MTR1_TZ_OSHT1 EPWM_TZ_SIGNAL_OSHT1 #define MTR1_TZ_OSHT2 EPWM_TZ_SIGNAL_OSHT2 #define MTR1_XBAR_TRIP XBAR_TRIP7 #define MTR1_DCTRIPIN EPWM_DC_COMBINATIONAL_TRIPIN7 #define MTR1_IU_XBAR_OUT_MUX XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH // CMPSS1-HP #define MTR1_IV_XBAR_OUT_MUX XBAR_OUT_MUX04_CMPSS3_CTRIPOUTH_OR_L // CMPSS3-HP&LP #define MTR1_IW_XBAR_OUT_MUX XBAR_OUT_MUX01_CMPSS1_CTRIPOUTL // CMPSS1-LP
在 hal.c 中-将 GPIO25引脚配置为输入(我使用外部上拉电阻):
GPIO_setPinConfig(GPIO_25_GPIO25);
GPIO_setDirectionMode(25, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(25, GPIO_PIN_TYPE_STD);
在 hal.c 中-设置跳闸区域:
XBAR_setEPWMMuxConfig(MTR1_XBAR_TRIP, MTR1_IU_XBAR_EPWM_MUX);
// Configure TRIP7 to be CTRIP1H and CTRIP1L using the ePWM X-BAR
XBAR_setEPWMMuxConfig(MTR1_XBAR_TRIP, MTR1_IV_XBAR_EPWM_MUX);
// Configure TRIP7 to be CTRIP3H and CTRIP3L using the ePWM X-BAR
XBAR_setEPWMMuxConfig(MTR1_XBAR_TRIP, MTR1_IW_XBAR_EPWM_MUX);
// Disable all the mux first
XBAR_disableEPWMMux(MTR1_XBAR_TRIP, 0xFFFF);
// Enable Mux 0 OR Mux 4 to generate TRIP
XBAR_enableEPWMMux(MTR1_XBAR_TRIP, MTR1_IU_XBAR_MUX |
MTR1_IV_XBAR_MUX | MTR1_IW_XBAR_MUX);
#endif // !(MOTOR1_ISBLDC || MOTOR1_DCLINKSS)
// configure the input x bar for TZ2 to GPIO, where Over Current is connected --> //ToDo: Trigger another GPIO error
XBAR_setInputPin(INPUTXBAR_BASE, MTR1_XBAR_INPUT1, MTR1_PM_nFAULT_GPIO);
XBAR_lockInput(INPUTXBAR_BASE, MTR1_XBAR_INPUT1);
XBAR_setInputPin(INPUTXBAR_BASE, MTR1_XBAR_INPUT2, MTR1_PM_nFAULT_2_GPIO);
XBAR_lockInput(INPUTXBAR_BASE, MTR1_XBAR_INPUT2);
// Configure Trip Mechanism for the Motor control software
// -Cycle by cycle trip on CPU halt
// -One shot fault trip zone
// These trips need to be repeated for EPWM1 ,2 & 3
for(cnt=0; cnt<3; cnt++)
{
EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], MTR1_TZ_OSHT1);
EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], MTR1_TZ_OSHT2);
EPWM_enableTripZoneSignals(obj->pwmHandle[cnt],
EPWM_TZ_SIGNAL_CBC6);
//enable DC TRIP combinational input
EPWM_enableDigitalCompareTripCombinationInput(obj->pwmHandle[cnt],
MTR1_DCTRIPIN, EPWM_DC_TYPE_DCAH);
EPWM_enableDigitalCompareTripCombinationInput(obj->pwmHandle[cnt],
MTR1_DCTRIPIN, EPWM_DC_TYPE_DCBH);
// Trigger event when DCAH is High
EPWM_setTripZoneDigitalCompareEventCondition(obj->pwmHandle[cnt],
EPWM_TZ_DC_OUTPUT_A1,
EPWM_TZ_EVENT_DCXH_HIGH);
// Trigger event when DCBH is High
EPWM_setTripZoneDigitalCompareEventCondition(obj->pwmHandle[cnt],
EPWM_TZ_DC_OUTPUT_B1,
EPWM_TZ_EVENT_DCXL_HIGH);
// Configure the DCA path to be un-filtered and asynchronous
EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
EPWM_DC_MODULE_A,
EPWM_DC_EVENT_1,
EPWM_DC_EVENT_SOURCE_FILT_SIGNAL);
// Configure the DCB path to be un-filtered and asynchronous
EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
EPWM_DC_MODULE_B,
EPWM_DC_EVENT_1,
EPWM_DC_EVENT_SOURCE_FILT_SIGNAL);
EPWM_setDigitalCompareEventSyncMode(obj->pwmHandle[cnt],
EPWM_DC_MODULE_A,
EPWM_DC_EVENT_1,
EPWM_DC_EVENT_INPUT_NOT_SYNCED);
EPWM_setDigitalCompareEventSyncMode(obj->pwmHandle[cnt],
EPWM_DC_MODULE_B,
EPWM_DC_EVENT_1,
EPWM_DC_EVENT_INPUT_NOT_SYNCED);
// Enable DCA as OST
EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], EPWM_TZ_SIGNAL_DCAEVT1);
// Enable DCB as OST
EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], EPWM_TZ_SIGNAL_DCBEVT1);
// What do we want the OST/CBC events to do?
// TZA events can force EPWMxA
// TZB events can force EPWMxB
EPWM_setTripZoneAction(obj->pwmHandle[cnt],
EPWM_TZ_ACTION_EVENT_TZA,
EPWM_TZ_ACTION_LOW); //ToDo: Possible to trip to high, so that the motor is coasting
EPWM_setTripZoneAction(obj->pwmHandle[cnt],
EPWM_TZ_ACTION_EVENT_TZB,
EPWM_TZ_ACTION_LOW);
}
因此、我看不到我缺少的内容。 它看起来与 GPIO34引脚完全一样、应该触发 TZ2。 比较器是否缺少任何东西?
编辑: 我添加到 hal.c 的内容:
...
XBAR_setInputPin(INPUTXBAR_BASE, MTR1_XBAR_INPUT2, MTR1_PM_nFAULT_2_GPIO);
XBAR_lockInput(INPUTXBAR_BASE, MTR1_XBAR_INPUT2);
for(cnt=0; cnt<3; cnt++)
{
...
EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], MTR1_TZ_OSHT2);
...
}
编辑2:我还从以下位置尝试了示例 ePWM_ex1_trip_zone: C:\ti\c2000Ware_4_00_00_00\driverlib\f28002x\examples\ePWM
事情是、当我使用如下 GPIO13时、我可以跳闸:
uint32_t gp = 13;
GPIO_setPinConfig(GPIO_13_GPIO13);
GPIO_setDirectionMode(gp, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(gp, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(gp, GPIO_QUAL_ASYNC);
XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT2, gp);
但是、当我使用 GPIO14时、它不起作用。 此外、当我使用 GPIO14的上拉配置时、它永远不会将其上拉。
那么、并非所有 GPIO 都有上拉电阻并用作 XBAR 的输入吗?