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.

[参考译文] EK-TM4C1294XL:动态更改 PWM 频率

Guru**** 2477145 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/687489/ek-tm4c1294xl-change-pwm-frequency-on-the-fly

器件型号:EK-TM4C1294XL

你好

我使用 TM4C1294xl 来控制三个步进电机。 通常、需要 PWM 信号来进行移动步进。 对于加速器/去加速器、有必要增加/减少频率。

 我已记下以下代码进行测试。

int main (void){

//激活端口
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOOK);


//切换到 PWM 模式
GPIOM6 PinConfigure (GPIO_PFT1_PWM4



);GPIOPM1_PWMPM1_PM1_PM1_PWMPM1_PM1_PM1_GP0PM1_BASE (GPIOM4);GPIOPM1_PWM0PM1_PWM0PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_PM1_GPIOM4;GPI
GPIOPinTypePWM (GPIO_PORTG_base、GPIO_PIN_1);
GPIOPinTypePWM (GPIO_PORTK_base、GPIO_PIN_4);


//在发生器上切换
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_0、PWM0);/PWM0 (SYNC_MODE)
PWM_GEN_2、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);//PortG (generato2)
PWMGenConfigure (PWM0_BASE、PWM_GEN_3、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);//PortK (generator3)


//设置频谱脉宽/频率
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、100);//PortF (PWM0_BASE
、PWM0_Width1、PWM0_BASE) 50);
PWMGenEnable (PWM0_BASE、PWM_GEN_0);

PWMGenPeriodSet (PWM0_BASE、PWM_GEN_2、 400);//PortG
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_5、300);
PWMGenEnable (PWM0_BASE、 PWM_GEN_2);

PWMGenPeriodSet (PWM0_BASE、PWM_GEN_3、400);//PortK
PWMPulseWidthSet (PWM0_BASE、 PWM_OUT_6、100);
PWMGenEnable (PWM0_BASE、PWM_GEN_3);

PWMOutputState (PWM0_BASE、 PWM_OUT_1_BIT | PWM_OUT_5_BIT | PWM_OUT_6_BIT,TRUE);
}

我现在的问题是:是否可以即时更改每个信号的频率和占空比? 我已经尝试使用插入了单个命令的 for 循环、如下所示

for (i=1;i<400;i++){

PWMGenPeriodSet (PWM0_BASE、PWM_GEN_3、I);
} 

但没有成功。 唯一可以测量的是 PWM 输出变得危险。 它可在两者之间提供 PWM 信号、并可实现开关。

是否有人知道更好/有建议?

感谢您的响应!

大家好

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

    人们相信、您-一般而言-是"在正确的轨道上"-但您的执行需要进一步(或许更深入)的思考。

    正如您的代码所揭示的、以值"1"开始您的"PWM 周期"是不明智的。   在 MCU 的 PWM 发生器上施加400:1频率摆幅是公平的吗?   非常清楚-这是过度-你不同意吗?

    更糟糕的是,您的那种简短的编码(礼貌地说“for loop”) 显示没有/零延迟...  因此、"机器射电 PWM 发生器"-不断更新!   (如果此类(无/零)"延迟"-证明"不是案例"-则您在此处的代码演示严重失败。)

    您估计需要 PWM 频率更新的频率是多少?   在您的帖子中、这是无声的。   并且-这个"频率更新"要求-只是一端-(可能)双头硬币!  (说什么?)

    您不应该查看源代码-包含在 PWMGenPeriod set()中-以便您(部分)了解该函数的'Execution Time?'    当您(抱歉)"轰炸该功能"进行更新时-执行(单次)频率更新的速度会快些什么?   您能在很大程度上找出您的问题吗?

    还有另一个-更细微的影响-它涉及您的、"在最佳时间更新 PWM 发生器的频率-但仅更新频率"。   进一步阅读/回顾 MCU 手册-应揭示-可实现的"位置和方法..."   (子领域在于创建"runt"或过宽脉冲-当在"低于理想值"的时间点调用更新时。)   我认为-这证明了(通常)"有限后果"和影响、"仅一个或两个 PWM 脉冲"。   (证明与您的案例相差太远(非常远)!   

    相反-"证据中的事实"显示、"类似频率更新的弹枪"-没有充分理由-是您的问题的原因!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Marvin、
    我认为您不想在计数器计数时更改占空比或周期。 我建议您使用中断来更改与 PWM 边沿同步的占空比或周期。 您现在所做的操作会立即影响重新加载 PWM 计数器、从而产生错误的 PWM 脉冲。 您还需要调用 PWMSyncUpdate()来将更新排队到下一次对应的计数器变为零时应用的周期或占空比。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    假设您已从 CA "徒步"中恢复。   说到"覆盖"-我们的帖子已交叉-我们相信、在"组合"中、我们对海报的问题有很好的指导(甚至解决了)。

    确实、您是正确的-但问题(超出范围)"仅更新-计数器正在计数时?"

    我相信海报的"机器枪更新率"证明(赦免)比"重要列表"要高一点。

    如您所述-如果需要"无运行和无膨胀"PWM 脉冲-(然后)可以"精确地"改变频率"、"时间点"。   (尽管 Kiss 决定海报的主要问题-应首先解决!)    (据指出,"亲吻"在这里收到"死亡亲吻"--比离世早得多(而且被严重遗漏. 尽管(现在)的嘴唇很棒!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    感谢您对海报的建议。 我确实注意到 while 循环中周期的持续更新。 由于计数器永远不会计数到其比较匹配值、因此 PWM 输出很可能是平坦的线。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    实际上、查尔斯-因此、"甚至允许精确的更新时刻"-这张海报不太可能"实现他的目标!"   降低更新速率-如有指示-会显示一种声音解决方案。

    我从来没有见过任何“while 循环”——他在“for 循环”中添加了“for 循环”(在他的帖子的尾端),提供了“PWM 轰炸”!

    这将上升到(可能的)客户机-用户和/或说明符(Moi)的"值点" -此处。   在 函数能够"完成其执行"之前、您的 API 是否部署任何有效的"分类"(当函数被反复调用且此类"调用"到达时)?    您认为-最有可能-会发生什么情况?

    我以前真的不会想到这一点-也许是"在这里/现在"-证明是(恰当的)"时间/地点"-利用你 的"内幕知识!"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、我指的是 for 循环、而不是代码段中的 while 循环。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你们,很好,文档发誓我的“迷幻”是(几乎)... (也许)结束了。

    当(重复)函数调用速率比函数的执行速度快时、您是否错过了解释请求?   这是(一些)重要的-是不是吗?   并可能证明整个(至少显性)问题-包含在该主题中!

    昨晚睡了3个小时-为客户现场检查做好准备。   (您如何制作"后台"-后面(另一个)"后台"(合理)可呈现?   答案:优步智能——还有很棒的(大部分都是 gurl)员工…… (幸运的是,该客户永远不会看到这里... 或者这些都是-最新的、"著名的最后一个词!")    (其他人可以访问 CB1 -您知道...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    您提出函数调用速率快于函数的执行时间是一个有效的问题。 包括对 PWMGenPeriodSet()的调用的 for 循环大约需要17条指令来完成。 17条指令可能需要20个以上的周期、因为其中一些指令是针对 PWM 外设的 LDR 和 STR 指令。 除非比较值在周期计数的20个计数内、否则您很可能会在输出上看到平坦的线。 例如、如果 for 循环中 I=200的周期、那么只有当比较值为180-199时、您才可能看到 PWM、这样您就有机会看到一些输出。 在任何情况下、周期/占空比只应在下一个边沿完成时更改。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是一个最近的线程、与您一样、OP 希望"即时"更改 PWM:  

    如您所见、这里有许多好的建议、希望也能为您提供帮助。

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

    [引用 user="Danny F"] 那里有许多好的建议,希望也能帮助您。

    然而-如果 没有这个过去的主题-具体地说、" PWM 周期的机器启动更新"(据信这是这个(现在)海报的主题的新内容)-他们(真的)能提供什么帮助?