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.

[参考译文] AM335x-TMW-IEC61850-demo:AM3359 处理器上的 PWM 频率

Guru**** 2771175 points

Other Parts Discussed in Thread: AM3359

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1615521/am335x-tmw-iec61850-demo-frequency-of-pwm-on-an-am3359-processor

器件型号: AM3359

您好、

我在 Rev A Beagle Board Black 上执行一些代码、它有 AM3359 CPU。

CPU 频率为 1GHz。

我只是对 ePWM 进行编程、看起来系统时钟是用于 CPU 的时钟、因此是 1GHz。

我在对 EPWM 进行编程时可以给出的最大分频器似乎为 CLK_DIV = 128 且 HS_CLK_DIV = 14

该周期为 16 位数

^、这似乎表明我可以在 ePWM 上执行的最慢周期为 1e9/128/14/2 ~ 16 μ s = 8Hz

这是正确的、我可以让它变慢。 我注意到、当我将 Linux 内核方法与 PWM 一起使用时、以及对于一段时间、它可以做到。 我只是不明白这是如何从 TRM 实现的。

有人有什么想法吗?

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

    您好、David、

    感谢您的查询。

    您是否从 AM335x Linux SDK 获得了 ePWM 是 Linux 内核 PWM 方法的真正时钟源的信息?

    请允许我在一天时间 里查看和讨论 AM335x TRM 文档、然后我会跟进。

    谢谢

    此致、

    Anastas Yordanov

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

    我直接在 TRM spruh73q.pdf 中工作。 对于时间输入、例如表 15-10:“系统时钟 (SYSCLKOUT)“。 这是一个有点模糊,但我提出的唯一解释是 CPU 速度...  

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

    您好、David:

    您是否可以指定这是某个基于 ePWM IRQ 的内部 1 秒计时器、或者这是在 AM3359 SoC 引脚上生成周期为 1 秒的方波信号、EPWM 输出将多路复用到该信号上。  

    您是否可以提供此 AM335x PWM API 文档中已完成步骤的参考:

    3.2.2.13. PWM—Processor SDK Linux for AM335X 文档

    还是提供您的初始化代码?

    您是否有机会检查处理器 ePWM 输出上是否生成了 1 Hz 频率(而不是 8 Hz)。

    谢谢

    此致

    Anastas Yordanov

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

    尊敬的 Anastas:

    是的、使用 Linux /sys/class/pwm 设置 — 我可以通过设置 1e9ns 来获得 1s 时序 — 这已经在输出引脚上确认。

    对于我的应用、我需要在 pwm0 和 pwm1 之间设置相位、无法通过 Linux sys 接口来完成这一操作。 因此、已编写代码来直接访问存储器映射寄存器。 我将在下面给出一个代码提取 — 它需要一个头文件进行编译,但这说明您应该能够很好地阅读它:

    EPWM0->TBPRD=Period-1; // Period
    EPWM0->TRBPHS=0; // clear phase register
    EPWM0->TBCNT=0; // clear TN counter
    EPWM0->TBCTL=TB_UP<<0| // CTRMODE
    TB_DISABLE<<2| // PHSEN
    TB_SHADOW<<3| // PRDLD
    TB_CTR_ZERO<<4| //SYNCOSEL
    HSP_DIV14<<7 // HSPCLKDIV
    CLK_DIV128<<10; // CLKDIV
    EPWM0->CMPA=Period>>1; // compare A to zero
    EPWM0->CMPB=Period>>1; // compare B to 50%
    EPWM0->CMPCTL=CC_SHADOW<<4| // SHDWAMODE
    CC_SHADOW<<6| // SHDWBMODE
    CC_CTR_ZERO<<0| // LOADAMODE
    CC_CTR_ZERO<<2; // LOADBMODE
    EPWM0->AQCTLA=AQ_NO_ACTION<<10| // do noting on A when CMPB
    AQ_NO_ACTION<<8| // same increment
    AQ_CLEAR<<6| // clear A when CMA dec
    AQ_CLEAR<<4| // clear A when CMA inc
    AQ_NO_ACTION<<2| // nothing on Period
    AQ_SET<<0; // on Zero set the output
    EPWM0->AQCTLB=AQ_SET<<10| // Set out on B when CMPB
    AQ_SET<<8| // same increment
    AQ_NO_ACTION<<6| // nothing on B when CMA dec
    AQ_NOACTION<<4| // nothing on B when CMA inc
    AQ_NO_ACTION<<2| // nothing on Period
    AQ_CLEAR<<0; // on Zero clear the output

    因此、您可以看到 HSP_DIV14 — 除以 14、CLK_DIV128 除以 128。 必须完成代码,然后传输到应用程序机器,以检查输出的速度 — 所以我会首先尝试了解 TRM、以确保正确编码。

    感谢您的帮助、

    此致、

    David。

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

    您好、David:

    感谢您的更新。

    我需要一些时间来分析和 讨论。 我会在今天稍后跟进。

    谢谢

    此致

    Anastas Yordanov

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

    Ah 这可能与 spruh73q.pdf AM335x TRM 表 15-42 有关、如脚注 1 中所述:

    系统时钟、SYSCLKOUT 且 TBCLK = 100MHz、10ns

    我猜是因为它在 L4 域中、L4 频率的 100MHz 是什么? (表 8-23 PWM 位于 L4 外设中、并在 L4_PER_CLK 上运行)

    ~更合理、这意味着最小频率为 1e8/14/128/65536 μ F=.85Hz — 因此略高于 1s。

    因此问题变成了脚注 1 是否具有权威性?

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

    您好、David:

    您似乎找到了有关时基时钟周期值的非常好的提示。

    根据 AM3359 数据表、支持的 CPU 时钟频率 (MPU_CLK) 似乎是 800MHz。

    AM335x TRM 中还有其他提示:

    AM335X TRM 的“脉宽调制子系统 (PWMSS)/小节、集成/小节、PWMSS 时钟和复位管理“开始 、我认为 AM335x TRM 中可能存在一些错误、而 SYSCLKOUT 不是指频率为 800MHz(系统频率)的 Cortex-A8 时钟 MPU_CLK。  

    SYSCLKOUT 应是一个共用时钟 接口/功能 三个 eHRPWM 模块的时钟。 每个模块对时间功能和寄存器接口器件使用相同的时钟。 SYSCLKOUT 就像此 L4_PER 域时钟的“别名“- CORE_CLKOUTM4/2、其默认频率为 200MHz。 分频到 2 后、100MHz 被输入到 eHRPWMSS 可编程时钟分频器、以获得时基计数器的时钟 TBCLK。

    因此、基于 TBCLK_PERIOD = 10ns (100MHz) 的计算似乎是正确的。

    我希望这有助于澄清!

    此致

    Anastas Yordanov

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

    啊 — 这使它再次变得棘手。 认为 beagle Bone Black 超频到 1GHz(例如 www.beagleboard.org/.../beaglebone-black 或 archlinuxarm.org/.../beaglebone-black)   -我将在几分钟内启动我的黑色进行确认 — 但我很确定情况确实如此。 然后、如果它除以 8、这将为 125MHz 的 EPWM 提供一个基本输入时钟。

    希望我今天能在 BBB 上运行代码、如果输入时钟为 100MHz、我将乘法器和周期设置为约 1。 通过计时、我应该能够确认。  

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

    您好、David:

    感谢您的分享。 这是一个非常好的问题。

    我认为、“内核 PLL 说明/图“部分的简化时钟树没有显示 L4_PER 接口/功能时钟 CORE_CLKOUTM4(在 eHRPWMSS 一章中命名为 SYSCLKOUT)与 Cortex-A8 MPU_CLK 之间的任何直接依赖关系。 两个时钟都取决于不同的分频器。 在图中、这些时钟似乎由共源参考时钟 CLKINPHIFLDO 提供。 请注意、CLKINPHIFLDO 源频率为 2000MHz、是超频 Cortex-A8 MPU_CLK 频率= 1GHz 的两倍。 我认为、对于 3 个 eHRPWMSS 的 SYSCLKOUT、可以例如推导为 CLKINPHIFLDO_freq / M4 / 2 = 2000 / 10 /2 = 100MHz、而不是 CORE_CLKOUTM6 / 8 = 800MHz / 8 = OPP100 处的 100MHz。 此外、CORE_CLKOUTM6 = MPU_CLK 频率= CLKINPHIFLDO/2.5 = OPP_TURBO VDD_MPU 电压的 800MHz、  CORE_CLKOUTM6 = MPU_CLK 频率= CLKINPHIFLDO_freq/M6 = 2000/2 = OPP_Nitro 的 1000MHz(超频模式)

    为了支持 Cortex-A8 内核的超频至 1GHz、系统必须选择的组合 OPP_Nitro MPU 域的(1GHz 所需的 VDD_MPU 电源电压)和内核域的 OPP_100(当 MPU 在 Nitro 超频模式下运行时、L4_Per 100MHz 时钟所需的 VDD_CORE 电源电压)。 AM335x 数据表/部分的“运行性能点 (OPP)

    我希望这一点澄清。

    谢谢

    此致

    Anastas Yordanov

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

    谢谢 Anastas,

    是的、这说明了我对 AM3359 时钟结构的理解。

    此致、

    David。