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.

[参考译文] CCS/TM4C123AE6PM:用于 PWM 信号的 GPIO

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/598276/ccs-tm4c123ae6pm-gpio-used-for-pwm-signal

器件型号:TM4C123AE6PM
主题中讨论的其他器件:TM4C123

工具/软件:Code Composer Studio

大家好、  

在开始使用这个用于 PWM 信号生成的新方法来修改代码之前、我有一个一般性问题。 我对 PWM 信号有两个引脚要求、这两个引脚应根据频率和占空比进行修改、频率 范围为1-200Hz。 由于我在使用宽定时器生成该信号时遇到问题、并且在连接的引脚上没有 PWM 模块、因此我计划使用引脚作为 GPIO 生成 PWM 信号、并使用一些定时器在 GPIO 应打开和关闭时进行计数。 是否可以 通过这种方式实现它?  

谢谢!

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

    [引用 user="Djedjica"]因为我在使用宽计时器生成该信号时遇到问题[/quot]

    有什么问题?    "试样"从未证明与结果的"真实演示/描述"一样有用!

    打破计时器-它显然是为了支持、"您所寻求的"-并采用(相反)"巨大努力-规避车轮"的做法毫无意义!   (海事组织)

    如果您完全/正确地报告您的"问题"(超出"不起作用!") 当然、论坛帮助者(甚至那些"官员")团队应该来评论和协助...

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

    是的、 很抱歉、我已经急于完成这项工作、因此我在留言中几乎没有有用的信息。 我已经在论坛上搜索了我的宽计时器问题、找不到 可以根据我的要求构建的解决方案。 因此 、PWM 信号的频率会随着干扰( 1Hz - 200Hz)而增加、当 频率不断增加、然后我得到满负载时、信号会在一段时间内保持在1。 由于 PWM 连接到电机、即使没有监控示波器信号、 用户也可以听到 电机何时以全速旋转、即使 PWM 为5%也是如此。  

    下面是用于计时器设置的代码片段:  

    SysCtlPeripheralEnable (SYSCTL_Periph_WTIMER 5);
    GPIOPinConfigure (GPIO_PD6_WT5CCP0);
    GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_6);
    周期= SysCtlClockGet ()/200;/200Hz 默认
    dutyCyclePWM2 =(无符号长整型)(周期-1)*(1-(5.0/100.0));//5%默认
    TimerConfigure (WTIMER 5_BASE、(TIMER_CFG_SPLIT_PAY|TIMER_CFG_A_PWM));
    TimerUpdateMode (WTIMER 5_BASE、TIMER_A、TIMER_A、 Timer_up_load_timeout | timer_up_match_timeout);
    TimerLoadSet (WTIMER 5_base、timer_A、period-1);
    TimerMatchSet (WTIMER 5_base、 Timer_A、dutyCyclPWM2);
    TimerEnable (WTIMER 5_base、timer_A); 

    当需要改变信号的频率或占空比时 ,我使用 TI 函数来改变定时器(TimerLoadSet()和 TimerMatchSet())的负载和匹配。

    很抱歉、我无法发布我的电子产品 、我等待下周的电子产品投入生产。 但我发现这篇文章准确地描述了我的问题

    https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/530418?tisearch=e2e-sitesearch&keymatch=synchronous%20update%20of%20timer%20match%20and%20load%20values%20pwm#pi239031350=2

    提供 的唯一解决方案是移至 PWM 模块。 这不适合我、因为我的输出位于具有宽计时器且无 PWM 模块功能的引脚上。 我把我的所有希望都设置在这个宽计时器上。  

    这就是为什么我现在正在寻找 一种生成 PWM 信号的替代方法,因为我现在不能选择 PWM 模块(),而且我必须放弃 宽定时器,因为这种干扰 在 我们的产品上是不可接受的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Djedjica、
    计时器模块上没有使用简单 PWM 信号的"缺陷"。 如果/当您正确配置它时、它将起作用。 因此、您无需考虑"不同的方法"、例如通过位拆裂控制 GPIO、正如您最初建议的那样。
    您的参数有问题。 正确调试它们、直到您发现数学错误。
    有一件事、我发现您使用以下行的方式令人怀疑:
    (无符号长整型)(周期-1)*(1-(5.0/100.0))
    案例只是转换为(周期-1)的时间、而不是整个结果-这可能是您的问题吗? 带有一些条件的断点、并检查您传递到计时器配置的值。
    请告诉我们! 祝你好运。
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的建议、Saraiva 先生。 当占空比从1-100%变化或信号仍然存在时、该信号没有问题。 只有在更改频率时、在我看来、定时器运行时这个改变的负载值是问题所在。 它与链接中的 POST 中所描述的完全相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看到...

    那么、让我在这里"思考一下":

    -占空比是一个固定值、在此值中输出被反转...
    假设您的计时器计数到8、000、000 (以 TM4C123 @80MHz 上的10Hz 信号为基础)
    -并且您将占空比设置为75%、这意味着 PWMmatch 值将为6、000、000。

    首先、假设您要将频率从10Hz 降低到6Hz、则会将负载从8、000、000增加到13、333、333... 匹配值相同、您可以在一个短暂的时间内占空比将会更小(45%)、但可能没有毛刺脉冲... 您能确认吗?

    现在、另一种方法是:将所需频率从10Hz 增加到20Hz、负载将从8、000、000更改为4、000、000。 当匹配值保持不变时、在6M 时、匹配值高于实际负载... 这可能是您的问题吗? 如果是、那么我想、除了所有的需要、就是验证这种"爆炸"情况是否容易发生、并在应用新频率之前纠正占空比值...

    不管怎样,只是尝试在这里进行有组织的思考,而我则从其他"我自己的精细时间问题"中休息!

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

    在上述帖子中"喜欢"您的努力和逻辑-好的。 然而、在您(可能)之前的帖子"快速阅读"中、"不是太多"、海报中报告他是一个"认可的 MCU 计时器问题"、不太可能是"海报造成的"。

    必须审查所有相关事实,并在相关/有用的情况下,将其作为证据。    (Rush 经常防止这种情况-这可能是一种趋势-(现在)可以纠正哪种趋势?)

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

    [引用 user="Djedjica">当占空比从1-100%变化或信号仍然存在时、此信号没有问题。 仅在更改频率时[/报价]

    可能只有在增加频率时?

    但这又提出了另一个问题。 如果这是控制电机、为什么要更改频率? 为什么这么低的频率如此重要?

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、只有在增加频率时、很抱歉我曾提到过、现在我看到我只是在更改时才编写。 另外、问题是、如果匹配在从一个频率转换到另一个频率时保持高于周期值、则问题是需要进行计算。 可能我为计时器更新模式设置了错误的位?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、那么这可能是您的问题(不过您仍然没有解决其他问题)。

    考虑当您缩短周期以增加频率时会发生什么情况。  

    假设您的周期最初为1000、然后将其减少到500。

    • 现在、如果您更改周期、会发生什么情况
      1. 您的计时器计数器处于300?
      2. 您的计时器计数器处于600?

    Robert

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

    如果这确实是一个"已知问题"-并且仅在更改频率时发生(如您所注意的)-是否可以使用第二个计时器-只有在您寻求"更改频率"时才会"发挥作用"?

    您应该能够在(现在)两个定时器输出之间施加一个逻辑门-这样输出(在您的电机上感觉到)来自这两个定时器中的任何一个。   (但一次只能从一个。)  

    您会看到:

    • "加载第2个定时器、具有"新频率" (在加载新所需频率之前、将禁用/禁用第2个定时器)
    • 然后"禁用"运行计时器(您报告为"准备干扰")
    • 然后"启用"第二个定时器-它包含新的.... 但重要的是、没有任何"改变"频率(因此应无毛刺脉冲)
    • 以类似的"循环"方式-您可以在启用的计时器之间切换-更改 "当前空闲计时器上的加载值"-但不能(运行时!)

    这确实涉及到"猴子运动"-使用第二个计时器-但有5分钟的"思考投资"-似乎(几乎)受到启发、如果您报告的内容正确-这种方法应该成功!

    我是否可以注意到、为了"防止"此类"不幸发现"(设计过程中的这么晚)、您是否应该(通过评估板)没有"测试/验证"您的所有关键假设、然后才承诺进行 MCU 选择和 PCB 设计?     (这是我们向客户提供建议的方法、在强制执行"客户眼图"之后、那些遵循该指导的客户会增加他们的几率!   (与此相反、眼辊应该是他们的命运-当我们"被召唤"救援行动时、我"高兴地回忆到了这一点...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是我的想法、可能是我没有设置正确的更新模式。 正如您在代码 sincipet I 中看到的、设置更新模式时、我设置 timer_up_load_timeout 和 timer_up_match_timeout 位。 如果我理解正确、它会使计时器更新周期的新值、并在计时器计数降至零时匹配、而不是介于两者之间的某个位置。 或者我错过了什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Robert -您的演示很有洞察力-它的逻辑是无可否认的-但是"一切可能不对"在计时器中。 而且-正如海报报告-我(几乎)可以回顾-供应商的 Amit 证实了这种弱点。

    如果您愿意-您可以引导2-3个帖子-并查找/评论我使用第二个计时器的方向。   (因此、任一定时器都可被选通至电机。。。)

    我有另一个"割道"-可能会强制计时器达到其最低(产生的占空比)、然后"快速、几乎立即"将其设置为所需的值-伪装和/或避免此问题? (请注意、"接近于零"的占空比会非常短暂-"电机无法察觉"-您是否同意?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我将在电子产品送达后立即尝试测试、正如我所说的、新版本将在下周发布到我的办公桌前。 但是、设置计时器更新模式位以更新周期的新值并匹配计时器超时、会怎么样呢? 我认为这解决了这些情况。
    TimerUpdateMode (WTIMER 5_base、timer_A、timer_up_load_timeout | timer_up_match_timeout);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Djedjica"]是的,我将在电子产品送达后立即尝试对其进行测试,

    无需测试。 这是一个逻辑问题。 用钢笔和纸张坐在桌子上、解决问题。

    [引用 user="Djedjica"]设置计时器更新模式位以更新周期的新值并匹配计时器超时的情况如何?[/quot]

    这是什么? 它不会处理当前计时器计数。

    Robert

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

    另一个思考问题-(实际上是两个):

    • 为什么等待-这就是 Krazy -找到 Eval 或 LPAD -他们(可能)能够以相同的方式处理此问题
    • 如果您"播放"第一个计时器设置-然后使用这两个计时器设置-但... (笑声) (笑声) 更改(更改它们)、然后按导致问题的最小数量进行更改。    这应该"找出"您的问题-在这里报告时-更多的大脑细胞可能会代表您燃烧...

    问题是能够在命令后可靠地中断计时器!   一旦知道/完成-(部分)修复的可能性会成倍增加!

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

    [引用 USER="CB1_MOBILE "]我有另一个"swing"-可能会强制计时器达到其最低(产生的占空比)、然后"快速、几乎立即"将其设置为所需的值-伪装和/或避免此问题? (请注意、"接近于零"的占空比将非常短暂-"电机无法察觉"-您是否同意?[/引述]

    嗯、我认为更改频率可能没有意义。 嗯、这不完全是真的、但没有为它提供任何案例。

    强制计时器达到最低占空比可能会使问题变得更糟。 强制执行计时器值。 通常、解决方案是对计时保持谨慎、可能需要进行两步频率更新。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、抱歉、如果我理解了错误、但在软件中、我没有解决计时器计数的当前值。 只有在检测到需要更改频率时、我才会转到过程来计算新值(周期和匹配)并在计时器寄存器中设置这些值。 但所有这些都发生在主程序循环中。 你问我的是这样吗?
    我从另一个部门获得的系统的需求、在某种程度上他们需要这个具有可修改频率的低频率 PWM。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Djedjica"]只有在检测到需要更改频率时,我才转到过程来计算新值(周期和匹配)并在计时器寄存器中设置这些值。 但所有这些都发生在主程序循环中。 您问我的是这样吗?[/引述]

    不、我要求您考虑我之前提出的这些问题

    [引用 user="Robert ">假设您的周期最初为1000、而您将其减少到500。

    • 现在、如果您更改周期、会发生什么情况
      1. 您的计时器计数器处于300?
      2. 您的计时器计数器处于600?[/报价]

    Robert