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.
我正在使用具有互补信号和死区要求的 ePWM 模块来驱动一些 FET。 需要设置死区以防止电流击穿。
我们希望在首次启用系统时缓慢增大驱动强度。 我发现 PWM 斩波器通过允许我以较小的占空比调制有功信号、在这方面做得很好。 除了斩波器的单次触发功能外、它的工作效果非常出色。 没有办法禁用单次触发功能、并且它有时会在死区期间激活。
是否可以通过任何方法禁用斩波器单触发信号(OSHTWTH 的最小值为0000b、哪个电芯库至少达到 EPWMCLK/8 s)? 或者使其在死区时间内不触发? DBRED 和 DBFED 设置为0xF、DBCTL 设置为0xB。
谢谢。
杰伊
您好、Jay、
您的 EPWMCLK 是什么?
很抱歉、如果我误解了您的问题、但您能否向我展示您希望通过图表实现的目标? 在下图中、您需要移除 OSHTWTH 脉冲宽度。 您是否需要这样的方案:斩波器从无脉冲宽度开始、立即开始持续脉冲?
您好、Ryan、
感谢您的答复。 是的、您的抽奖就是我想要达到的目标。 但我看到的真正问题是、在使用 PWM 斩波器功能时、死区设置将被忽略。 我看到 OSHT 在我定义的死区内启动。 只是 OSHT 发生的问题没有发生 时那么严重。
我将在可以的时候发布一张示波器截图。
杰伊
您好、Jay、
您能给我发送一份示波器捕获吗? 我想看看我能否重现您的问题、看看我们如何解决这个问题。
此致!
Ryan Ma
我收集了一些证明我看到的问题的数据。
这是我的标称波形。 两个具有125ns 死区的互补高电平有效 PWM 信号。 一个信号为黄色、另一个信号为蓝色:
当我启用 PWM 斩波器时、我会在指定的125ns 死区内看到空洞(不管怎样、斩波信号本身是完美的)。
CHPDUTY 100b.
CHPFREQ 100b.
OSHTWTH 0000b
通道编号1b
更改 OSHTWTH 值不会纠正死区入侵:
OSWTWH=0x0 (低于、有高电平有效重叠)
OSWTWH=0x1 (低于、有高电平有效重叠)
如果不是单稳态信号、则死区会很好。
您好、Jay、
感谢您提供这些清晰的示波器图片、您是否对动作限定符、DBRED、DBFED 等使用影子模式?
OSHT 脉冲应该只能在 ePWMx 的第一个上升沿(黄色信号)产生、如所示。
在您发送到下方图片中黄色信号的下降沿、死区似乎保持为125ns、蓝色信号存在 OSHT 脉冲、并对其应用斩波器。
此致!
Ryan Ma
谢谢 Ryan。 它是随机的。 有时还可以,有时不是。 在所有这些捕获期间、我没有更改 PWM 寄存器的占空比或频率。 我同意你的观察,但 我看到同样违反蓝色信号.
下面是初始化代码。 主要参考来自 C2000Ware 示例:
// // InitGateDrive - Initialize Gate Driver PWM signals (with Deadband) // void InitGateDrive(void) { // // Setup TBCLK // EPWM_setTimeBaseCounterMode(GATEDRIVE_PWM_MODULE, EPWM_COUNTER_MODE_UP); EPWM_setTimeBasePeriod(GATEDRIVE_PWM_MODULE, GATEDRIVE_PWM_TBPRD); EPWM_disablePhaseShiftLoad(GATEDRIVE_PWM_MODULE); EPWM_setPhaseShift(GATEDRIVE_PWM_MODULE, 0U); EPWM_setTimeBaseCounter(GATEDRIVE_PWM_MODULE, 0U); // // Set ePWM clock pre-scaler // EPWM_setClockPrescaler(GATEDRIVE_PWM_MODULE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // // Setup shadow register load on ZERO // EPWM_setCounterCompareShadowLoadMode(GATEDRIVE_PWM_MODULE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); // // Set Compare values // EPWM_setCounterCompareValue(GATEDRIVE_PWM_MODULE, EPWM_COUNTER_COMPARE_A, GATEDRIVE_PWM_CMPA); // // Set actions for ePWM1A & ePWM1B // // Set PWM1A on Zero EPWM_setActionQualifierAction(GATEDRIVE_PWM_MODULE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); // Clear PWM1A on event A, up count EPWM_setActionQualifierAction(GATEDRIVE_PWM_MODULE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // Set PWM1B on Zero EPWM_setActionQualifierAction(GATEDRIVE_PWM_MODULE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); // Clear PWM1B on event A, up count EPWM_setActionQualifierAction(GATEDRIVE_PWM_MODULE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // Setup Dead Band setupEPWMActiveHighComplementary(GATEDRIVE_PWM_MODULE); // Disable after init GateDriveDisable(); GateDriveSetupTrip(); // Clear XBAR -> EPWM trip zones GateDriveClearTrip(); } static void setupEPWMActiveHighComplementary(uint32_t base) { // // Use EPWMA as the input for both RED and FED // EPWM_setRisingEdgeDeadBandDelayInput(base, EPWM_DB_INPUT_EPWMA); EPWM_setFallingEdgeDeadBandDelayInput(base, EPWM_DB_INPUT_EPWMA); // // Set the RED and FED values // EPWM_setFallingEdgeDelayCount(base, GATEDRIVE_PWM_DEADBAND); EPWM_setRisingEdgeDelayCount(base, GATEDRIVE_PWM_DEADBAND); // // Invert only the Falling Edge delayed output (AHC) // EPWM_setDeadBandDelayPolarity(base, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayPolarity(base, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW); // // Use the delayed signals instead of the original signals // EPWM_setDeadBandDelayMode(base, EPWM_DB_RED, true); EPWM_setDeadBandDelayMode(base, EPWM_DB_FED, true); // // DO NOT Switch Output A with Output B // EPWM_setDeadBandOutputSwapMode(base, EPWM_DB_OUTPUT_A, false); EPWM_setDeadBandOutputSwapMode(base, EPWM_DB_OUTPUT_B, false); }
您是否更改了死区的任何操作限定符或延迟值?
在您的配置下、死区 FED 和红色值默认为立即模式。 我会尝试添加这个 driverlib 函数、看看这是否有所帮助。 以及设置动作限定器影子加载模式。 这将确保当 TBCTR 等于某个事件时、对操作限定符或延迟值的任何写入都将更新。
EPWM_setActionQualifierShadowLoadMode();
ePWM_setRisingEdgeDelayCountShadowLoadMode ()
好的 、我将添加这些后重试。 在这些测试期间、我不会更改行动限定符。 频率和占空比是一致的值。
我正在为 比较计数器使用影子加载。
我将这些影子调用添加到了我的初始化序列中、仍然看到同样的问题。 我在操作过程中不会更改这些。 INIT 后唯一更改的属性是频率(因此也是比较值)、但在这些测试期间、我将其设置为对应于100kHz 的值。 在 INIT 之后、125ns 的死区值永远不会改变。
我认为这可能只是 ePWM 结构的赝像。 PWM 斩波器块位于死区模块之后。 PWM 斩波器不得将死区的输出用作其基准信号。 但我不明白为什么会出现这种情况。
您好、Jay、
我将尝试复制您在我结束时看到的内容、并在明天向您通报最新情况。 如果我能够复制这些内容、我将要求设计团队看看基准信号是否发生了变化。
此致!
Ryan Ma
谢谢、Ryan。 init 应包含重现所需的大部分信息。 唯一剩下的就是我设置了周期和占空比。
// set period EPWM_setTimeBasePeriod(GATEDRIVE_PWM_MODULE, pwmCounts); // always set 50% duty cycle EPWM_setCounterCompareValue(GATEDRIVE_PWM_MODULE, EPWM_COUNTER_COMPARE_A, pwmCounts>>1);
如果有其他必要的信息或问题、请告诉我。
杰伊
您好、Jay、
我已经尝试并遵循了您的相同配置。 这是我的设置和示波器图形。 我的 TBCLK 是100Mhz。
我有85KHz 信号、其中相同的高电平有效互补死区和 PWM 斩波器已启用。 我没有看到与输出相同的重叠。 您能否尝试此 ePWM 初始化? 您是在 LaunchPad 还是 controlCARD 上对其进行调试?
void EPWM_init(){ EPWM_setClockPrescaler(myEPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); EPWM_setTimeBasePeriod(myEPWM1_BASE, 1164); EPWM_setTimeBaseCounter(myEPWM1_BASE, 0); EPWM_setTimeBaseCounterMode(myEPWM1_BASE, EPWM_COUNTER_MODE_UP); EPWM_disablePhaseShiftLoad(myEPWM1_BASE); EPWM_setPhaseShift(myEPWM1_BASE, 0); EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, 582); EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_B, 0); EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); EPWM_setDeadBandDelayPolarity(myEPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW); EPWM_setDeadBandDelayMode(myEPWM1_BASE, EPWM_DB_RED, true); EPWM_setRisingEdgeDelayCount(myEPWM1_BASE, 125); EPWM_setDeadBandDelayMode(myEPWM1_BASE, EPWM_DB_FED, true); EPWM_setFallingEdgeDelayCount(myEPWM1_BASE, 125); EPWM_setRisingEdgeDelayCountShadowLoadMode(myEPWM1_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO); EPWM_disableRisingEdgeDelayCountShadowLoadMode(myEPWM1_BASE); EPWM_setFallingEdgeDelayCountShadowLoadMode(myEPWM1_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO); EPWM_disableFallingEdgeDelayCountShadowLoadMode(myEPWM1_BASE); EPWM_enableChopper(myEPWM1_BASE); EPWM_setChopperDutyCycle(myEPWM1_BASE, 4); EPWM_setChopperFreq(myEPWM1_BASE, 4); }
哇哦。 很好。 我将尝试这一点、看看我的做法有何不同。
我使用的是 controlCARD。
好的、我还将 controlCARD 与集线站配合使用。
您好、Ryan、
我复制了您的代码。 区别在于我的死区时间要低得多。 我需要125ns 死区、而您尝试的示例代码有1.25us 死区时间。 在较长的死区时间内、斩波器可以正常工作。 如果使用所提供的相同示例并将死区时间降低至~125ns (0xF)、您应该会看到重叠。 同样、如果我使用当前代码并增加 DBRED 和 DBFED 值、则可以消除冲突(并根据新值获得预期的死区时间)。 您可以尝试再现吗?
在我的设计中、我需要125ns 或更低的死区时间。
谢谢!
杰伊
您好、Jay、
是的、我现在看到重叠了、我需要看看使用 PWM 斩波器时是否存在所需的最低死区。 请允许我仔细检查一下。
此致!
Ryan Ma
您好、Jay、
我一直在玩斩波器占空比、并将其设置在第一幅图中的1/8占空比。
第二张图片是2/8占空比、
第三张图片是3/8 Duty:
第四张图片是4/8占空比(违反死区)。
您是否对 PWM 斩波器占空比有要求? 看来,占空比越低,死区越低,不违反死区时间。 这是一个变通办法吗?
在1/8占空比时、我仍然发现不常见违规情况。
我还注意到、在7/8占空比时、斩波器看起来会完全消除信号:
我以前看到过这个,但认为使用1/8到3/4足够满足我的需要。 但现在、我认为在成功使用 PWM 斩波器方面存在一些限制或我不明白的地方。 我很想听到你能找到什么。 感谢您的帮助。
杰伊
您好、Jay、
让我来询问 设计、看看可能是什么原因造成的、并会在一天结束或明天最后一天结束时给您回复。
此致!
Ryan Ma
您好、Jay、
我已经重新运行了我发送给您的原始代码、现在由于某种原因、我无法再重复重叠。 此外、我已切换回原始示波器、并且看不到这一重叠。 我测量了几个信号以看到它们的死区、有些信号大约为100ns-150ns。
我还以1/8占空比运行、这就是我得到的结果、我无法从信号中复制零位。
我担心可能还有另一个问题导致了这种情况、我对此不确定。 您的设置上是否存在生成脉冲的噪声?
这似乎不太可能。 我使用 controlCARD 和坞站进行这些测试。 即使我取出代码的所有其他函数并刚运行 PWM、我也看到了重叠。 我稍后会再次尝试以进行验证、但我不明白它为什么会发生变化。
我发送的捕获确实显示了100ns 的死区、但当它设置为125ns 时这是一个违例。 如果死区的这种精度不是25ns 的精度、那么这就会是另一个问题。 同样在较高的斩波占空比下、死区时间会下降到更差的水平。
我同意这两种方式都会引起担忧、我已就此联系设计团队了解可能会出现什么问题。 我将在收到回复后向您提供最新信息。
此致!
Ryan Ma
非常好。 谢谢你。
我相信在使用 PWM 斩波器期间、可以通过开启死区时间来解决这个问题。 我想将斩波器用于启动、在该应用中、低效率的死区时间不是首要问题(只要动态死区变化不会导致其他问题)。
无论如何、最好能理解我的限制条件。
杰伊
您好、Jay、
根据设计、斩波输出将与插入的死区 PWM 进行与运算、因此不应该有重叠。 我将在结束时再次测试它、并尝试为您找到解决方案。
此致!
Ryan Ma
您好、Jay、
我已再次尝试此设置、但仍然看不到这种重叠、这是您的示波器设置或探头出现的问题吗?
我添加了死区、它的误差似乎在~50ns - 150ns 之间变化。 您对死区使用了什么值? 但是、当我尝试找到两个输出同时变为高电平时的情况时、没有重叠。
此致!
Ryan Ma
您好、Jay、
我在这方面有了 bitfield 与 driverlib 项目。
使用位域:
这是死区= 0的正常高电平有效互补信号。 我只是想看看上升沿和下降沿的时序是否对齐了、它们是否对齐了。
转到仅启用 PWM 斩波且仍具有死区= 0的情况、我发现了一些有趣的事情。 PWM 斩波器为 PWM1B 添加了50ns、并在50ns 结束时向 PWM1B 的上升沿添加了延迟。 创建一个目标配置。
在此屏幕截图中、PWM 斩波器看起来与我发送的第一个屏幕截图完全相同、但没有额外的延迟、也没有在 PWM1B 输出的任一侧添加50ns
因此、似乎当您为信号启用 PWM 斩波器时、它可能会额外增加或导致任一侧几乎50ns 的死区。
我有两条建议供您调试这个问题、一条建议是尝试我在 bitfield 中执行的操作、另一条建议是在 driverlib 中执行的操作。
使用 Driverlib 的选项1:
您是否能够配置一个输出 XBar、以便在 TBCTR = 0时发生 EXTSYNCOUT。 您可以复制此代码并将此 GPIO 引脚(GPIO58)用作示波器
这是我使用该方法获得的输出、以看到该额外的50ns 延迟、但我添加了值为15的死区。 不过、我没有看到任何重叠。
选项2:
您能否从以下位置导入位域工程: C:\ti\c2000\c2000\C2000Ware_4_03_00_00\device_support\f2837xd\examples\cpu1\ePWM_up_AQ
将其粘贴到 epwm_up_aQ_cpu01.c 中、然后使用 bitfield 进行测试。 我在应用150ns 的死区时间内得到非常一致的结果。
//########################################################################### // // FILE: epwm_up_aq_cpu01.c // // TITLE: Action Qualifier Module - Using up count. // //! \addtogroup cpu01_example_list //! <h1> EPWM Action Qualifier (epwm_up_aq)</h1> //! //! This example configures ePWM1, ePWM2, ePWM3 to produce an //! waveform with independent modulation on EPWMxA and //! EPWMxB. //! //! The compare values CMPA and CMPB are modified within the ePWM's ISR. //! //! The TB counter is in up count mode for this example. //! //! View the EPWM1A/B(PA0_GPIO0 & PA1_GPIO1), EPWM2A/B(PA2_GPIO2 & PA3_GPIO3) //! and EPWM3A/B(PA4_GPIO4 & PA5_GPIO5) waveforms via an oscilloscope. //! // //########################################################################### // // $Release Date: $ // $Copyright: // Copyright (C) 2013-2023 Texas Instruments Incorporated - http://www.ti.com/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the // distribution. // // Neither the name of Texas Instruments Incorporated nor the names of // its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // $ //########################################################################### // // Included Files // #include "F28x_Project.h" // // Defines // #define EPWM1_TIMER_TBPRD 1164 // Period register #define EPWM1_CMPA 582 #define EPWM_CMP_UP 1 #define EPWM_CMP_DOWN 0 // // Globals // typedef struct { volatile struct EPWM_REGS *EPwmRegHandle; Uint16 EPwm_CMPA_Direction; Uint16 EPwm_CMPB_Direction; Uint16 EPwmTimerIntCount; Uint16 EPwmMaxCMPA; Uint16 EPwmMinCMPA; Uint16 EPwmMaxCMPB; Uint16 EPwmMinCMPB; }EPWM_INFO; EPWM_INFO epwm1_info; // // Function Prototypes // void InitEPwm1Example(void); // // Main // void main(void) { // // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the F2837xD_SysCtrl.c file. // InitSysCtrl(); // // Step 2. Initialize GPIO: // This example function is found in the F2837xD_Gpio.c file and // illustrates how to set the GPIO to it's default state. // // InitGpio(); // // Enable PWM1, PWM2 and PWM3 // CpuSysRegs.PCLKCR2.bit.EPWM1=1; // // For this case just init GPIO pins for ePWM1, ePWM2, ePWM3 // These functions are in the F2837xD_EPwm.c file // InitEPwm1Gpio(); // // 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 F2837xD_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 F2837xD_DefaultIsr.c. // This function is found in F2837xD_PieVect.c. // InitPieVectTable(); // // For this example, only initialize the ePWM // EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; InitEPwm1Example(); EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; // // Enable global Interrupts and higher priority real-time debug events: // EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM // // Step 5. IDLE loop. Just sit and loop forever (optional): // for(;;) { asm (" NOP"); } } // // InitEPwm1Example - Initialize EPWM1 values // void InitEPwm1Example() { // // Setup TBCLK // EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // Set timer period EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm1Regs.TBCTR = 0x0000; // Clear counter EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // // Setup shadow register load on ZERO // EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // // Set Compare values // EPwm1Regs.CMPA.bit.CMPA = EPWM1_CMPA; // Set compare A value // EPwm1Regs.CMPB.bit.CMPB = EPWM1_MIN_CMPB; // Set Compare B value // // Set actions // EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // Set PWM1A on Zero EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM1A on event A, // up count EPwm1Regs.AQCTLB.bit.ZRO = AQ_CLEAR; // Set PWM1B on Zero EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // Clear PWM1B on event B, // up count EPwm1Regs.DBCTL.bit.IN_MODE = 0x00; EPwm1Regs.DBCTL.bit.DEDB_MODE = 0x00; EPwm1Regs.DBCTL.bit.SHDWDBFEDMODE = 0x1; EPwm1Regs.DBCTL.bit.SHDWDBREDMODE = 0x1; EPwm1Regs.DBCTL.bit.LOADFEDMODE = 0xF; // You can play with this value EPwm1Regs.DBCTL.bit.LOADREDMODE = 0xF; // to see the delays EPwm1Regs.DBRED.bit.DBRED = 0x0; EPwm1Regs.DBFED.bit.DBFED = 0x0; EPwm1Regs.DBCTL.bit.POLSEL = 0x2; EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3; EPwm1Regs.PCCTL.bit.CHPEN = 0x1; // try commenting out these lines to see EPwm1Regs.PCCTL.bit.OSHTWTH = 0x0; // what is happening w/o chopper EPwm1Regs.PCCTL.bit.CHPFREQ = 0x0; EPwm1Regs.PCCTL.bit.CHPDUTY = 0x3; } // // End of file //
我希望这对您有所帮助、我也会将这些信息转发给设计部门、以查看是否应该将其记录在我们的 TRM 中。
此致!
Ryan Ma
我在仅特定的占空比下发现了重叠。 我怀疑它与示波器捕获相关。 它是罕见的,但它根本不可能发生。 我更频繁地看到子目标死区违例。
考虑为什么从一开始就需要死区、需要考虑不同的死区。 您看到的这种变化是否符合预期? 这种变化是否为器件/设计的限制?
我的目标死区最小为125ns、这对应于我的系统中的设置25 (PWM 时钟分频器为0)。 较长的死区时间将简单地转换为系统性能的低效率、但可能影响最小。 这是不可取的。
ePWM 模块是否有差异? 这似乎不太可能,但问。
我将尝试找到显示重叠的确切斩波器设置。 我最近将 PWM 时钟分频器切换为一分频、所以可能已对其进行了更改、但仍然会出现时序违规。 如果您要导出示例项目、我们可以使用完全相同的配置。
杰伊
我以各种斩波占空比和频率仔细检查并收集了数据。 我找到了会导致死区冲突和重叠的配置、并具有范围捕获。 在我的测试中、随着占空比和频率的增加、时序越来越差。 重叠违例在直流= 100b 且 FREQ = 101b 时以100kHz 波形开始。
我将尝试上面提供的代码、并根据需要添加死区、然后重新测试。
您好、Jay、
您能否向我展示您收集的数据? 然后、我可以将其与设计团队分享。 您扫描的频率范围是多少、我假设您从占空比1/8 -> 7/8以及所有斩波频率进行扫描?
此致!
Ryan Ma
e2e.ti.com/.../epwm_5F00_waveforms.zip
附件是我在各种 CHPDUTY 和 CHPFREQ 设置下收集的波形 zip。 还包括空洞情况下的 ePWM 寄存器转储以及第一次检测到重叠。
此时、我很想找到另一种不依赖于 PWM 斩波器的解决方案。 感谢您的观看。
您好、Jay、
感谢您的提问。
此致!
Ryan Ma