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.

[参考译文] LAUNCHXL-F280049C:HRPWM 相移控制中的微边沿数量存在问题

Guru**** 2771175 points

Other Parts Discussed in Thread: LAUNCHXL-F280049C, C2000WARE, TIDA-010054

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/956917/launchxl-f280049c-problem-with-number-of-micro-edge-in-hrpwm-phase-shift-control

器件型号:LAUNCHXL-F280049C
主题中讨论的其他器件: C2000WARETIDA-010054

大家好、我叫 Iulian Popa。

我是´m 萨拉戈萨大学的学生。 我´m 您的开发板'LAUNCHXL-F280049C'、当我尝试控制某些 PWM 信号时、我有一些问题和疑问。

首先、我使用:

-  CodeComposer 版本9.3

-  C2000Ware 版本3.1.0.00

最后、在我的帖子(e2e.ti.com/.../954853)中得到 Nima Eskandari 的支持后 、我实现了相移控制、在该控制中、我能够更新相移和高分辨率相移。 但是、我已经进行了几次测试来验证 MEP 模块的正确运行(我已经通过论坛帖子了解如何使用此模块)。

我正在使用频率为10MHz 的 MCU 内部振荡器、并使用 PLL 定义如下:
#define DEVICE_OSCSRC_FREQ 10000000U
#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_OSC2 | SYSCTL_IMULT (40)|
SYSCTL_FMULT_NONE | SYSCTL_SYSDIV (2)|
SYSCTL_PLL_ENABLE)
#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 40 * 1)/ 2)

这样、我就能够以5ns 的分辨率生成100KHz PWM 信号(TBPRD = 2000;测量频率= 100KHz;分辨率为5ns)。
使用库"SFO_v8.h"的函数、5ns 的粗步长中的每一步将其分为33个细步长(150ps 分辨率)。 但是、在实践中、当我尝试手动配置 EPwmxRegs.TBPHS.bit.TBPHPHSHR 寄存器时、该寄存器的倍数为256*1、256*2、256*3、256*4…256*33、得到的相移不是150ps * 33微步进= 5ns、实际上结果接近2.5ns。


为什么 MEP 模块指示的33个步长不扫描所有粗步长?

问候语。 Iulian。

使用 www.DeepL.com/Translator 翻译(免费版)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    假设您在代码中定期使用 SFO、是否在 HRPWM 设置中启用了 AUTOCONV?

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、  

    我´ve 了这两种方法、即激活和取消激活。 我的 HRPWM_Config 函数如下所示:

    void Config_HRPWM (void){
    SYSCTL_DisablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);//禁用 PWM 的同步和时钟
    
    uint16_t j;
    
    对于(j=1;j 高分辨率 ePWM <-------------------------------------------------------
    EALLOW;
    
    (* ePWM[j]).HRCNFG.ALL = 0x0;//清除所有 HRPWM 位
    (* ePWM[j]).HRCNFG.bit.EDGMODE = HR_BEP;//在两个边沿上进行 MEP 控制
    (* ePWM[j]).HRCNFG.bit.CTLMODE = HR_PHS;// TBPHSHR 控制模式
    (* ePWM[j]).HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的负载= 0
    
    // (* ePWM[j]).HRMSTEP.bit.HRMSTEP = 33U;
    
    (* ePWM[j]).HRCNFG.bit.AUTOCONV = 0; //启用自动转换
    
    (* ePWM[j]).HRPCTL.bit.HRPE = 0;//关闭高分辨率周期控制。
    (* ePWM[j]).HRPCTL.bit.TBPHSHRLOADE = 1;//TBPHSHR 加载使能
    
    (* ePWM[j]).HRPWR.bit.CALPWRON = 1;//启用 MEP 校准逻辑
    
    EDIS;
    }
    SYSCTL_enablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);//启用 PWM 同步和时钟
    } 

    我´ve´s 使用、而不是 SFO、使用或不使用 AUTOCONV、但它始终相同。  

    我最后执行的测试之一是将 SYSCLK 和 PLL 设置恢复为默认值(10ns 分辨率/100MHz 频率)。 通过这种方法、SFO 将精细步长扩展到66 (这是合理的、因为10ns/66微步长= 150ps、可通过 F280049C 的 MEP 获得)
    但是、当使用示波器进行捕获并手动操作寄存器 TBPHS.bit.TBPHSHR 时、我意识到当我获得值"TBPHS.bit.TBPHSHR = 55步长* 256;这是使 PWM 信号相对于主 PWM 移动的最后一个值、 也就是说、如果我更改为"TBPHS.bit.TBPHSHR=56步* 256;"、则没有变化、这与我放置66*256时的情况相同。 因此、我无法以66步长扫描10ns、但我保持在8.25ns 内、这是实现转换器控制时的一个严重问题。

    是否有任何关于问题可能是什么的线索?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    启用 AUTOCOV、在这种情况下、ePWM 寄存器的 HR 部分可以从1-FF 变为覆盖整个范围。

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    也不要触摸该寄存器。 它由 SFO 库使用和处理。

    (*ePWM[j]).HRPWR.bit.CALPWRON = 1; //Enables MEP Calibration LOGIC

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Nima。
    我已从配置中删除"CALPRWRON"位的激活、并已激活 HR 自动转换。 我已经更改了高分辨率模块的配置、现在我使用"driverlib"库的函数(我在 IT 论坛中看到了更多来自您的答案、以查看我在回答问题时是否找到了解决方案)。
    现在、我的高分辨率模块配置如下所示:

    #include "SFO_v8.h"
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// GLOBAL_definitions ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    int MEP_ScaleFactor;// SFO 库使用的全局变量
    //结果可用于所有 HRPWM 通道
    //此变量也被复制到 HRMSTEP
    //按 SFO ()函数注册。
    
    uint16_t status;
    
    //由 SFO 库使用(ePWM[0]是不使用的虚拟值)
    volatile uint32_t ePWM[]={0、EPWM1_base、EPWM2_base、EPWM3_base、EPWM3_base、EPWM4_base、 EPWM5_base、EPWM6_BASE};
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// INTO_MAIN////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    while (status =SFO_INCOMPLETE){
    状态= SFO ();
    if (status =SFO_ERROR){
    ERROR();//如果发生错误,SFO 函数返回2,MEP #
    } //步进/粗步进超过最大255。
    }
    
    EALLOW;
    
    for (;;){
    if (status =SFO_ERROR){
    error();//如果出现错误,并且 MEP 步进/粗步进的#//超过最大值255,SFO 函数将返回2。
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    uint16_t j;
    
    对于(j=1;j 高分辨率 ePWM <-------------------------------------------------------
    
    HRPWM_setMEPEdgeSelect (ePWM[j]、HRPWM_CHANGE_A、HRPWM_MEP_CTRL_RISing_and_FALLING_EDGE);//MEP 控制上升沿和下降沿
    HRPWM_setMEPControlMode (ePWM[j]、HRPWM_CHANGE_A、HRPWM_MEP_PHASE_CTRL);//TBPHSHR 控制 MEP 边沿
    HRPWM_setCounterCompareShadowImage 事件(ePWM[j]、HRPWM_CHANGE_A、HRPWM_LOAD_ON_CNTR_ZERO _PERIOD); //必须为 CTR =(ZER & PRD)
    
    HRPWM_enableAutoConversion (ePWM[j]);//启用 MEP (微边沿定位器)自动缩放模式
    
    HRPWM_DisablePeriodControl (ePWM[j]);//禁用高分辨率周期特性
    HRPWM_enablePhaseShiftLoad (ePWM[j]);//启用高分辨率相位负载
    } 

    我已经使用了我在您在 IT 论坛上的一篇文章中看到的 HR 模块初始化、我对其进行了调整、使其控制相移、而不是占空比控制。
    在这种配置下、我已经测试了您在回答中提出的建议、并提出了更多问题、下面我将这些问题公开:

    首先、我尝试写入寄存器 TBPHSHR = 0xFF00、相当于十进制的65280。 通过这样做、我实现了监控的 PWM 信号从我预期的10ns 移动8.1ns。 我已附上示波器的3个截图供您查看我的意思以及 CCS 中的 xx 个表达式的截图。

    这样、我就无法扫描10ns 的整个范围、即 PWM 信号的1000个阶跃中的每一个、我将会错过1.9ns。

    我还想问你其他的问题:如果 SFO 库真正返回 MEP_ScaleFactor = 66、为什么我应该在 TBPHSHR 寄存器中到达0xFF00? 这是否意味着 PWM 的每个步进被分成66微步进、即150ps?
    根据我的理解方式:10ns = 66微步进*每个微步进为150ps、因此、如果我写入寄存器 TBPHSHR = 0x4200 (十进制为66)、它应该移动10ns、我得到的是它移动2.55ns (这让我认为分辨率不是150ps、而是每个微步进的2.55ns/66步进= 38ns、而不是150ps)。 我附上了我对它的理解方式的说明、并附上了我之前提到的示波器测试结果的截图。

    我希望现在我再详细说明一下我的解释和问题、你可以看到我做了些什么错误、或者我理解了一些错误。 大家好。 Iulian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Iulian、

    感谢您的详细解释。 当您启用 AUTOCONV 时、HRPWM 模块将在内部使用 MEP_SCALEFACTOR 并将其应用于计算公式。 如果 AUTOCONV 未打开、则是、0-66将是完整的放置位置。 如果 AUTOCONV 打开、则内部0-FF 会转换为0-66之间的数字。 线性转换、以减轻您的分频。

    至于缺少的2.5ns、我们如何将 AUTOCONV 保持为关闭状态、然后扫描这些值、并稍微超过66? 这是否涵盖了该范围的其余部分?

    也许可以尝试70? 75? 并捕获一些示波器截图供我查看。 确保将 autoconv 关闭。

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、感谢你的回答。

    您对自转换和 MEP_ScaleFactor 的回答为我解答了不少问题。
    为了回应您的反馈、我已经对 LAUNCHXL-F280049C 进行了几次测试。 首先、我想澄清一下"我的设置":
    我有一个1GHz HD 示波器、我已经校准了4个探头(无源)、并且我已经检查了 PWM "从"信号在它们之间同步(误差-+80pS)、这是超出可接受范围的。 为了测量2个从器件之间的相移、我使用了一个内置示波器功能、该功能通过平均100个"时间偏差"样本来测量2个信号之间的时间偏差(我使用了最大满量程时间来提高精度)。
    话虽如此、我现在进行了两项测试。 一个与寄存器(AUTOCONV = 1)连接、另一个与寄存器(AUTOCONV = 0且 MEP_STEPS = 66)连接。

    -AUTOCONV case = 1 ->
    我已经使用0x0A00的阶跃(DEC 以2560为增量)对0x0000到0xFF00的寄存器(EPwm2Regs.TBPHS.TBPHSHR)执行了扫描。 我在 Excel 中收集了这些数据、然后继续绘制结果图。 可以看出、当达到 EPwm2Regs.TBPHS.TBPHSHR = 0xDC00时、EPWM2_A 信号停止移动、相对于 EPWM3_A 停滞在8.15ns、即使您达到 EPwm2Regs.TBPHS.TBPHSHR = 0xFF00、相移也保持在8.15ns。


    case AUTOCONV = 0 & MEP_STEP = 66 ->
    我已对寄存器(EPwm2Regs.TBPHS.TBPHSHR)执行从0x0000到0x4200的扫描(对应于 MEP 256*66 = 16896 = 0x4200的66个阶跃)
    与 AUTOCONV = 1的情况相同、从0x3600开始、PWM 信号处于停滞状态、相移保持在接近8.22ns。 正如您要求我这样做的那样、我已将步数从66增加到80。 结果是相移保持在8.2ns。 一个显著的事实是、当我达到150时、我正在转换的 PWM 信号在上升时间产生谷底后会受到干扰。

    我正在连接在 Excel 中为两种测试收集的数据的捕获以及 AUTOCONV = 0时 PWM 信号受到的毛刺脉冲、并且我尝试写入 EPwm2Regs.TBPHS.TBPHSHR = 0x9600 (38400 DEC = 256*150)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好极了。 我现在可以看到您数据中的所有内容。

    那么、我们仍然无法正确执行完整扫描?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不可以、我还无法仅使用高分辨率寄存器获得大于8.2ns 的相移。 这使转换器的项目面临严重风险、因为它是精度低16'66倍的控制器(因为我只能执行2'5ns 的精细步长、而不会落入我在 PWM 步长8.2和10ns 之间无法达到的间隔)

    我尝试以多种不同的方式初始化 PWM、我认为我已经阅读了与此主题相关的所有文章、这些文章在您的活动中都有、但我始终得出相同的结论: 无论我激活 AUTOCONV 还是禁用 AUTOCONV、我都无法克服8.2ns 的相移。

    您是否知道我应该配置什么或我在哪里产生错误?

    我等待您的回答。 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否将您的配置与此处的配置进行比较:

    C2000Ware_3_03_00_00\device_support\f2837xd\examples\cpu1\HRPWM_dadband _SFO_V8

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经查看了相关示例、我可以说我执行了相同的初始化(区别在于我使用 driverlib、在本例中我访问记录)。

    我不清楚 GLDCTL 记录的用途是什么。 在我的配置中、我没有对此寄存器进行任何配置、也没有实施任何死区。

    对于 PWM 主器件:
    -先递增后递减计数
    -相移关闭
    -比较阴影:必须为 CTR =(ZER & PRD)
    - ePWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO 以生成从器件的同步脉冲。
    - HR_EdgeSelect =向上和向下。
    -HR 控制模式:相位控制
    - HR 影子比较:必须为 CTR =(ZER & PRD)
    -激活自动转换
    -取消激活高分辨率周期控制

    对于 PWM 从器件:
    -先递增后递减计数
    -相移已激活
    -比较阴影:必须为 CTR =(ZER & PRD)
    - EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN 与主器件同步
    - HR_EdgeSelect =向上和向下。
    - HR 控制模式:相位控制
    - HR 影子比较:必须为 CTR =(ZER & PRD)
    -激活自动转换
    -取消激活高分辨率周期控制
    -激活高分辨率相移。

    我附上初始化代码。 一方面、我有 PWM 主器件、在环路中、我初始化另一个 PWM。

    //在主设置()
    init_ePWM_GPIOs ();
    EALLOW;
    SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
    init_HR_ePWM ();
    SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC)中;
    EDIS;
    
    //配置函数
    void init_HR_ePWM (void){
    
    ///--------------------------------------------------------- > PWM
    // EPWM_setEmulationMode (EPWM1_base、ePWM_emulation_free_run);
    
    ePWM_setTimeBasePeriod (EPWM1_base、ePWM_PERIOD);
    ePWM_setTimeBaseCounter (EPWM1_base、0U);
    
    ePWM_setCounterCompareValue (EPWM1_base、ePWM_COUNTER_COMPARE_A、ePWM_Duty);
    
    ePWM_setTimeBaseCounterMode (EPWM1_base、ePWM_COUNTER_MODE_UP_DOWN);
    ePWM_DisablePhaseShiftLoad (EPWM1_base);
    ePWM_setClockPrescaler (EPWM1_base、ePWM_CLOCK 分频器_1、ePWM_HSCLOCK_divider 1);
    
    ePWM_setCounterCompareShadowImage LoadMode (EPWM1_base、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO _PERIOD);
    
    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_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_period);
    
    ePWM_setSyncOutPulseMode (EPWM1_base、ePWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);//计数器零事件生成 ePWM 同步输出脉冲
    
    // ePWM_selectPeriodLoadEvent (EPWM1_base、ePWM_SHADD_LOAD_MODE_SYNC);
    ePWM_setInterruptSource (EPWM1_base、ePWM_INT_TBCTR_ZERO);
    ePWM_enableInterrupt (EPWM1_base);
    ePWM_setInterruptEventCount (EPWM1_BASE、1U);
    //--------------------------------
    
    ///--------------------------------------------------------- > HRPWM
    HRPWM_setMEPEdgeSelect (EPWM1_base、HRPWM_CHANGE_A、HRPWM_MEP_CTRL_RISTing_and_FALLING_EDGE);//MEP 控制上升沿和下降沿
    HRPWM_setMEPControlMode (EPWM1_base、HRPWM_CHANGE_A、HRPWM_MEP_PHASE_CTRL);//TBPHSHR 控制 MEP 边沿
    HRPWM_setCounterCompareShadowImage 事件(EPWM1_base、HRPWM_CHANNEL、HRPWM_LOAD_ON_CNTR_ZERO); //必须为 CTR =(ZER & PRD)
    
    HRPWM_enableAutoConversion (EPWM1_base);
    // HRPWM_disableAutoConversion (EPWM1_base);
    // HRPWM_setMEPStep (EPWM1_base、66U);
    
    HRPWM_DisablePeriodControl (EPWM1_base);//禁用高分辨率周期特性
    HRPWM_setSyncPulseSource (EPWM1_base、HRPWM_PWMSYNC_SOURCE);
    //--------------------------------
    
    
    uint16_t j = 0;
    for (j=2;j<7;j++){
    ///--------------------------------------------------------- > PWM
    // ePWM_setEmulationMode (ePWM[j]、ePWM_emulation_free_run);
    
    ePWM_setTimeBasePeriod (ePWM[j]、ePWM_PERIOD);
    ePWM_setPhaseShift (ePWM[j]、0U);
    ePWM_setTimeBaseCounter (ePWM[j]、0U);
    
    ePWM_setCounterCompareValue (ePWM[j]、ePWM_COUNTER_COMPARE_A、ePWM_Duty);
    
    ePWM_setTimeBaseCounterMode (ePWM[j]、ePWM_COUNTER_MODE_UP_DOWN);
    ePWM_enablePhaseShiftLoad (ePWM[j]);
    ePWM_setClockPrescaler (ePWM[j]、ePWM_CLOCK 分频器_1、ePWM_HSCLOCK_divider 1);
    
    ePWM_setCounterCompareShadowImage LoadMode (ePWM[j]、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO _PERIOD);
    ePWM_setCounterCompareShadowImage LoadMode (ePWM[j]、ePWM_COUNTER_COMPARE_B、ePWM_COMP_LOAD_ON_CNTR_ZERO _PERIOD);
    ePWM_setSyncOutPulseMode (ePWM[j]、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
    
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_A、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_zero);
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_A、ePWM_AQ_output_low、ePWM_COMP_LOAD_ON_CNTR_zero_period);
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_B、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_zero);
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_B、ePWM_AQ_output_high、ePWM_COMP_LOAD_ON_CNTR_zero_period);
    //--------------------------------
    
    ///--------------------------------------------------------- > HRPWM
    HRPWM_setMEPEdgeSelect (ePWM[j]、HRPWM_CHANGE_A、HRPWM_MEP_CTRL_RISing_and_FALLING_EDGE);//MEP 控制上升沿和下降沿
    HRPWM_setMEPControlMode (ePWM[j]、HRPWM_CHANGE_A、HRPWM_MEP_PHASE_CTRL);//TBPHSHR 控制 MEP 边沿
    HRPWM_setCounterCompareShadowImage 事件(ePWM[j]、HRPWM_CHANGE_A、HRPWM_LOAD_ON_CNTR_ZERO); //必须为 CTR =(ZER & PRD)
    
    HRPWM_setMEPEdgeSelect (ePWM[j]、HRPWM_CHANGE_B、HRPWM_MEP_CTRL_RISing_and_FALLING_EDGE);//MEP 控制上升沿和下降沿
    HRPWM_setMEPControlMode (ePWM[j]、HRPWM_CHANGE_B、HRPWM_MEP_PHASE_CTRL);//TBPHSHR 控制 MEP 边沿
    HRPWM_setCounterCompareShadowImage 事件(ePWM[j]、HRPWM_CHANGE_B、HRPWM_LOAD_ON_CNTR_ZERO); //必须为 CTR =(ZER & PRD)
    
    HRPWM_enableAutoConversion (ePWM[j]);
    // HRPWM_DisableAutoConversion (ePWM[j]);
    // HRPWM_setMEPStep (ePWM[j]、66U);
    
    
    HRPWM_DisablePeriodControl (ePWM[j]);//禁用高分辨率周期特性
    HRPWM_enablePhaseShiftLoad (ePWM[j]);//启用高分辨率相位负载
    HRPWM_setSyncPulseSource (ePWM[j]、HRPWM_PWMSYNC_SOURCE);
    ///-------------------------------------------------------
    
    
    
    ///------------------------------ >ePWM 同步<-------------------------------------------------------
    //--------------------------------
    
    SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM4、SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);
    SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM7、SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ´ve、Nima、我尝试了一些其他 PWM 初始化、但未成功。

    您能否尝试为 F280049C 或类似器 件生成基于 Driverlib 的简单程序、并尝试在主 PWM 信号和从器件之间引入高分辨率相移(尝试在 AUTOCONV = 1的情况下实现 EPwm2Regs.TBPHS.TBPHSHR 的整个范围)。

    我附加了我的 CCS 工程、以防它有助于发现不允许使用高分辨率寄存器达到 PWM 步进的整个范围的误差。

    我等你的回答,你好,Iulian。

    e2e.ti.com/.../F28004x_5F00_Control_5F00_Design.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Iulian、

    是的、我肯定可以努力将一些代码组合在一起、因为我不确定导致这种情况的原因、但这需要几天的时间。

    我将在取得一些结果后回复。 同时、如果需要很长时间、我将向您提供最新进展。

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Iulian、

    仍在为您整理这些内容。

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、Iulian、我看到了类似的东西。 我似乎无法让 HR 部分扫描整个范围。

    、 

    我需要有关这个问题的一些帮助。 以下是了解该问题的所有信息。

    两个 ePWM 在 HR 模式(TBPHS 和 TBPHSHR)下同步。 启用自动转换。 从0-FF 开始的 TBPHSHR 不能覆盖 ePWM 粗步进的整个范围。

    下面是该问题的一个示例。 0xFF 无法完全扫描...

    以下是 ePWM 设置:

    void initEPWM (uint32_t base)
    {
    //
    //设置 TBCLK
    //
    ePWM_setTimeBasePeriod (base、ePWM_TIMER_TBPRD);
    ePWM_setPhaseShift (base、0U);
    ePWM_setTimeBaseCounter (base、0U);
    
    //
    //设置比较值
    //
    ePWM_setCounterCompareValue (基本值、
    ePWM_COUNTER_COMPARE_A、
    ePWM_TIMER_TBPRD/2);
    ePWM_setCounterCompareValue (基本值、
    ePWM_COUNTER_COMPARE_B、
    ePWM_TIMER_TBPRD/4);
    
    //
    //设置计数器模式
    //
    ePWM_setTimeBaseCounterMode (base、ePWM_COUNTER_MODE_UP);
    ePWM_DisablePhaseShiftLoad (base);
    ePWM_setClockPrescaler (base、
    ePWM_CLOCK 分频器_1、
    ePWM_HSCLOCK_DEVIDER_1);
    
    //
    //设置隐藏
    //
    EPWM_setCounterCompareShadowImage LoadMode (基本、
    ePWM_COUNTER_COMPARE_A、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);
    EPWM_setCounterCompareShadowImage LoadMode (基本、
    ePWM_COUNTER_COMPARE_B、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);
    
    //
    //设置操作
    //
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_zero);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_zero);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_up_CMPB);
    
    
    HRPWM_setMEPEdgeSelect (base、HRPWM_CHANGE_A、HRPWM_MEP_CTRL_RISTing_and_FALLING_EDGE);
    HRPWM_setMEPControlMode (base、HRPWM_CHANGE_A、HRPWM_MEP_PHASE_CTRL);
    HRPWM_setCounterCompareShadowImage 事件(base、HRPWM_CHANNEL、HRPWM_LOAD_ON_CNTR_ZERO _PERIOD);
    
    HRPWM_setMEPEdgeSelect (base、HRPWM_CHANGE_B、HRPWM_MEP_CTRL_RISTing_and_FALLING_EDGE);
    HRPWM_setMEPControlMode (base、HRPWM_CHANGE_B、HRPWM_MEP_PHASE_CTRL);
    HRPWM_setCounterCompareShadowImage 事件(base、HRPWM_CHANNEL、HRPWM_LOAD_ON_CNTR_ZERO _PERIOD);
    
    HRPWM_enableAutoConversion (base);
    
    HRPWM_enablePhaseShiftLoad (base);
    
    //
    //中断,我们将在其中更改比较值
    //选择 INT on 时基计数器零事件,
    //启用 INT,在发生第1个事件时生成 INT
    //
    ePWM_setInterruptSource (base、ePWM_INT_TBCTR_ZERO);
    ePWM_enableInterrupt (base);
    ePWM_setInterruptEventCount (base、1U);
    } 

    无 HR 周期或占空比。

    您知道是什么原因导致了这种情况吗? 这不是一个独特的情况、在任何模式下、我似乎都无法获得完全扫描。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您知道为什么 TBPHSHR 不扫描完整 EPWMCLK 阶跃的范围?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、请原谅我的回答延迟。
    今天我已经取得了一些进展、我认为我在 AUTOCONV = 1的 TBPHSHR 寄存器的整个范围内实现了 PWM 的一个粗步相移。
    在我的项目中、我使用内部振荡器 INTOSC2来生成 CLK 信号。 我已按如下方式配置 PLL 倍频器:

    #define DEVICE_OSCSRC_FREQ 10000000U
    
    #define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_OSC2 | SYSCTL_IMULT (10)|
    SYSCTL_FMULT_NONE | SYSCTL_SYSDIV (2)\
    SYSCTL_PLL_ENABLE)
    
    #define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 10 * 1)/ 2) 

    从这个 PLL 配置开始、我已经生成了一个所有需要将它们与 ePWM_1同步的 PWM 模块的初始化函数。 我对您在回答中传递给我的代码有不同之处:

    -->我看到您已在"向上计数模式"中初始化 PWM 模块的 TBCTR。 在您的几篇文章中、我看到您始终建议在"向上-向下-模式"中初始化它。 我像这样初始化它、它已经工作了。
    借助 PLL 的这种配置、您可以获得20ns 的 PWM 分辨率、我想我可以通过在2个从器件之间增加 TBPHSHR 来实现20ns 的整个步进相移。 我将执行更多的测试、以排除我之前测试中的错误。

    您能否尝试此 PLL 配置、更改 PWM 计数模式并尝试获取100kHz 信号?

    我使用的代码是我之前的帖子中的代码、我只使用内部晶体和微控制器的 PLL 播放。

    我希望通过这两项更改、您可以看到一些内容并澄清发生了什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    由于我没有使用高分辨率寄存器进行20ns 扫描、因此我进行了许多试验。 我将随附当前 PWM 模块初始化的代码、以便您可以按照我对我发现的内容的解释进行操作、以防您对导致该代码的原因有任何了解。

    ///---------------------------------------------- PWM 配置
    void init_HR_ePWM (void){
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///--------------------------------------------------------- > PWM
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //-------------------------------- 周期配置-->
    ePWM_setTimeBasePeriod (EPWM1_base、ePWM_PERIOD);
    ePWM_setPeriodLoadMode (EPWM1_base、ePWM_PERIOD_LOAD);
    ePWM_selectPeriodLoadEvent (EPWM1_base、ePWM_SHAD_LOAD_MODE_COUNTER_ZERO);

    //-------------------------------- TB_COUNTER 配置-->
    ePWM_setTimeBaseCounter (EPWM1_base、0U);
    ePWM_setTimeBaseCounterMode (EPWM1_base、ePWM_COUNTER_MODE_UP_DOWN);

    //-------------------------------- 比较 A/B 配置-->
    ePWM_setCounterCompareValue (EPWM1_base、ePWM_COUNTER_COMPARE_A、ePWM_PERIODE/2);
    ePWM_setCounterCompareValue (EPWM1_base、ePWM_COUNTER_COMPARE_B、ePWM_PERIOD - ePWM_PERIODE/2);
    ePWM_setCounterCompareShadowImage LoadMode (EPWM1_base、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);
    ePWM_setCounterCompareShadowImage LoadMode (EPWM1_base、ePWM_COUNTER_COMPARE_B、ePWM_COMP_LOAD_ON_CNTR_ZERO);

    //-------------------------------- PHASE_SHIFT 配置-->
    ePWM_DisablePhaseShiftLoad (EPWM1_base);

    //-------------------------------- 时钟预分频器配置-->
    ePWM_setClockPrescaler (EPWM1_base、ePWM_CLOCK 分频器_1、ePWM_HSCLOCK_divider 1);

    //-------------------------------- 输出配置-->
    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_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (EPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_period);
    ePWM_setActionQualifierAction (EPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_down_CMPB);

    //-------------------------------- Syncro 配置-->
    ePWM_setSyncOutPulseMode (EPWM1_base、ePWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    // ePWM_setCountModeAfterSync (EPWM1_BASE、ePWM_COUNT_MODE_UP_AST_SYNC_SYNC);
    ePWM_forceSyncPulse (EPWM1_base);

    //-------------------------------- 全局加载配置-->
    ePWM_setGlobalLoadTrigger (EPWM1_base、ePWM_GL_LOAD_PULSE_CNTR_ZERO _PERIOD);
    ePWM_enableGlobalLoadOneShotMode (EPWM1_BASE);
    ePWM_enableGlobalLoad (EPWM1_base);
    ePWM_setupEPWMLinks (EPWM1_base、ePWM_LINK_WM_WM_1、ePWM_LINK_GLDCTL2);

    //-------------------------------- PWM 中断配置-->
    // ePWM_setInterruptSource (EPWM1_base、ePWM_INT_TBCTR_ZERO);
    // ePWM_enableInterrupt (EPWM1_base);
    // ePWM_setInterruptEventCount (EPWM1_BASE、1U);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///---------------------------------------------------------- > HRPWM
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //-------------------------------- 心率边缘配置-->
    HRPWM_setMEPEdgeSelect (EPWM1_base、HRPWM_CHANGE_A、HRPWM_MEP_CTRL_RISTing_and_FALLING_EDGE);

    //-------------------------------- HR-control configuration (HR-control 配置)-->
    HRPWM_setMEPControlMode (EPWM1_base、HRPWM_CHANGE_A、HRPWM_MEP_PHASE_CTRL);
    HRPWM_DisablePhaseShiftLoad (EPWM1_BASE);
    HRPWM_enablePeriodControl (EPWM1_base);

    //-------------------------------- HR-比较配置-->
    HRPWM_setCounterCompareShadowImage 事件(EPWM1_base、HRPWM_CHANNEL、HRPWM_LOAD_ON_CNTR_ZERO _PERIOD);

    //-------------------------------- HR-MEP_SCALEFACTOR 配置-->
    HRPWM_enableAutoConversion (EPWM1_base);
    // HRPWM_DisableAutoConversion (EPWM1_base);
    // HRPWM_setMEPStep (EPWM1_BASE、66U);

    //-------------------------------- HR-Syncro 配置-->
    HRPWM_setSyncPulseSource (EPWM1_base、HRPWM_PWMSYNC_SOURCE 零);
    //--------------------------------


    uint16_t j = 0;
    for (j=2;j<7;j++){
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///--------------------------------------------------------- > PWM
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //-------------------------------- 周期配置-->
    ePWM_setTimeBasePeriod (ePWM[j]、ePWM_PERIOD);
    ePWM_setPeriodLoadMode (ePWM[j]、ePWM_PERIOD_SHADOD_LOAD);
    ePWM_selectPeriodLoadEvent (ePWM[j]、ePWM_SHAD_LOAD_MODE_COUNTER_ZERO);

    //-------------------------------- TB_COUNTER 配置-->
    ePWM_setTimeBaseCounter (ePWM[j]、0U);
    ePWM_setTimeBaseCounterMode (ePWM[j]、ePWM_COUNTER_MODE_UP_DOWN);

    //-------------------------------- 比较 A/B 配置-->
    ePWM_setCounterCompareValue (ePWM[j]、ePWM_COUNTER_COMPARE_A、ePWM_PERIODE/2);
    ePWM_setCounterCompareValue (ePWM[j]、ePWM_COUNTER_COMPARE_B、ePWM_PERIOD - ePWM_PERIODE/2);
    ePWM_setCounterCompareShadowImage LoadMode (ePWM[j]、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);
    ePWM_setCounterCompareShadowImage LoadMode (ePWM[j]、ePWM_COUNTER_COMPARE_B、ePWM_COMP_LOAD_ON_CNTR_ZERO);

    //-------------------------------- PHASE_SHIFT 配置-->
    ePWM_enablePhaseShiftLoad (ePWM[j]);
    ePWM_setPhaseShift (ePWM[j]、0U);

    //-------------------------------- 时钟预分频器配置-->
    ePWM_setClockPrescaler (ePWM[j]、ePWM_CLOCK 分频器_1、ePWM_HSCLOCK_divider 1);

    //-------------------------------- 输出配置-->
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_A、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_zero);
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_a、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_A、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_period);
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_down_CMPB);

    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_B、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_zero);
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_B、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_B、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_period);
    ePWM_setActionQualifierAction (ePWM[j]、ePWM_AQ_output_B、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_down_CMPB);

    //-------------------------------- Syncro 配置-->
    ePWM_setSyncOutPulseMode (ePWM[j]、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
    // ePWM_setCountModeAfterSync (ePWM[j]、ePWM_COUNT_MODE_UP_AST_SYNC_SYNC);
    ePWM_forceSyncPulse (ePWM[j]);

    //-------------------------------- 全局加载配置-->
    ePWM_setGlobalLoadTrigger (ePWM[j]、ePWM_GL_LOAD_PULSE_CNTR_ZERO _PERIOD);
    ePWM_enableGlobalLoadOneShotMode (ePWM[j]);
    ePWM_enableGlobalLoad (ePWM[j]);
    ePWM_setupEPWMLinks (ePWM[j]、ePWM_LINK_带有 ePWM_1、ePWM_LINK_GLDCTL2);
    //--------------------------------

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///--------------------------------------------------------- > HRPWM
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //-------------------------------- 心率边缘配置-->
    HRPWM_setMEPEdgeSelect (ePWM[j]、HRPWM_CHANGE_A、HRPWM_MEP_CTRL_RISTing_and_FALLING_EDGE);
    HRPWM_setMEPEdgeSelect (ePWM[j]、HRPWM_CHANGE_B、HRPWM_MEP_CTRL_Rising 和_FALLING_EDGE);

    //-------------------------------- HR-control configuration (HR-control 配置)-->
    HRPWM_setMEPControlMode (ePWM[j]、HRPWM_CHANGE_A、HRPWM_MEP_PHASE_CTRL);
    HRPWM_setMEPControlMode (ePWM[j]、HRPWM_CHANNEL、HRPWM_MEP_PHASE_CTRL);
    HRPWM_enablePhaseShiftLoad (ePWM[j]);
    HRPWM_disablePeriodControl (ePWM[j]);

    //-------------------------------- HR-比较配置-->
    HRPWM_setCounterCompareShadowImage 事件(ePWM[j]、HRPWM_CHANGE_A、HRPWM_LOAD_ON_CNTR_ZERO _PERIOD);
    HRPWM_setCounterCompareShadowImage 事件(ePWM[j]、HRPWM_CHANGE_B、HRPWM_LOAD_ON_CNTR_ZERO _PERIOD);

    //-------------------------------- HR-MEP_SCALEFACTOR 配置-->
    HRPWM_enableAutoConversion (ePWM[j]);
    // HRPWM_DisableAutoConversion (ePWM[j]);
    // HRPWM_setMEPStep (ePWM[j]、66U);

    //-------------------------------- HR-Syncro 配置-->
    HRPWM_setSyncPulseSource (ePWM[j]、HRPWM_PWMSYNC_SOURCE _ZERO);
    ///----------------------------------------------

    ///------------------------------ >ePWM 同步链-------------------------------------------------------
    //--------------------------------
    SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM4、SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);
    SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM7、SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);
    //--------------------------------

     

    从这个配置中、我已经用示波器捕获了2个从 PWM (EPWM5_A 和 EPWM6_A)的信号。 ´m 我所附的配置、我手动更改寄存器:
    - TBPHS = 0x0000
    - TBPHSHR = 0x00FF
    达到大约18.45ns。
    我一直在进行计算、在 PWM 的每粗步长20ns 分辨率下、18.45ns 相当于 TBPHSHR = 0x00EC。 我已经进行了测试、实际上、当我配置 TBPHSHR = 0x00EC 时、PWM 的输出与配置为 TBPHSHR = 0x00FF 时相同(因此满足了该线程开头发生的情况)。

    在解释了这一点之后、我进行了不同的测试来检查它是否不是"影子加载"寄存器的问题。
    在我附加的代码中、寄存器 HRPWM_setCounterCompareShadowImage 事件配置为"HRPWM_LOAD_ON_CNTR_ZERO _PERIOD"、但是、我执行了更多测试来改变这些寄存器和 EPWM_setCounterCompareShadowImage LoadMode 寄存器:

    --> TEST_1:

    EPWM_setCounterCompareShadowImage LoadMode = EPWM_COMP_LOAD_ON_CNTR_ZERO
    HRPWM_setCounterCompareShadowImage LoadEvent = HRPWM_LOAD_ON_CNTR_ZERO _PERIOD
    
    或 
    EPWM_setCounterCompareShadowImage LoadMode = EPWM_COMP_LOAD_ON_CNTR_ZERO _PERIOD HRPWM_setCounterCompareShadowImage LoadEvent = HRPWM_LOAD_ON_CNTR_ZERO _PERIOD

    在这种情况下、当 TBPHSHR = 0x00FF (或0x00EC)时、我得到大约18.45ns 的相移

    ->TEST_2:

    EPWM_setCounterCompareShadowImage LoadMode = EPWM_COMP_LOAD_ON_CNTR_ZERO _PERIOD

    HRPWM_setCounterCompareShadowImage 事件=HRPWM_LOAD_ON_CNTR_ZERO 或 HRPWM_LOAD_ON_CNTR_PERIOD

    在这种情况下、通过设置寄存器 TBPHSHR = 0x00FF、PWM 输出(在正边沿上)从18.45ns 移动到20ns。 下降沿保持固定。 这让我认为 HR 寄存器确实可以实现20ns 的全相移、但存在一些同步问题(视频已连接)。

    e2e.ti.com/.../WhatsApp-Video-2020_2D00_12_2D00_09-at-13.27.04.mp4

    因此、总之、当使用函数 HRPWM_setCounterCompareShadowImage LoadEvent = HRPWM_LOAD_ON_CNTR_ZERO 或 HRPWM_LOAD_ON_CNTR_PERIOD 时、相移达到20ns、但在18.45ns 和20ns 之间变化(视频)。 但是、如果设置为 HRPWM_setCounterCompareShadowImage LoadEvent == HRPWM_LOAD_ON_CNTR_ZERO _PERIOD、则永远不会达到18.45ns 以上、并且不会移动。

    我希望在这个新的发展过程中、有人会知道类似的问题、以及为什么无法轻松实现20ns 或整个范围的粗略 PWM 步进

    感谢您的参与、 我正在等待您的回复。 Iulian。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 EPMW 时钟为100MHz 时、每个步长为10ns。 您的 HR 模块应仅用于覆盖10ns。 您能否在 ePWM 设置为100MHz 时获得10ns 扫描?

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Nima、您好、请记住、在同一个线程中、我附加了一些与 PWM 模块的相移和 TBPHSHR 寄存器相关的图形(11月25日、2020年1:11 PM)。 当时在开发项目时、我使用了 LAUNCHXL-F280049C 的外部振荡器(100MHz - 10ns PWM 步长)。 我目前正在使用50MHz - 20ns 的内部振荡器(INTOSC2)、以查看我是否满足其他临时 ADC 规格。 但是、在任何一种情况下(100MHz - 10ns 或50MHz - 20ns)、问题仍然存在、即我无法通过 TBPHSHR 寄存器实现10ns 或20ns 的完整 PWM 步进范围。 此外、借助我之前在该主题中的响应(2020年12月9日12:38 PM)的配置、我尝试使用外部振荡器和内部振荡器来运行它、结果是类似的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    明白了。 这是我的理解。 我将联系设计,了解为什么无法使用原始设置进行全面扫描。 同时、您能否尝试使用 TRREM 寄存器查看它是否对相移有任何影响?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、我在上面。 我当时在寻找 TRREM 寄存器的用途、但我不太清楚。 我正在尝试更仔细地阅读手册并将其付诸实践。

    感谢你能抽出时间、致以最诚挚的问候。 Iulian。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我不确定如何使用 TRREM 寄存器、也不确定如何以及在何处使用 HRPWM_setTranslatorRemainder 函数。 我一直在阅读该手册和一些论坛文章、例如: e2e.ti.com/.../3205354
    但是、他们并没有帮助我了解我确切地说、我必须如何处理该寄存器和函数。 在此帖子中、他们提到:
    "请参阅下面的内容

    不对称模式:

    TRREM [7:0]= TBPHSHR [15:8]

    TRREM[10、9、8]= 0、0、0

    对称模式:

    TRREM [7:0]= TBPHSHR [15:8]

    TRREM[10、9、8]= 0、0、1"

    我假设我处于"对称模式"的情况、并在 PWM 配置中使用了函数 HRPWM_setTranslatorRemainder (ePWM[j]、0x01FF)。 我还尝试在代码执行期间更改此函数的值、但我无法获得相移、或者这会影响相移达到20ns。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我们可以等待设计团队的回复。

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Nima、您好、设计团队有没有回答?

    Iulian。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    他们仍在进行这方面的工作。 当我得到答案时、我会报告。 很抱歉耽误你的时间。

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们的设计现在将研究我提供的示例。

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉耽误你的时间 设计团队仍在处理此问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Iulian、这是我从设计团队那里得到的响应。 可实现两个 HRPWM 之间的完全扫描相移、如下面的代码所示。

    我能够在示波器上验证它确实能够在没有间隙的情况下扫描整个范围。

    您可以在 EPWM1A 和 EPWM3A 之间看到这种情况。

    以下代码来自 TIDA-010054双有源电桥设计实验1。

    e2e.ti.com/.../dab_5F00_F28004x_5F00_Jan4_5F00_2021.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、感谢你对这个问题的奉献。 我将查看您发送给我的代码、以了解我在自己的项目中应该考虑的内容。 我一查看它、我就会告诉您一些事情。

    非常感谢。

    Iulian。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nima、我已经检查了您传递给我的代码、并将 PWM 配置与代码配置进行了比较。 我没有看到过大的差异(尤其是配置函数的调用顺序)。

    在您的消息中、您提到您在2个 PWM 信号之间实现了完全扫描、没有任何间隙。 您能否检查此代码以应用0x00EC 和0x00FF (236-255)之间的相移"HRPWM_setPhaseShift (EPWM2_base、0x00F0);"例如?
    尽管我做了一些修改、但我仍有问题、我在2020年12月9日中午12:38的回复中向您发送了视频。

    我之所以问您、是因为我无法在我的 Launchpad 上测试您传递给我的代码。

    大家好。 Iulian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    深入研究后的不同之处是:

    1.在增/减模式下使用 ePWM

    2.仅使用 CMPAU/CMPAD 更改 EPWM 输出。 CMPAU 上置1、CMPAD 上清零。

    如果您使用零/PRD 事件更改 EPWM 输出(设置/清除)、则会获得跳转。

    很抱歉、这需要很长时间才能解决。 具体来说、该配置适用于相移的全扫描。

    Nina

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、 我对你刚才提到的几点做出回应:

    1 -正常。 我的所有 ePWM 信号都像上行-下行模式-> ePWM_setTimeBaseCounterMode (ePWM[j]、ePWM_COUNTER_MODE_UP_DOWN)一样进行配置;

    2 -好的。 明白。 我将 EPWM´ve 更改为仅使用 CMPA_UP 和 CMPA_DOWN。 在我的解决方案中、我使用了 CMPA 和 CMPB 加/减。  在这种配置 ePWM 的方法中、ePWM 的频率为一半、而占空比直接由 CMPA 控制、对吧? (请参阅屏幕截图)

    3 -"如果使用零/PRD 事件更改 EPWM 输出(设置/清除)、则会跳转。"-->因此我的 EPWM 输出仅在 CMPA_UP (设置)和 CMPA_DOWN (清除)上刷新。

    明天我将在上大学时尝试这种配置、并给出答案。

      Iulian。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。 我使用100%正确的结果测试了以下代码:

    void initEPWMFIX (uint32_t base)
    {
    //
    //设置 TBCLK
    //
    ePWM_setTimeBasePeriod (base、ePWM_TIMER_TBPRD);
    ePWM_setPhaseShift (base、0U);
    ePWM_setTimeBaseCounter (base、0U);
    
    //
    //设置比较值
    //
    ePWM_setCounterCompareValue (基本值、
    ePWM_COUNTER_COMPARE_A、
    ePWM_TIMER_TBPRD/2);
    ePWM_setCounterCompareValue (基本值、
    ePWM_COUNTER_COMPARE_B、
    ePWM_TIMER_TBPRD/4);
    
    //
    //设置计数器模式
    //
    ePWM_setTimeBaseCounterMode (base、ePWM_COUNTER_MODE_UP_DOWN);
    ePWM_DisablePhaseShiftLoad (base);
    ePWM_setClockPrescaler (base、
    ePWM_CLOCK 分频器_1、
    ePWM_HSCLOCK_DEVIDER_1);
    
    //
    //设置隐藏
    //
    EPWM_setCounterCompareShadowImage LoadMode (基本、
    ePWM_COUNTER_COMPARE_A、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);
    EPWM_setCounterCompareShadowImage LoadMode (基本、
    ePWM_COUNTER_COMPARE_B、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);
    
    //
    //设置操作
    //
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_up_CMPB);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_down_CMPA);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_down_CMPB);
    
    
    HRPWM_setMEPEdgeSelect (base、HRPWM_CHANGE_A、HRPWM_MEP_CTRL_RISTing_and_FALLING_EDGE);
    HRPWM_setMEPControlMode (base、HRPWM_CHANGE_A、HRPWM_MEP_PHASE_CTRL);
    HRPWM_setCounterCompareShadowImage 事件(base、HRPWM_CHANNEL、HRPWM_LOAD_ON_CNTR_ZERO _PERIOD);
    
    HRPWM_setMEPEdgeSelect (base、HRPWM_CHANGE_B、HRPWM_MEP_CTRL_RISTing_and_FALLING_EDGE);
    HRPWM_setMEPControlMode (base、HRPWM_CHANGE_B、HRPWM_MEP_PHASE_CTRL);
    HRPWM_setCounterCompareShadowImage 事件(base、HRPWM_CHANNEL、HRPWM_LOAD_ON_CNTR_ZERO _PERIOD);
    
    HRPWM_enableAutoConversion (base);
    
    HRPWM_enablePhaseShiftLoad (base);
    
    //
    //中断,我们将在其中更改比较值
    //选择 INT on 时基计数器零事件,
    //启用 INT,在发生第1个事件时生成 INT
    //
    ePWM_setInterruptSource (base、ePWM_INT_TBCTR_ZERO);
    ePWM_enableInterrupt (base);
    ePWM_setInterruptEventCount (base、1U);
    }
    
    

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢 Nima。 您的答案中的这些要点是关键!!

    "二. 仅使用 CMPAU/CMPAD 进行 EPWM 输出更改。 CMPAU 上置1、CMPAD 上清零。

    如果您使用零/PRD 事件更改 EPWM 输出(设置/清除)、则会跳转。"

    现在、相移的效果非常完美!!!

    感谢您抽出宝贵的时间投入我们的工作。

    Iulian。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴工作了! 这是一个艰难的过程。