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.

[参考译文] AM263P4-Q1:我想启用 ePWM 时钟

Guru**** 2895430 points

Other Parts Discussed in Thread: AM263P4-Q1, SYSCONFIG, TIDM-02018

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1643785/am263p4-q1-i-wanted-to-enable-the-epwm-clock

器件型号: AM263P4-Q1
Thread 中讨论的其他器件: SysConfigTIDM-02018

您好、

我正在处理 AM263Px 微控制器、我想  启用 ePWM 时钟以及如何在启用 ePWM clcok 之前配置 CONTROLSS 寄存器 (LOCK0_KICK0、LOCK0_KICK1)。 请详细说明工作流程。 我感谢你的建议和帮助。

谢谢!

此致、

Rajkumar

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

    以下是解锁 CONTROLSS 寄存器和在 AM263P4-Q1 上启用 ePWM 时钟的详细分步工作流程。

    AM263Px 上的所有控制模块 MMR(存储器映射寄存器)都具有 脚踢保护机制 、可防止虚假写入更改寄存器值。 您必须在配置 ePWM 时钟之前解锁这些寄存器、然后重新锁定它们。

    步骤 1:解锁 CONTROLSS_CTRL 寄存器

    按顺序 将确切的解锁值写入 KICK 寄存器:

    寄存器
    存储器地址
    解锁值
    CONTROLSS_CTRL_LOCK0_KICK0
    0x502F1008
    0x01234567
    CONTROLSS_CTRL_LOCK0_KICK1
    0x502F100C
    0x0FEDCBA8

    顺序事项 —首先写入 KICK0、然后写入 KICK1。

    /*解锁 CONTROLSS_CTRL 寄存器*/
    *((volatile uint32_t *)0x502F1008)= 0x01234567// LOCK0_KICK0
    *((volatile uint32_t *)0x502F100C)= 0x0FADCBA8// LOCK0_KICK1
    重要提示: 写入除精确解锁密钥以外的任何值都将重新锁定寄存器。

    步骤 2:禁用 ePWM 时基时钟 (TBCLK) 同步

    在配置 ePWM 模块之前、请清除 EPWM_CLKSYNC CONTROLSS_CTRL 寄存器中相应 ePWM 实例的位:

    /*为目标 ePWM 实例设置 EPWM_CLKSYNC 位= 0 */
    SoC_setEpwmTbClk (epwmInstance、 false);

    第 3 步:配置 ePWM 模块

    禁用时钟同步时执行所有 ePWM 配置(时基周期,计数器模式,动作限定器,死区等)。

    步骤 4:启用 ePWM 时基时钟同步

    配置完成后、将该 EPWM_CLKSYNC 位设置为 1。 这会将所有已启用的 ePWM 模块时钟与 TBCLK 的第一个上升沿全局同步:

    /*为目标 ePWM 实例启用 TBCLK */
    SoC_setEpwmTbClk (epwmInstance、 true);
    /*或一次启用多个实例*/
    SoC_setMultipleEpwmTbClk (instanceBitMask、 true);

    步骤 5:(可选)取消 ePWM 时钟门控

    如果使用时钟门控进行电源管理、请致电:

    SoC_ungateEpwmClock (epwmInstance);
    步骤 6:CONTROLSS_CTRL 寄存器 Re 锁定

    完成所有配置后、 始终重新锁定 寄存器以防止意外修改:

    /*锁定 CONTROLSS_CTRL 寄存器*/
    *((volatile uint32_t *)0x502F100C)= 0x00000000//优先 LOCK0_KICK1
    *((volatile uint32_t *)0x502F1008)= 0x00000000// LOCK0_KICK0 秒

    使用 SysConfig(推荐)

    如果您将 MCU+ SDK 与 SysConfig 配合使用、则在 ti_drivers_open_close.c 通过 GUI 添加 EPWM 实例时会自动生成整个解锁→配置→锁定序列。 这样就无需手动写入寄存器。

    此致、

    Masoud

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

    感谢 Masoud 的答复和详细说明。

    我根据给定的步骤实施。

    步骤 1:解锁 CONTROLSS_CTRL 寄存器

    HWREG32 (CONTROLSS_CTRL_BASE + LOCK0_KICK0)= 0x01234567U;

    HWREG32 (CONTROLSS_CTRL_BASE + LOCK0_KICK1)= 0xFEDCBA89U;

    步骤 2:启用 ePWM 时钟(ePWM 时钟)

     HWREG32(CONTROLSS_CTRL_BASE + EPWM0_CLK_GATE)= 0x0U

    首先、我在启用 TBCLK 之前启用了 ePWM 时钟。 请确认此步骤是否正确  

    第 3 步:禁用 ePWM 时基时钟 (TBCLK) 同步

     HWREG32 (CONTROLSS_CTRL_BASE + EPWM0_CLK_SYNC)=(0U << 0);

     

    步骤 4:配置的 ePWM 模块

    HWREG16 (EPWM0_BASE + EPWM_TBCTL) = (2u << 0);//使用向上/向下计数  

     

    步骤 5:启用 ePWM 时基时钟同步

     

      HWREG32 (CONTROLSS_CTRL_BASE + EPWM0_CLK_SYNC)|=(1U << 0);

     

    步骤 6:锁定 CONTROLSS_CTRL 寄存器

    HWREG32 (CONTROLSS_CTRL_BASE + LOCK0_KICK1)= 0x0U;

    HWREG32 (CONTROLSS_CTRL_BASE + LOCK0_KICK0)= 0x0U;

     编译后、ePWM 时钟未启用、这意味着“1“值不存储在 CONTROLSS_CTRL_BASE + EPWM0_CLK_SYNC 寄存器中

     请检查并返回给我。

    谢谢!

     此致、

    Rajkumar

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

    您的整体序列是正确的、但存在可能妨碍 ePWM 时钟正常启用的问题。  在步骤 5 中、您使用按位或

    HWREG32(CONTROLSS_CTRL_BASE + EPWM0_CLK_SYNC) |= (1U << 0);

    如果之前未将该寄存器清零、或者读回返回意外的值、则该或操作可能无法可靠地设置该位。 改用直接赋值:

    HWREG32(CONTROLSS_CTRL_BASE + EPWM0_CLK_SYNC) = (1U << 0);

    总体而言、 建议的方法 是使用 SDK API。 MCU+ SDK 不直接写入寄存器、而是提供在内部处理解锁/锁定序列和校正寄存器值的专用功能:

    /* Enable ePWM clock (ungate) */
    SOC_ungateEpwmClock(0);  // For EPWM0 instance
    
    /* Disable TBCLK before configuration */
    SOC_setEpwmTbClk(0, FALSE);
    
    /* Configure ePWM module */
    HWREG16(EPWM0_BASE + EPWM_TBCTL) = (2U << 0);
    
    /* Enable TBCLK after configuration */
    SOC_setEpwmTbClk(0, TRUE);

    此致、

    Masoud

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

    感谢 Masoud 的即时回应。

    我根据您的输入进行了修改、但 ePWM 时钟仍未启用。

    我正在使用 SYSCFG 开发裸机代码。 需要禁用哪些库? 请告诉我。

    谢谢!

    此致、

    Rajkumar

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

    您好、

    如果您使用 SysConfig、SOC 时钟配置通常由生成的代码处理、因此请确保在 SysConfig 中启用/配置 EPWM 实例、并且在访问 ePWM 寄存器之前会调用生成的初始化代码。 就这些。

    如果您要检查寄存器电平、 应使用 SOC API 启用 ePWM 时基时钟:

    SoC_setEpwmTbClk (epwmInstance、true);

    此 API 可用于:

    soc soc

    这将让人想到 API 是如何启用它的。

    此致、

    Masoud

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

    尊敬的 Masoud:

    我已完成 Sysconfg 中的配置来启用 ePWM 实例。 我在 Time Base 中进行了配置并附加了我启用的屏幕截图。 如有任何遗漏、请告诉我。  

    此致、

    Rajkumar

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

    尊敬的 Rajkumar:

    您共享的 SysConfig 设置看起来可以添加/配置 ePWM 实例。 您能否确认实际调用了 SysConfig 生成的初始化代码? 对于基于 SysConfig 的裸机项目、仅当从应用程序调用生成的 init 函数时、才会应用生成的时钟/引脚多路复用/外设初始化。  例如:

    System_init();
    Board_init();
    
    Drivers_open();
    Board_driversOpen();

    在屏幕截图中、“Time Base Period“设置为 0。 即使启用了 EPWM 时钟、也不会在 TBPRD = 0 时获得有意义的 PWM 波形。 请设置一个非零周期值、并如果要观察引脚上的 ePWM 输出、还请配置 CMPA/CMPB 和动作限定器设置。

    如果寄存器仍然不保留该值、通常意味着 CONTROLSS 寄存器仍被锁定、不会调用生成的初始化、或代码的另一部分再次禁用 TBCLK。

    我建议从现有的 AM263Px SDK EPWM 示例开始、在 SysConfig 中启用 EPWM0、然后将生成的文件和应用程序初始化序列与裸机工程进行比较。

    此致、

    Masoud

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

    尊敬的 Masoud:

    现在、我正在启用 ePWM 时钟、但面临 ADCINTFLG 出现的问题(未生成中断)

    我正在通过 EPWM 为 ADC 触发器开发裸机代码。  下面给出了以下工作流程。

     1 启用 EPWM 时钟
     2.启用 ADC 时钟
     3.启用 ADC 基准
     4.配置 ADC 输入范围
     5.为 ADC 内核上电
     6.初始化 ADC 配置
     7.配置 ADC 中断
    *8. ADC 由 EPWM 触发
    我使用 ETSEL 和 ETPS 寄存器配置了 ePWM   
    HWREG16(EPWM0_BASE + EPWM_ETSEL) =  (1U << 11)| (1U << 8);
    HWREG16(EPWM0_BASE + EPWM_ETPS) = (1U << 8);  
    如果错过了任何 ePWM 寄存器、请告诉我
     *9. 发生 ADC 中断
       
     while ((HWREG16(ADC_BASE + ADCINTFLG)&(1U << 0))== 0U)  //遇到此行的问题。 我卡在一个 while 循环中、它不会从循环中出来。
      {
       /*等待转换结束*/
      }
      HWREG16(ADC_BASE + ADCINTFLGCLR)=(1U << 0);
     *10. ADC_ReadPhaseCurrents

      请检查并告诉我是否有任何错误。

      谢谢!

      此致、

      Rajkumar

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

    请参阅 www.ti.com/.../TIDM-02018“中的示例。该软件可在 MOTOR-CONTROL-SDK AM263X-AM263X“www.ti.com/.../09.00.00.06“中找到。您在此处提到的例程在该参考设计中实现。

    此致、

    Masoud