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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/583028/ek-tm4c1294xl-synchronize-pwm

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:TM4C123

我尝试同步两个 PWM 信号、以便上升沿匹配。  由于某种原因、Gen2、Out5似乎晚了约150ns。 我尝试阅读有关 PWM 模块的处理器手册、但同步信息对我来说没有意义、对于设置正确的同步位的时间和时间是什么。 我尝试了许多不同的设置组合。  我出了什么问题?

GPIOPinConfigure (GPIO_PK4_M0PWM6);
GPIOPinConfigure (GPIO_PG1_M0PWM5);
GPIOPinTypePWM (GPIO_PORTK_base、GPIO_PIN_4);
GPIOPinTypePWM (GPIO_PORTG_base、GPIO_PIN_1);

SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
PWMGenConfigure (PWM0_BASE、PWM_GEN_3、 PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenConfigure (PWM0_BASE、PWM_GEN_2、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);

PWMGenPeriodSet (PWM0_BASE、 PWM_GEN_3、(Board_clock/TIM5_FREQ)- 1);
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_6、TIMC5_10US);
PWMGenPeriodSet (PWM0_BASE、 PWM_GEN_2、(Board_clock/TIM5_FREQ)- 1);
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_5、TIMC5_10US);

PWMGenEnable (PWM0_BASE、 PWM_GEN_3);
PWMGenEnable (PWM0_BASE、PWM_GEN_2);

PWMOutputState (PWM0_BASE、PWM_OUT_6_BIT | PWM_OUT_5_BIT、 真);

PWMSyncTimeBase (PWM0_BASE、PWM_OUT_5_BIT | PWM_OUT_6_BIT);
PWMSyncUpdate (PWM0_BASE、PWM_OUT_5_BIT | PWM_OUT_6_BIT); 

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

    您的参数"PWM_GEN_MODE_NO_SYNC"(适用于(两者) PWM_GEN 3和2 (含 PWMGenConfigure())-有效地挫败/禁用您对 PWMSync()的(稍后)调用? 我在很长时间内没有使用过这个供应商的 PWM 模块-但我相信这是您的问题...

    找到过去的代码- PWMGenConfigure()中的参数,它对我们有用:"PWM_GEN_MODE_SYNC"。   您(大部分)正确的硬代码部分-好奇您"错过"了"同步关闭..."

    如果不(快速)解决此问题、我将搜索/查找我们的旧代码、该代码清晰(DID)地同步3个 PWM 发生器...  (还有-几年前、我在这个论坛上发布了准确的代码...)

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

    我之前曾尝试过 PWM_GEN_MODE_SYNC、但这似乎完全中断了 PWM 信号。

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

    使用"PWM_GEN_MODE_SYNC"时、"完全中断"没有充分描述您的问题。

    我们公司在现场有许多 K 单元-它们正确地"同步"多个 PWM 发生器-并采用该参数。

    您是否只是通过添加建议的参数更改、然后重新运行代码以及(正确)监控输出来"幽默"?  (您的简写完全不清楚)

    在调用"PWMSyncUpdate()之前,您可能会因延迟而受益。

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

    PWMGenConfigure (PWM0_BASE、PWM_GEN_3、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_SYNC);
    PWMGenConfigure (PWM0_BASE、PWM_GEN_2、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_SYNC);

    这只会将引脚设置为高电平、并将其保留在那里。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们刚刚越过-延迟对"Sync Update"和"Monitor"的调用-然后报告...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尤里卡!

    删除:
    GPIOPinConfigure (GPIO_PK4_M0PWM6);
    GPIOPinConfigure (GPIO_PG1_M0PWM5);

    您需要(仅) GPIOPinType()…… 再说一次-多年来、我没有访问过此代码-我们的"正在运行/同步"PWM 可避免 PinConfig 调用。

    此外-您可能希望在整个 PWM 代码块之前出现"SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);"。

    PWMGenEnable()之后的"PWMSyncTimebase()"-只能调用"PWMOutputState()。"

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

    奇怪的是、即使发生这些变化、引脚保持高电平仍然存在同样的问题。

    我肯定需要 GPIOPinConfigure、否则我根本不会获得任何输出。

    SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
    GPIOPinConfigure (GPIO_PK4_M0PWM6);
    GPIOPinConfigure (GPIO_PG1_M0PWM5);
    GPIOPinTypePWM (GPIO_PORTK_base、GPIO_PIN_4);
    GPIOPinTypePWM (GPIO_PORTG_base、GPIO_PIN_1);

    PWMGenConfigure (PWM0_BASE、PWM_GEN_3、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_SYNC);
    PWMGenConfigure (PWM0_BASE、PWM_GEN_2、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_SYNC);

    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_3、(Board_clock / TIM5_FREQ)- 1);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_6、TIM5B_10US);
    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_2、(Board_clock / TIM5_FREQ)- 1);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_5、TIM5B_10US);

    PWMGenEnable (PWM0_BASE、PWM_GEN_3);
    PWMGenEnable (PWM0_BASE、PWM_GEN_2);

    PWMSyncTimeBase (PWM0_BASE、PWM_OUT_5_BIT | PWM_OUT_6_BIT);
    PWMSyncUpdate (PWM0_BASE、PWM_OUT_5_BIT | PWM_OUT_6_BIT);

    PWMOutputState (PWM0_BASE、PWM_OUT_6_BIT | PWM_OUT_5_BIT、TRUE);

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

    我很烦-考虑到你们的工作、我们还没有任何东西可以证明这一点。

    请原谅我-但是(其他)代码是否有可能"撤消"您在这里展示的新代码块? 或者-某些外部连接可能会影响这些 PWM 引脚吗?

    此外-您(为了让我的团队更加清晰和重复)是否可以用"PeriodSet & WidthSet()"中的"唯一"标签替换为硬编码的数字值。 我刚才注意到您的 MCU 为1294 -我们仅使用了 LX4F 和 TM4C123。 (通常使用其他公司提供的高速 MCU)。

    和-只能使用这些引脚(正式指定为 PWM)。 您是否确定"K-4 & G-1"是(合法) PWM (候选)引脚。 您不能"强制"非 PWM 引脚进入 PWM 模式。 (如果我不问、我们会追逐我们的尾巴...)

    [编辑]...I (现在)请注意,较新的 MCU (如您的 MCU)确实需要"GPIOPinConfigure()"- mea culpa.   (在我们过去(成功)同步的 PWM 代码中、该调用不会出现在任何位置!  {我们成功地找到了成功的结果}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    PWM 在 NO_SYNC 下工作正常、因此引脚肯定具有 PWM 功能。 我在一个空项目中执行所有这些操作、只需一个任务、因此没有其他代码。 电路板也没有其他连接。 仅使用示波器探头。 以下是包含字面量的代码:

    SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
    GPIOPinConfigure (GPIO_PK4_M0PWM6);
    GPIOPinConfigure (GPIO_PG1_M0PWM5);
    GPIOPinTypePWM (GPIO_PORTK_base、GPIO_PIN_4);
    GPIOPinTypePWM (GPIO_PORTG_base、GPIO_PIN_1);

    PWMGenConfigure (PWM0_BASE、PWM_GEN_3、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_SYNC);
    PWMGenConfigure (PWM0_BASE、PWM_GEN_2、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_SYNC);

    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_3、(120000000 / 2500)- 1);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_6、(120000000 / 100000)- 1);
    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_2、(120000000 / 2500)- 1);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_5、(120000000 / 100000)- 1);

    PWMGenEnable (PWM0_BASE、PWM_GEN_3);
    PWMGenEnable (PWM0_BASE、PWM_GEN_2);

    PWMSyncTimeBase (PWM0_BASE、PWM_OUT_5_BIT | PWM_OUT_6_BIT);
    PWMSyncUpdate (PWM0_BASE、PWM_OUT_5_BIT | PWM_OUT_6_BIT);

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

    感谢您的合作/努力-谢谢。 我有一个本地 TM4C123 LPAD -但没有基于129的器件。

    在使用参数"PWM_GEN_MODE_NO_SYNC"以及监控和报告时、您是否会(暂时)"注释掉"SyncTimeBase()和同步更新"。 然后 PWM 输出是否恢复?  (但仍将保持 Unsync-ed.)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我对这两个同步行进行了注释、并将两个发生器的配置设置为"PWM_GEN_MODE_NO_SYNC"。 PWM 输出看起来很好、当然没有同步。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请原谅我-显然我不是一个多任务的人。   我们的目标是查看在采用"PWM_GEN_MODE_SYNC"时是否可以恢复两个通道上的 PWM 输出。  (到目前为止、您已报告了采用该参数时的 PWM 损耗。。。)  抱歉。   (正在等待我的航班@机场)

    是否在单个边沿事件上触发?   (如果是,“同步”可能尚未建立)  另外- iirc - PWMSyncUpdate()应该被调用一些规律性的-因为“同步”可能会随着时间的推移而削弱。  (请记住、这一发现是在过去几年中观察到的...)

    也许值得尝试不同的 PWM 引脚设置。   (来自2个不同的 PWM 发生器-查看您是否遇到了独特的"引脚限制"。)   

    尽管已经过去几年了-我清楚地记得(第二和第三) PWM 通道、当我们调用"SyncTimeBase & SyncUpdate()"时、"跳转至对齐"。

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

    最后-(很可能)解决方案就在手边!

    //同步发生器的时基。 ***最后找到了我的过去代码-就像登机一样... ***
    //
    ROM_PWMSyncTimeBase (PWM0_BASE、PWM_GEN_0_BIT | PWM_GEN_2_BIT | PWM_GEN_3_BIT); //注意:突出显示中的参数与您的参数不同!

    您的参数针对单个位-这些地址针对单个发生器!   (此同步功能的"存在理由"是同步多个发生器!)

    显然、在这个鹅卵石的 PWM 函数集合中有太多参数!   (有效地折磨新用户、直到他们(最终)正确使用!)   驱动程序外设指南(stink)清晰/全面地描述!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很棒的收获! 这似乎解决了问题! 我不能相信我做了这样的监督。 感谢你的帮助!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您-我现在有了"双人"绿色奖励-一个(亲切)来自您-第二个是着陆后的"沙姆罗克"。

    您并非孤军奋战。 正如我所指出的-用户手册未能充分正确描述-并且没有示例深入介绍此级别的 PWM 控制。

    您的能力非常强-很抱歉"猴子运动"-我发现我们的第一个 PWM 工作是通过供应商的"LM3S" MCU 完成的-不支持 GPIOPinConfigure()!   后来我们搬到了 LX4F -当然了- PinConfigure()(就像你想象的那样)就在那里!

    在这样的细节上,魔鬼(总是)的喜悦。   市场营销对技术较差的作家的"推"导致手册在这一领域的不足。  (我敢打赌)