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.

[参考译文] RTOS/TM4C123GH6PM:PWM TI-RTOS 更高频率的输出、更高的占空比分辨率?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/570583/rtos-tm4c123gh6pm-pwm-ti-rtos-higher-frequency-output-with-more-duty-cycle-resolution

器件型号:TM4C123GH6PM

工具/软件:TI-RTOS

大家好、我使用 TI-RTOS 示例代码来生成 PWM 输出。

我正在尝试找出可以在 TI-RTOS 中更改 PWM 频率的位置、我最终得到了该函数

在 PWMTiva.C 文件中?

这是更改 PWM 频率的正确方法,以及参数 cmd 和*arg 是什么

我认为必须在某个地方进行更简单的 API 调用、以将频率设置为更高的值。

或者、我能否使用 TivaWare API 设置 PWM 计时器、而这不会破坏 TI-RTOS?

int PWMTiva_control (PWM_Handle handle、unsigned int cmd、void *arg)
{
unsigned int 密钥;
uint32_t 期间;
uint32_t PresRegVal;
uint8_t 预分频器;
PWMTiva_Object *object = handle->object;
PWMTiva_HWAttrs const *hwAttrs = handle->hwAttrs;

switch (cmd){
案例 PWMTiva_CMD_CHANGE_GEN_PERIOD:
assert_isTrue ((uint32_t *) arg!= NULL、NULL);

/*计算 PWM 定时器计数中的周期*/
期间=(*(uint32_t *) arg)*(object->pwmStatus)->cyclesPerMicroSec;

/*确保可以使用当前预分频器生成新周期*/
PWMTiva_calculatePrescalar (period、&presRegVal、&prescalar);
if (prescalar!=(object->pwmStatus)->prescalar){
返回(-1);
}
周期/=预分频器;

KEY = Hwi_disable();
PWMGenPeriodSet (hwAttrs->baseAddr、hwAttrs->pwmOutput & PWM_GEN_MASK、
期间);

/*使用新周期更新 PWM 状态*/
*(object->pwmStatus)->genPeriods +
((hwAttrs->pwmOutput /PWM_out_0)-1)=*(((uint32_t *) arg);

Hwi_restore (key);

返回(PWMTiva_CMD_CHANGE_GEN_PERIOD);
}

/*尚未实施*/
返回(PWM_STATUS_UNDEFINEDCMD);
} 




感谢您的帮助、我们不胜感激

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

    Chris、

    您可以在 tirtos_tivac_2_16_00_08/products/tidrivers_tivac_2_16_00_08/docs/doxygen/html/index.html 中引用 doxygen (#因您的版本而异)。 它显示了使用 PWM_CONTROL 的示例。

    您可以使用 TivaWare 调用。 唯一需要做的是、如果你正在使用一个中断、请确保使用 Hwi 模块、而不是直接管理矢量表。 此外、您还了解过 PWM_setDuty 吗?

    Todd

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

    我将 PWM_setDuty 用于占空比、我只是在所需频率下没有我想要的分辨率。

    但是、我认为我仅限于整数值、我希望分辨率为1000+、且 PWM_FREQUENCY > 20kHz。

    因此、现在使用 params.period 时、它需要一个与1微秒相关的整数值、我需要一个5微秒的 PWM_period、并且能够以1000+的分辨率更改 PWM 占空比。

    我认为我必须解决这个问题的方法是更改 PWM 外设时钟分频器、我只是不知道在 TI-RTOS 中我会怎么做、因为所有 PWMTimerTiva.C 和 PWMTiva.C 似乎都设置为 cyclesPerMicroSec。

    我需要更改 PWM 外设所获得的时钟、以便在理想情况下实现15kHz 至40kHz 的范围、然后以500-10000理想的占空比实现分辨率。


    编辑四颗星****
    我想我找到了解决方案、我将参数中的 DutyMode 更改为标量值。 现在、我相信我在20kHz++的频率下具有所需的分辨率

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

    很好。 我将在星期一与 PWM 模块的作者确认、以确保这是最佳方式。

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