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.
与上一个问题一起存在另一个问题。 我一直在尝试使用以下工作流程:
将 GPIO 设置为输出
将 GPIO 设置为输入
将第一个 GPIO 传递到第二个 GPIO
使用此引脚为数字比较子模块提供信号、并使 EPWM1 EPWM2跳闸、一次触发、直到 GPIO 返回到1。
这个应用针对脉冲电源、这样、当我们达到一个目标电压时、在接收到一个新的命令之前、在逆变器中应该足够零开关。
不过、在探测和探测信号时、它看起来很完美-但仅当它未连接到 Launchpad 上的任何引脚时。 有一个2ms 的开启脉冲、一个500us 的关闭脉冲。 工作得很好。
但是、将该信号放入我选择的 GPIO 引脚、恰好是 GPIO52、该信号始终为零。 这使得跳闸区域持续执行、根本不提供 PWM。 这仅在我断开 Launchpad 的 GPIO 连接后恢复、因此我们看到 PWM 开始再次切换。
我使用了 driverlib "epwm"文件夹的第四个示例中的大部分示例、因此为了清楚起见、我不会在这里包含整个代码。
此致、
JMH
我的预定义符号中没有来自其他论坛帖子的以下内容:
请 在工程的预定义符号中添加"_LAUNCHXL_F28379D"(右键点击工程-> Show Build settings -> Build -> C2000 Compiler -> Advanced Options -> Predefined Symbols -> Pre-define NAME)。
是否不会将其包含在内会产生此效应? 我确保尝试使用不与其他引脚(如 SPI 等)共享功能的 GPIO 引脚。 因此,我完全感到困惑,不知道为什么我们会遇到这个问题。
您好!
是否不包含此项会导致此效果?
我相信 C2000Ware 中有一些软件会将此预定义符号用于某些配置。 请重新添加此内容、并验证程序是否正常运行(因为始终应该执行此操作)。 获得正确的已知配置后、请告诉我问题是否仍然存在。
此外、请提供用于配置 GPIO 的代码、包括外设多路复用。
此致、
阿米尔·奥马尔
哪些 driverlib 函数执行外设多路复用?
如前所述、我在 launchpad 上使用了 GPIO 引脚、这些引脚仅专用于 GPIO、没有其他功能、因此如果出现这种情况、我会感到惊讶。
您好!
GPIO_setPinConfig 函数将 GPIO 引脚设置为特定外设(包括将其设置为 GPIO)。 您可以参考 C2000Ware 中包含的 GPIO_ex1_setup 示例项目、了解不同类型的 GPIO 引脚(C2000Ware_5_00_00_00\driverlib\f2837xd\examples\CPU1\GPIO)的更全面设置。 该示例展示了完全配置 GPIO 引脚所需的不同功能。
如上所述,我使用的 Launchpad 上的 GPIO 引脚仅专用于 GPIO,没有其他功能,因此如果出现这种情况,我会感到惊讶。
您是否确认已正确设置每个引脚的方向? 我认为引脚的默认值是输入、 但根据您的设置、我不确定您在做什么。 您说您正在将一个输入 GPIO 连接到一个输出 GPIO、但当您使用 Launchpad 上的另一个 GPIO 引脚时、它不起作用、我的理解是否正确?
此致、
阿米尔·奥马尔
是的、已正确设置引脚方向。 在我们的应用中、需要读取大约400Hz 的数字信号。 当信号为高电平时、PWM 开启;当信号为低电平时、PWM 关闭。 我将 GPIOX 设置为输出并将 GPIOY 设置为输入以测试此功能、将 GPIOY 传递到 TZ1以引发触发。 唯一的问题是、当探测 GPIOX 上的数字 GPIO 时、信号是完美的。 这不会将其连接到 GPIOY。 一旦连接到 GPIOY、信号就一直为零、这意味着 PWM 一直保持关闭、直到连接 GPIOX 和 GPIOY 的线被移除。 我还使用 driverlib 文件夹中提供的 setConfig 示例正确设置了多路复用器。 我将尝试加入提及的预定义符号、看看这是否会有所帮助-很抱歉、今天我要完成其他任务。 感谢您的帮助 Omar。
您好!
这没问题、该论坛的目标是帮助简化客户开发并消除障碍。
您能向我发送您的 GPIO 配置代码吗? 如果可能的话、我会尽量模仿我的观点。
此致、
阿米尔·奥马尔
尊敬的 Omar:
太棒了、谢谢。
我将不得不向您发送完整的代码、但它在我们刚开始开发的过程中比较简短。 我不知道问题出在哪里、但我要重申、一切都像设置一样运行得很好- GPIO 探针会正常工作、PWM 会在未连接 GPIO"输入"的情况下处于活动状态、而 GPIO"输出"也与预期的一样完美。
唯一的问题是、一旦将 GPIO 插入 GPIO 引脚、它就会持续读取零-这意味着 PWM 将永远被禁用、直到您再次移除 GPIO"输入"。
可能值得您在末端进行探测以查看效果。
A
// Included Files. #include "driverlib.h" #include "device.h"d // Set PWM Frequency defines #define EPWM_TIMER_TBPRD 600 // Set PWM Function Prototypes. void initEPWM1(void); void initEPWM2(void); // Set PWM Interrupt Functions. __interrupt void epwm1ISR(void); __interrupt void epwm2ISR(void); // Functions that set-up the GPIO signals. void setupGPIO(void); // Function that implements active-high complementary FED/RED. void setupEPWMActiveHighComplementary(void); // Define any and all ISR counters here. uint32_t epwm1TZIntCount = 0; uint32_t interruptCount1 = 0; uint32_t epwm1ISRCount = 0; uint32_t epwm2ISRCount = 0; // Interrupt handler for trip-zone events. __interrupt void epwm1TZISR(void); int main(void) { // As per usual, do all of these initialisation functions. // Initialise system control, device clock, and peripherals Device_init(); // Initialise PIE and clear PIE registers. Disables CPU interrupts. // and clear all CPU interrupt flags. Interrupt_initModule(); // Initialise the PIE vector table with pointers to the shell interrupt // Service Routines (ISR). Interrupt_initVectorTable(); setupGPIO(); // Specify which function is called when an interrupt is triggered by assigning to register. Interrupt_register(INT_EPWM1, &epwm1ISR); Interrupt_register(INT_EPWM2, &epwm2ISR); Interrupt_register(INT_EPWM1_TZ, &epwm1TZISR); // Start EPWM Initialisation here, first disable peripheral. SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); // Initialise PWM1 with zero phase shift, set as master. See function. initEPWM1(); // Initialise PWM2 with variable phase-shift, set as slave. See function. initEPWM2(); // Synchronised shadow load mode. EPWM_selectPeriodLoadEvent(EPWM2_BASE, EPWM_SHADOW_LOAD_MODE_SYNC); // Set initial phase-shift and time-base counter as zero for soft-start. EPWM_setPhaseShift(EPWM2_BASE, 500); EPWM_setTimeBaseCounter(EPWM2_BASE, 500); // Set EPWM1 SYNCO to be generated when counter is zero. EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); // EPWM2 will use the EPWM1 SYNCO signal as SYNCIN value // Do not need to call setSyncInputConfig as EPWM2 uses this by default. EPWM_setSyncOutPulseMode(EPWM2_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); // Disable phase shift load for EPWM1, enable for PWM2. EPWM_disablePhaseShiftLoad(EPWM1_BASE); EPWM_enablePhaseShiftLoad(EPWM2_BASE); // Setup rising and falling edge delays for both modules. setupEPWMActiveHighComplementary(); // Enable the synch register and lock to the PWM. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); // Finally, enable the PWM interrupts. Interrupt_enable(INT_EPWM1); Interrupt_enable(INT_EPWM2); // Trip zone itnerrupts. Only use one and allow it to handle both PWM modules. Interrupt_enable(INT_EPWM1_TZ); // Enables CPU interrupts Interrupt_enableMaster(); // Enable Global Interrupt (INTM) and real time interrupt (DBGM) EINT; ERTM; // Loop forever to allow debug. for(;;) { // Charge enabled for maximum of 2 milliseconds GPIO_writePin(67, 1); DEVICE_DELAY_US(2000); // Charging disabled for 500 microseconds GPIO_writePin(67, 0); DEVICE_DELAY_US(500); } } void initEPWM1(void) { // Set up time-base clock. EPWM_setTimeBasePeriod(EPWM1_BASE, EPWM_TIMER_TBPRD); EPWM_setPhaseShift(EPWM1_BASE, 0); EPWM_setTimeBaseCounter(EPWM1_BASE, 0); // Counter compare config for EPWM1. May just need CMPA if use FED/RED. EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_TIMER_TBPRD/2); EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_TIMER_TBPRD/2); // Set up counter mode. EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP); EPWM_disablePhaseShiftLoad(EPWM1_BASE); EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // Set up PWM Shadowing. Load on CTR ZRO. EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO); // Set up the action qualifier. EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // Trip zones defined here. EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT1); EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW); // Enable TZ interrupt EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_OST); // Interrupt where we will change execute control code. // Select INT on time base counter zero event // Enable INT, but generate on the 15th event // Bandwidth is then FSW/15. EPWM_setInterruptSource(EPWM1_BASE, EPWM_INT_TBCTR_ZERO); EPWM_enableInterrupt(EPWM1_BASE); EPWM_setInterruptEventCount(EPWM1_BASE, 15); } void initEPWM2(void) { // Set up time-base clock. EPWM_setTimeBasePeriod(EPWM2_BASE, EPWM_TIMER_TBPRD); // Initially zero, but test with different TBPHS. // Ensure Time base is set to same value as phase shift. EPWM_setPhaseShift(EPWM2_BASE, 300); EPWM_setTimeBaseCounter(EPWM2_BASE, 300); // Counter compare config for EPWM2. May just need CMPA if use FED/RED. EPWM_setCounterCompareValue(EPWM2_BASE, EPWM_COUNTER_COMPARE_A, EPWM_TIMER_TBPRD/2); EPWM_setCounterCompareValue(EPWM2_BASE, EPWM_COUNTER_COMPARE_B, EPWM_TIMER_TBPRD/2); // Set up counter mode. EPWM_setTimeBaseCounterMode(EPWM2_BASE, EPWM_COUNTER_MODE_UP); EPWM_disablePhaseShiftLoad(EPWM2_BASE); EPWM_setClockPrescaler(EPWM2_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // Set up PWM Shadowing. Load on CTR ZRO. EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO); // Set up the action qualifier. // Scope these and check if right, most likely need to be different to EPWM1. EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_enableTripZoneSignals(EPWM2_BASE, EPWM_TZ_SIGNAL_OSHT1); EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW); EPWM_enableTripZoneInterrupt(EPWM2_BASE, EPWM_TZ_INTERRUPT_OST); // Interrupt where we will change execute control code. // Select INT on time base counter zero event // Enable INT, but generate on the 15th event // Bandwidth is then FSW/15. EPWM_setInterruptSource(EPWM2_BASE, EPWM_INT_TBCTR_ZERO); EPWM_enableInterrupt(EPWM2_BASE); EPWM_setInterruptEventCount(EPWM2_BASE, 15); } void setupEPWMActiveHighComplementary() { // As always, use EPWMA as the input for both RED and FED. EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA); EPWM_setRisingEdgeDeadBandDelayInput(EPWM2_BASE, EPWM_DB_INPUT_EPWMA); EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA); EPWM_setFallingEdgeDeadBandDelayInput(EPWM2_BASE, EPWM_DB_INPUT_EPWMA); // Set the rising and falling edge delay values. One percent of switching period, for now. EPWM_setFallingEdgeDelayCount(EPWM1_BASE, EPWM_TIMER_TBPRD/100); EPWM_setFallingEdgeDelayCount(EPWM2_BASE, EPWM_TIMER_TBPRD/100); EPWM_setRisingEdgeDelayCount(EPWM1_BASE, EPWM_TIMER_TBPRD/100); EPWM_setRisingEdgeDelayCount(EPWM2_BASE, EPWM_TIMER_TBPRD/100); // Invert only the falling edge delayed output for active-high complementary mode. EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW); EPWM_setDeadBandDelayPolarity(EPWM2_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayPolarity(EPWM2_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW); // Use the delayed signals instead of the original signals. EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, true); EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, true); EPWM_setDeadBandDelayMode(EPWM2_BASE, EPWM_DB_RED, true); EPWM_setDeadBandDelayMode(EPWM2_BASE, EPWM_DB_FED, true); // Importantly, do not switch output A with output B. EPWM_setDeadBandOutputSwapMode(EPWM1_BASE, EPWM_DB_OUTPUT_A, false); EPWM_setDeadBandOutputSwapMode(EPWM1_BASE, EPWM_DB_OUTPUT_B, false); EPWM_setDeadBandOutputSwapMode(EPWM2_BASE, EPWM_DB_OUTPUT_A, false); EPWM_setDeadBandOutputSwapMode(EPWM2_BASE, EPWM_DB_OUTPUT_B, false); } // Call this function to set-up the pin-out of the GPIOs. void setupGPIO(void) { // Enable PWM1A/B-2A/B on GPIO0-GPIO4 GPIO_setPadConfig(0, GPIO_PIN_TYPE_STD); // Standard push-pull output on GPIO0 GPIO_setPadConfig(1, GPIO_PIN_TYPE_STD); // GPIO1 GPIO_setPadConfig(2, GPIO_PIN_TYPE_STD); // GPIO2 GPIO_setPadConfig(3, GPIO_PIN_TYPE_STD); // GPIO3 GPIO_setPinConfig(GPIO_0_EPWM1A); // GPIO0 = PWM1A GPIO_setPinConfig(GPIO_1_EPWM1B); // GPIO1 = PWM1B GPIO_setPinConfig(GPIO_2_EPWM2A); // GPIO2 = PWM2A GPIO_setPinConfig(GPIO_3_EPWM2B); // GPIO3 = PWM2B // Enable a GPIO67 output on GPIO67, set it high GPIO_setPadConfig(67, GPIO_PIN_TYPE_PULLUP); // Enable pullup on GPIO67 GPIO_writePin(67, 1); // Load output latch GPIO_setPinConfig(GPIO_67_GPIO67); // GPIO67 = GPIO67 GPIO_setDirectionMode(67, GPIO_DIR_MODE_OUT); // GPIO67 = output // Enable a GPIO output on GPIO8, set it high GPIO_setPadConfig(5, GPIO_PIN_TYPE_PULLUP); // Enable pullup on GPIO5 GPIO_writePin(5, 1); // Load output latch GPIO_setPinConfig(GPIO_5_GPIO5); // GPIO5 = GPIO5 MUX SELECT GPIO_setDirectionMode(5, GPIO_DIR_MODE_IN); // GPIO5 = input (output overvolts latch) // Enable Trip Zone input on GPIO5 GPIO_setQualificationMode(5, GPIO_QUAL_ASYNC); // asynch input // Input pins trigger XBAR TZs XBAR_setInputPin(XBAR_INPUT1, 5); // GPIO5 = TZ1 } __interrupt void epwm1ISR() { epwm1ISRCount++; // Clear INT flag for this timer EPWM_clearEventTriggerInterruptFlag(EPWM1_BASE); // Acknowledge interrupt group Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3); } __interrupt void epwm2ISR() { epwm2ISRCount++; // Clear INT flag for this timer EPWM_clearEventTriggerInterruptFlag(EPWM2_BASE); // Acknowledge interrupt group Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3); } __interrupt void epwm1TZISR() { epwm1TZIntCount++; // For one-shot trips, we must re-enable all of the trip-zone flags within both PWM modules. EPWM_clearTripZoneFlag(EPWM1_BASE, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_OST)); EPWM_clearTripZoneFlag(EPWM2_BASE, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_OST)); // Acknowledge this interrupt to receive more interrupts from group 2 Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2); }
您好!
在浏览该代码时、需要注意以下几点:
基于您对上述问题的回答、我将更新代码、 看看会发生什么情况。
此致、
阿米尔·奥马尔
是的、当它被输入到 GPIO5时、GPIO67将为常量零。 我向这两者写入1、因为我希望确保两者默认为高电平、因为 TZ1为低电平有效。
实际上、我仅在上升沿将 GPIO 中断中的跳闸区域标志复位、从而解决了该问题、这样只能在 GPIO67上的上升沿触发传递到 GPIO5时重新启用 PWM。 想知道这为什么不起作用、以及 GPIO5/GPIO67互连为什么始终保持为零、我仍会很感兴趣。
您好!
我实际上通过仅在上升沿重置 GPIO 中断中的跳闸区标志而成功解决了问题,因此只有当 GPIO67上的上升沿触发传递给 GPIO5时才能重新启用 PWM。[/报价]抱歉、我不清楚、您是为 GPIO 引脚创建了中断吗? 然后在上升沿清除触发区标志会以某种方式允许 GPIO67仍然继续输出值? 我试图了解这是如何解决原来的问题,因为它看起来不像损坏的针脚或类似的东西.
此致、
阿米尔·奥马尔
情况正是如此。 我完全删除了 TZ 中断、而是将用于清除单次触发的标志的命令放入由 GPIO5上升沿触发的 GPIO 中断中。 这似乎完全解决了问题。 很抱歉、但我根本无法理解为什么该问题一直存在。
你好,Omer。
有点偏主题但我看到论坛上的一些帖子说,可以在一个 PWM 模块中使用的最大行程数是2个 OST 和1个 CBC。 这是真的吗? 我认为它是2个 OST (DCAEVT1和 DCBEVT1)和2个 CBC (DCAEVT2和 DCBEVT2)。 这两个寄存器都可用于影响 EPWM1A/B 和 EPWM2A/B 中的变化。 您能确认我错了吗? 我计划使用这次 GPIO 到 TZ1的旅行、然后为以下目的进行旅行:
过压1、过压2。
过流1、过流2。
TZ1.
当 EPWM1A/B 变为低电平时、EPWM2A/B 也会变为低电平。
这可能吗?或者我是否必须使用 TZ2/TZ3和软件中设置为高电平的另一个 GPIO?
了解是否可以使用一个 GPIO 引起两个中断事件、一个在上升沿、一个在下降沿、也很有用。 我知道 GPIO 模块具有寄存器、您可以对上升沿中断或下降沿进行编程、但您可以对这两者进行编程吗? 在下降沿执行任务并禁用断电、在上升沿执行 B 任务并启用 PWM? 两者之间不会发生任何相互影响的冲突?
尊敬的 JMH:
如果您指的是您看到的特定论坛帖子、 如果有任何其他混淆、请随时链接该帖子以供参考。
首先、我想区分由于这些跳闸而导致的跳闸信号源和 ePWM 行为输出。 请注意、有多个可为 ePWM 信号选择的跳闸区信号源、但只有 少数 ePWM 行为 输出可设置为在 响应所选跳闸源时发生。
正确的做法是、DCAEVT1和 DCBEVT1分别可用作 EPWMxA 和 EPWMxB 的 OST、而 DCAEVT2和 DCBEVT2可 分别用作 EPWMxA 和 EPWMxB 的 CBC 跳闸。 为了澄清这意味着、对于单个 EPWMxy 输出(例如 EPWM1A)、可以有两种 定义为对这些直流事件的响应:一种定义为 DCAEVT1 OST 的操作、一种定义为 DCAEVT2 CBC 跳闸的操作。 但是、您也可以将 TZN 信号(TZ1-TZ6)用作 OST 或 CBC 跳闸源、并且可以 为 EPWMxA 定义另一个操作、称为 TZA Event 操作(EPWMxB 有一个 TZB 事件操作)。 此外、请注意、 1926页的技术参考手册中描述的一些相互冲突的操作有一个优先级层次结构、在"跳闸区域"和"数字比较" 部分中都有关于 TZN、DCAEVT1/2和 DCBEVT1/2配置的更多详细信息。 如果您尚未在 SysConfig GUI 中查看 ePWM TZ 和 DC 子模块、可能会有所帮助。
要回答您的应用问题(是)、您可以使用 相同的源 同时将 EPWM1A/B 设置为低电平和 EPWM2A/B 设置为低电平。 实现这一目的的最简单方法是 对每个 ePWM 模块使用相同的跳闸设置。
如果 GPIO 设置为在一个边沿或两个边沿触发中断、则无法为每个边沿使用两个单独的中断。 但您可以 使用单个中断(为 GPIO 的两个边沿设置)、并且在该中断内、让信号状态决定您采取的操作(任务 A +禁用 PWM 或任务 B +启用 PWM)。
如果您有进一步的询问、请告诉我。
此致、
艾里森
您好 Alison
"谢谢你,谢谢你。" 我明天会反思这一点。 那么、如果我决定说、有4个 OST 跳闸来自 CMPPS1-4 (2倍过压、2倍过流)和另一个响应 TZ1 (GPIO 跳闸、外部数字触发信号)的 OST 跳闸、这将是最好的前进方式。
如果我只能从比较器获得一个 OST、我是否必须使用 TZ1-TZ4作为其他跳闸? 我们今天讨论了所有跳闸都应该是 OST、所有跳闸都在 GPIO 触发器的上升沿被取消置位。 我目前使 DCAEVT1和 DCBEVT1能够响应 CMPSS1和 CMPSS2、其中任一事件在 EPWMA/B 为高电平时都会跳闸。 这不正确吗?
考虑一下、使用跳闸组合输入可能更容易。 是否可以将 TZ1和 TRIP4-7全部作为 OST 输入来生成 DCAEVT1/DCBEVT1? 对于跳闸区信号的消隐、TRM 指出"选择 DCAEVT1或 DCBEVT1进行滤波"。 是否无法同时过滤和消隐这两个事件? 只要我的 A 关闭、B 也必须始终关闭、没有任何例外。
哪种方法最适合上述方法? driverlib 中有一个示例涉及组合跳闸输入的使用、因为我似乎找不到一个。 或者、在如何使用 TZ1、TRIP4-7设置逻辑跳闸输入的方向上进行细微调整会非常有帮助。
尊敬的 JMH:
您可以通过 EPWMXBar (如 TRIPn)从所有四个 CMPSS 信号生成 OST DCEVT 跳闸、并使用您建议的组合输入选择这些信号。 然后将这些输入进行 OR 运算、以便将它们用作 OST DCxEVT1的源。 对其进行配置可使 CMPSS 高电平信号引起跳闸并将 EPWM 信号驱动到特定状态。 当前没有 ePWM 组合跳闸软件示例、但 TRM 的第 15.11.2节"使用 CMPSS 的增强跳闸操作"中有有关其用法的更多详细信息。
要使用组合输入进行设置、这里是 流程的总体概述:在已设置四个 CMPSS 的情况下、您至少需要一个 EPWMXBAR 来接收 这四个 CMPSS 信号。 对于 EPWMXBAR、选择适当的多路 复用器和多路复用器配置、以便在每个 CMPSS1-4信号中正确进行路由;有关多路复用器配置的详细信息、请参阅表9-2 ePWM X-BAR 多路复用器配置表。 对于 EPWMXBAR 实例、请选择信号路由位置为 TRIPn (您可以使用多个 EPWMXBAR,并 根据需要将它们路由到单独的 TRIPn、例如 TRIP4、TRIP5、TRIP7和 TRIP8)、以便可以将其输入到 ePWM 数字比较子模块。 设置的其余部分 用于 EPWM 信号、需要在 EPWM 数字比较中配置 DCAEVT1和 DCBEVT2、以将跳闸源(Trip4、5、7和8)用作组合输入源。 设置 DCEVT 后、就可以设置跳闸区域子模块以定义对 DCxEVT 采取的操作。 就在 GPIO 上升沿清除 OST 而言、OST 只能通过软件清除、但 GPIO 上升沿和 ISR 执行之间存在固有延迟。 因此、 可以在 GPIO 上升沿通过外部中断来完成、但可能存在一些延迟-如果需要、您还可以考虑使用 CLB 来实现。
如果您有进一步的询问、请告诉我。
此致、
艾里森