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.

[参考译文] TM4C129ENCPDT:如何减慢 PWM 周期

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1357420/tm4c129encpdt-how-to-slow-down-the-pwm-period

器件型号:TM4C129ENCPDT

您好!

我有 TI-RTOS 应用、4个 PWM、每个都使用单独的 PWM 发生器(输出 PWM0、PWM3、PWM5和 PWM6)。

-在开始时调用:  

void EK_TM4C129EXL_initPWM (void)
{
/*启用 PWM 外设*/
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);

/*
*启用 GPIO 引脚上的 PWM 输出。 PWM 输出连接到以太网、
*开发板上的 LED (D4)。 PWM 配置
*下面将禁用以太网功能。
*/

//
//为 PF3配置 GPIO 引脚多路复用器
//对于 M0PWM3
//
GPIOPinConfigure (GPIO_PF3_M0PWM3);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_3);
#ifndef PWM_test
//
//为 PG0配置 GPIO 引脚多路复用器
//对于 M0PWM0
//
GPIOPinConfigure (GPIO_PF0_M0PWM0);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0);
#endif
//
//为 PG1配置 GPIO 引脚多路复用器
//用于 M0PWM5
//
GPIOPinConfigure (GPIO_PG1_M0PWM5);
GPIOPinTypePWM (GPIO_PORTG_BASE、GPIO_PIN_1);

//为 PK4配置 GPIO 引脚多路复用器
//用于 M0PWM6
//
GPIOPinConfigure (GPIO_PK4_M0PWM6);
GPIOPinTypePWM (GPIO_PORTK_BASE、GPIO_PIN_4);

PWM_INIT();

-然后单独启动 PWM,例如:

PWM_Params_init (&Output1PWMparams);
Output1PWMparams.period = 100;//以微秒为单位的周期
Output1PWMparams.dutyMode = PWM_Duty_time;
Output1PWMhandle = PWM_open (Board_PWM5、&Output1PWMparams);
如果(Output1PWMhandle = NULL)
{
system_abort ("Error initializing PWM 5\n");

PWM_setDuty (Output1PWMHandle、10);

我可以使用周期的任意组合(50,100,300us)、但在尝试较慢的周期(2000和40000us)时、PWM_OPEN 失败、无法设置预分频器。

如何达到减慢某些 PWM 的周期、并能够同时在不同输出上实现快速周期和慢速周期?

请告知。 谢谢!

达利博尔

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

    我可以使用周期的任意组合(50,100,300us)、但在尝试较慢的周期(2000和40000us)时、PWM_OPEN 失败、无法设置预分频器。

    [/报价]

    请注意、PWM 计数器仅为16位。 在120MHz 时、最大周期仅约为540uS。  

    用户可以通过编程 PWMCC 寄存器来将 PWM 时基分频。

    不过、TI-RTOS PWM 驱动程序不具有对此寄存器进行编程的功能。 您可以使用 TivaWare API 通过调用 PWMClockSet ()对分频器进行编程  

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

    谢谢、Charles。 这必须是 一条前进的道路、但我遇到了将此 TI-RTOS 工程与 TivaWare 混合的问题。 尝试调用基于 ROM 的函数 ROM_PWMClockSet (Board_PWM5、clkdiv);但它发出炸弹。 我未能成功安装 TivaWare viaTM4C ARMRegisteredCortexRegistered-M4F MCU (2.1.4.178),但在选择示例时要求我重新安装。 如何成功添加基于 TivaWare 或 ROM 的经典函数?

    请告知。

    达利博尔

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

    这就是您需要做的事情。  

    1.添加以下头文件。  

    #包含
    #include "inc/hw_memmap.h"
    #include "driverlib/rom.h"
    #include "driverlib/pwm.h"

    2.添加 TARGET_IS_TM4C129_RA2符号。  

    3.调用如下内容。  

    ROM_PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_8); // SYSCLK 除以8。

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

    您好 Charles、

    我实际上实现了它、只有缺失的标头:

    #包含
    #include "inc/hw_memmap.h"

    此外、我已经定义了 TARGET_IS_TM4C129_RA0。 以下哪一项对于 TM4C129ENCPDT 是正确的?

    更改后、结果保持不变。 代码编译正常、运行到 ROM_PWMClockSet 处的断点、当我对其进行单步执行时中止。 下面是调用堆栈:

    有什么建议吗?

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

    大家好、Dalibor:

     在调用  PWMClockSet 之前、您需要确保启用 PWM 模块、这意味着 在调用  PWMClockSet 之前、您需要首先调用 Board_initPWM ()。 如果这不是问题的原因、则请参阅以下链接以诊断异常。  

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

    尊敬的 Charles:

    我已经放弃了混合 PWM 功能与基于 TI-RTOS 和 ROM 的功能、这会导致崩溃。 实际上、我已经使用了 TivaWare 中的所有 PWM 模块功能、并遵循了示例。 除了设置 PWM 时钟分频器外、一切都能正常工作。 无论我设置的值如何、结果都与直接 CPU 时钟相对应。 使用的示例将 CPU 时钟更改为25MHz 和 PWM、无需分频器。 由于其他模块的原因、我无法减慢 CPU 时钟的速度。 获得 SYSCTL_PWMDIV_64分频器是否有特殊需要?

    下面是我的 PWM 初始化:

    uint32_t 时钟;

    //
    //将 PWM 时钟设置为系统时钟。
    //

    SysCtlPWMClockSet (SYSCTL_PWMDIV_64);
    CLOCK = SysCtlPWMClockGet ();=>始终获得0


    //
    //必须启用 PWM 外设。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
    //

    GPIOPinConfigure (GPIO_PF0_M0PWM0);
    GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0);

    等等...

    请告知

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SysCtlPWMClockSet (SYSCTL_PWMDIV_64);
    clock = SysCtlPWMClockGet ();=>始终获得0

    您好!

     不应该为 TM4C129器件使用 SysCtlPWMClockSet()。 该 API 仅适用于 TM4C123。 您应该使用 PWMClockSet()来代替 TM4C129。  

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

    尊敬的 Charles:

    再次感谢您的快速响应。 我已将代码更改为:

    uint32_t 时钟;

    //
    //将 PWM 时钟设置为系统时钟。
    //

    PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_1);
    时钟= PWMClockGet (PWM0_BASE);

    遗憾的是、在执行 PWMClockSet 时、它会发生错误并中止。 必须存在某种配置问题。 使用  

    我的配置是否正确? 另外、请向我指出您用于进行屏幕截图的文档。

    谢谢!

    达利博尔

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

    大家好、Dalibor:

     我曾参考过 TivaWare 外设驱动程序库用户指南。 您也可以在安装 TivaWare SDK 时的/docs 目录下找到该文件。

    它能够正常编译吗?  

    您需要确保 调用 SysCtlPeripheralEnable()后仅调用 PWMClockSet() ,否则它将中止。 如果不首先通过调用 SysCtlPeripheralEnable()启用 PWM 模块,它将中止对模块寄存器的任何访问。 这很可能是你看到的。  

      

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

    谢谢、Charles。 是的、我想知道为什么在启用模块前示例设置时钟。 这可能是为什么要设置 CPU 时钟而不是 PWM 时钟来获取时序的原因。 现在一切都好了。

    此致、

    达利博尔