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.

[参考译文] TMS320F28P650DK:时钟分频器和 PWM

Guru**** 2875980 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1624289/tms320f28p650dk-clock-dividers-and-pwms

器件型号: TMS320F28P650DK
主题: SysConfig 中讨论的其他器件

您好:

我希望尝试了解时钟是如何设置的、以及如何实现我从 PWM 看到的 1/2 速度。 我将使用 TMS320F28P650DK6PZ 芯片、并使用内部振荡器。 我启动了一个空白工程 (Project Explorer 中的 empty_driverlib_project)、我希望得到一些 EPWM。 在 device.h 文件中、我取消注释了#define USE_PLL_SRC_INTOSC、该器件会为 DEVICE_OSC_SRC_FREQ 切换值 10000000 (10MHz)。 以下行集:

#define DEVICE_SYSCLK_FREQ      ((DEVICE_OSCSRC_FREQ * 40)/(1 * 2 * 1))

这应该总计 200MHz。

在我的 SysConfig 中、我通过使用动作限定器在向上/向下计数模式下将 TBP 设置为 100 来配置 50%占空比 PWM、从而在 TB 计数器向上等于 50 的 compa 时将其设置为高电平、在 TB 计数器向下等于 compa 时将其设置为低电平。  

我的高速时钟分频器和 TB 时钟分频器都设置为 1、因此我知道这里没有会导致这种情况的分频。

在示波器上、我看到周期为 2us、即 500kHz 信号、50%占空比。 这对我来说似乎很正常、因为我希望 100 TBP 能给我一段时间的 1MHz。  

观看 C2000 Academy 视频来提供有关加/减计数器的内容、

TBPRD = Tpwm /(2 * Ttbclk)

如果 TBPRD = 100 且 Tpwm = 2e-6、则求解 Ttbclk 将得到 1e-8(即 10ns)。 这对应于 100MHz 时钟。  

我试图避免使用 ClockTree 工具、想看看是否可以更改此处的默认代码。

谢谢

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

    您好、Reid、

    我看了 driverlib 工程、您看到的问题是因为 EPWMCLK 默认设置为 100MHz。  数据表 ( https://www.ti.com/lit/ds/symlink/tms320f28p650dk.pdf) 第 131 页上的图 6-22 显示了如何配置时钟系统。

    PLLSYSCLK 设置为 200MHz、为了保持 200MHz 的 EPWMCLK 频率、 EPWMCLKDIV 应设置为 1、而不是默认设置为 2 :第 425 页、TRM、 https://www.ti.com/lit/ug/spruiz1b/spruiz1b.pdf。  

    您可以在 ClockTree 工具中快速更改它:

    1.选择 INTOSC 作为源并调整 CLK 系数:REFDIV = 1、IMULT = 40;ODIV = 2;SYSCLKDIVSEL=1;

    2.将 EPWMCLKDIV 更改为 1、它应该指示 200MHz EPWM 频率。

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

    Reid、

    您是否需要将 EPWM 时钟默认配置为 200MHz? 您只需在计算中使用 100MHz EPWMCLK 即可获得正确的周期。

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

    最后、如果您想不使用 ClockTree 来更改 EPWM 时钟分频器、则可以 将您需要的分频器传递到 sysctrl.h 中的函数、并从 main 调用它。

    //! 该函数用于配置 EPWMCLK 的时钟速率。 。
    //! \e 分频器参数是 SYSCLK 速率分频的值
    //! 获取 EPWMCLK 速率。 例如、\b SysCtl_EPWMCLK_DIV_2 将选择一
    //! EPWMCLK 速率、即 PLLSYSCLK 速率的一半。

    SysCtl_setEPWMClockDivider(SysCtl_EPWMCLKDivider 分频器)

    //
    //将分频器选择写入适当的寄存器。
    //
    EALLOW;
    HWREGH (CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL)=
    (HWREGH (CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL)&
    ~SysCtl_PERCLKDIVSEL_EPWMCLKDIV_M)|(uint16_t) 分频器;
    SYSCTL_REGWRITE_DELAY;
    EDIS;
    }

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

    我代表 Reid 回复、她目前无法回复 E2E 主题。  

    实际上、我将时钟设置为 empty_driverlib_project 中的默认设置。 我正在尝试让我的 EPWM 时钟通过 200MHz 的时钟分频器运行。 我似乎做不到。

    我要选择内部振荡器、它似乎具有 10MHz。 在 device.h 中、我们似乎选择 200MHz 的时钟乘法、因为我们乘以 20。 我的 ePWM 时钟分频器似乎分别设置为 1 和 1、如下面的 device.h 中所示

    向上/向下计数的 PWM 频率为 2us、并且已经考虑了分频器 2、这将使 Ttbclk = 100MHz。

    TBPRD = Tpwm /(2 * Ttbclk)–用于上 — 下。

    代入 100 的 TBPRD 和 2us 的 Tpwm(上升沿到上升沿)、我们将得到 1e-8 的 Ttbclk(即 10 纳秒)、对应于 100MHz 的时钟。

    我还尝试了向上计数模式、使用 100 作为 TBP、我看到周期约为 1us、这再次对应于 100MHz。

    我甚至尝试插入以下行:

    //将 EPWM 时钟分频器设置为 1、这将是 200MHz 开关频率
      SysCtl_setEPWMClockDivider (SYSCTL_EPWMCLK_DIV_1);

    此行只是导致某种崩溃、项目无法正常运行。

     

     

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

    您好:

    您得到的结果是因为 EPWMCLK 默认为 100MHz。 是否有任何理由需要实现 200MHz EPWMCLK? 您是  按照我之前的建议尝试在 ClockTree 中进行更改还是在 main.c 中调用 SysCtl_setEPWMClockDivider (SysCtl_EPWMCLK_DIV_1)?

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

    是的、Reid 尝试在 main 中调用 SysCtl_setEPWMClockDivider、导致应用程序在 CCAS 断开连接的情况下崩溃。  

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

    您好:

    我也会检查我的结束,并回到你。 同时、请尝试 ClockTree 工具、并提供相关建议。

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

    斯特万和鲁本

     当我尝试在 main () 器件后初始化中运行 sysctl_setEPWMClockDivider (SysCtl_EPWMCLK_DIV_1) 行时、会看到以下消息:

    C:\Users\(此处为项目位置):{3}0x3fa2{4}“处的“_system_post_cinit() 没有可用源  

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

    Stevan,

    如果可能,我想尝试看看是否有代码我可以编写,而不是使用 ClockTree 工具。 如果我们找不到任何选项,似乎 ClockTree 是真正编辑或设置它的唯一方法,那么我会这样做,但它似乎是一个时钟设置和初始化的问题,似乎很容易设置在几行。

    谢谢、

    Reid

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

    我已经尝试配置时钟树工具、但在构建时仍出现了许多错误。 我看到很多变量被重新定义在地方,导致错误。 它还告诉我、它要么无法放入可用的存储器中、要么该段包含一个调用点、该调用点需要一个 trampoline、而这个 trampoline 无法为有关我的 generic_ram_lnk_.cmd 文件的段生成。 对于这个特定的试用工程、我非常依赖 SysConfig 为我执行所有初始化和配置。

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

    Reid、

    您能否对收到的错误进行快照? 在不使用此函数的情况下进行构建时是否遇到此错误? 我在我的情况下调用了该函数、它不会引起问题。  

    对于 ClockTree 您可以按照我上面的说明进行操作。 当您更改时钟源时、会出现错误、但如果您按步骤 1 和 2 所示更改系数、这应该没有问题。

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

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

    这是我尝试使用时钟树工具并对其进行定制以选择 200MHz 的 ePWM 时钟时遇到的错误。 我知道这里进行的是过度声明、但我只使用 SysConfig 设置这些配置、因此我不知道处方是什么或者如何正确使用 GUI 工具来避免这种过度声明。

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

    Reid、

    感谢您的答复。 正如您所说的、问题似乎在于过度声明。 是在 SYSCFG GUI 中配置器件支持、还是在项目中添加了单独的器件支持文件夹?

    同时激活都会产生此错误。 如果要使用 ClockTree 工具、则应仅在 SYSCFG GUI 中配置器件支持。 您的 memory cmd 文件呢? 它们是在 syscfg 中定义的、还是您有单独的文件? 期待收到您的反馈。

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

    Stevan,

    这是可能的、排除以下文件夹是否有助于减少这种过度声明?

    就存储器 CMD 文件而言、我的工程中存在通用 28p65x_generic_ram_lnk_cpu1.cmd 文件。 基本上、当您首次为此芯片打开一个空白工程时出现的所有内容。

    谢谢、

    Reid

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

    您好、Reid、

    这似乎是一个问题。 请从工程中删除设备文件夹并在 SYSCFG 中保持设备支持。 请告诉我它是否适合您。