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.

[参考译文] TM4C1294NCPDT:PLL 输出中抖动的说明

Guru**** 2553260 points
Other Parts Discussed in Thread: TM4C1290NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050247/tm4c1294ncpdt-explanation-for-jitter-in-pll-output

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:TM4C1290NCPDT

我没有疑问、但想对相关问题(该主题现已锁定)中提出的问题提供可能的解释。  也许 TI 的某个人可以确认或拒绝这一点、并提供数据表中所述内容以外的一些详细信息。

Brad Rodriguez (OP)写道:"此时、我使用 TM4C 计时器生成一个常规的50微秒脉冲、在前缘触发、并使用数字'scope 观察后缘。 我看到后沿上的抖动约为8ns、其中2.5ns 可归因于"范围"。

Randy OTT 写道:"我不会太快地将观察到的抖动归咎于 PLL。 8nS 非常接近120MHz 时钟的8.333nS 周期...  PLL 实际上不应产生太大的抖动。"

TLDR -我认为抖动的根本原因是使用晶体频率(25MHz)、而该频率不是320MHz 或480MHz 的精确分频值。  如果使用整数除数晶体频率、例如5MHz、10MHz 或16MHz、我怀疑抖动会大大减少。  

为什么晶体频率很重要?  它归结为 PLL 的工作原理、在本例中为分数 N PLL。  PLL 处理控制 VCO 生成的频率的电压。  它通过比较两个信号(一个来自基准、一个来自反馈)的相位并进行调整以使其保持锁相(因此称为"锁相环")、从而使频率相等来实现这一目的。  为了从 VCO 获得比基准更高的频率(在本例中来自晶体)、在 VCO 输出和相位比较器之间的反馈环路中插入了一个分频器。  例如、如果将分频器设置为将频率降低10倍、则分频版本的 VCO 频率必须是参考频率的10倍、该参考频率将到达相位比较器、以等于参考频率。  因此分频器(在反馈环路中)可以有效地将 VCO 输出频率设置为基准的倍数、在本例中为10X。  这一切都非常简单(在概念上)、正如 Randy 所写的、不应导致 VCO 输出产生太多抖动。

当您希望输出频率是基准的某个非整数倍时、它会变得更加复杂。  一个选项是在基准频率到达相位比较器之前对其进行分频(预分频)、然后乘以一个较大的因子以获得输出。  我一直无法确定 TM4C129是否能够做到这一点。  如果可以的话、25MHz 基准可以除以5、然后乘以整数、以达到 VCO 支持的频率320MHz 或480MHz (然后除以得到120MHz 或任何系统时钟)。  我认为这也会提供低抖动输出。

不过、在这种情况下、我可能会使用不同的技术、在反馈环路中使用小数(实际上是混合数)除数、这是由"小数 N" PLL 支持的。  查看 _SysCtlFrequencyGet 的源代码、它看起来好像有一个可用的/32 (5位)小数(可能还有一个/1024)。  假设一个数字比实际数字更好的示例、假设我们有一个16.384MHz 晶体(在 SYSCTL.h 中定义为 SYSCTL_XTAL_16_3MHz)、并希望 VCO 输出320MHz。  这意味着我们需要在 PLL 的反馈环路中实现19.53125的分压比。  这恰好是19 17/32、因此它非常适合/32分数 N PLL。  每次脉冲进入分频器时、输出会改变或不改变;那里没有分次可用。  因此、它将部分时间除以19、其余时间除以20 (时间的17/32)、因此平均 分频比得到了正确的结果。  现在应该很明显、当使用分数(而不是整数)比时、输出中会出现抖动;分频器分频比以及因此输出频率在可用频率阶跃(基准频率的倍数)之间不断变化、以获得所需的平均频率。

分压器比率变化引起的这种变化可以通过在相位比较器输出达到 VCO 之前对模拟电压输出进行滤波来得到一定程度的平滑、因此 VCO 输出不会对变化进行密切跟踪。  搜索"PLL 环路滤波器"以了解更多相关信息(它会变得非常复杂)。  在这种情况下、PLL 环路滤波器位于 MCU 内部、无法更改。  但它 确实会影响输出跟踪不规则分频器输出的紧密程度、因此使得诸如8ns 抖动(在 OP 示例中)接近120MHz 时钟的8.333ns 周期的观察与分频器的运行没有直接关系。  我不确定这些特定数字是否只是重合、但我确信使用小数分频器会在时域中引入抖动、并在频域中引入相应的"有趣"(不良)影响。

我所写的内容是否适用于本例、主要是猜测、但它似乎符合 OP 的观察结果以及我能够从源代码和数据表中解密的内容。  如果 TM4C129数据表包含一个方框图、其中显示了 PLL 与预分频器的内部关系(如果有的话)、并且显示了反馈环路分频器、这将是很好的、这样我们就可以更好地探索折衷并了解建议的寄存器值。

Steve

P.S.  我偶然发现了 Wikipedia 页面上的"双模预分频器"。  它的工作原理与我描述的非常相似、但在达到相位比较器之前应用于基准频率。  我不熟悉此类预分频器、但它们似乎不可避免地以类似的方式引入抖动。  我知道、TM4C129可能会在反馈环路中使用其中一个、而不是或以及分数 N 分频器。

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

    您好、Steve、

     感谢您的见解。 PLL 抖动通常非常小、可能小于1ns。 无法听到8ns 抖动。 您能不能显示 Brad Rodriguez 和其他人发布的链接。 我想阅读讨论的背景。 我认为有一些误解。    

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

    好的、我找到了 Brad Rodriguez 的原始帖子。  

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

    原来的帖子 是 https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/419897/tm4c129-with-120-mhz-external-clock?keyMatch=TM4C129+LAUNCHPAD

    我通过从这个问题中选择"提出相关问题"创建了这个问题、该问题应自动链接到该原始问题、但我在两个方向上都找不到链接。

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

    我不是 PLL 设计人员、无法回答有关抖动的所有问题。 我认为 Amit 回答的这个帖子与这个问题有某种相关性。  

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/432737/tm4c1290-sysclk-jitter-value-12mhz-crystal-and-80mhz-sysclk

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050247/tm4c1294ncpdt-explanation-for-jitter-in-pll-output/3886230 #3886230"]PLL 抖动通常非常小、可能小于1ns。 无法听到8ns 抖动。 [/报价]

    引用的线程以 的说法结尾

    [引用]更新:我现在正在使用高分辨率计时器进行测试,我看到抖动低于1nsec --无论是否使用 PLL。  因此、我认为我之前看到的8纳秒来自我的'scope、而不是来自 MCU。

    我没有适合自己执行抖动测量的设备。

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

    我也看到了这一点、但我不确定他在切换到"高分辨率计时器"之前使用了什么、因此我不知道该计时器的用途。  我还不确定他是否已按照讨论的那样改用120 MHz 外部振荡器来馈送它。  如果 PLL 仍然使用相同的25MHz 晶体基准和相同的 PLL 分频器设置、则会显示 PLL 不是原始抖动的来源。  这符合他的建议、即"我之前看到的8纳秒来自我的'scope、 不是来自 MCU 的"、但它仍然没有解释为什么他说他"现在正在使用高分辨率计时器进行测试"、这可能是与示波器无关的解释。

    回顾一下他所写的内容、我现在注意到他建议 PLL 有一个输入预分频器、并且它由 Q 分频器控制。  这是我在数据表中没有找到的那种信息(TI -您能确认它、也许能提供一些有关 PLL 的更多信息吗?)。  使用类似的预分频器、我想您可以将25MHz 除以5、然后使用 N 分频器将其乘以320MHz 或480MHz、而不会有任何小数除数、从而避免我写的抖动。  或者、PLL 环路滤波器可能足以消除小数分频器引起的抖动(我猜不是这样、数据表显示"请注意、为了减少抖动、应将 MFRAC 编程为0x0。"   

    TI -您能告诉我们每个分频器的功能是什么、以及可以将它们设置为什么范围的值吗?  TM4C1290NCPDT 数据表中的26-18表很好、但我们可能还想了解其他有用的寄存器设置组合、这将有助于了解其中列出的组合。  例如 、sysctl.h 定义了 SYSCTL_XTAL_16_3MHz、并且在注释中建议它用于16.384MHz 晶体。  即使表26-18中未列出、也可以使用它吗?  数据表表表或源代码中未列出的其他值如何?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="227181" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050247/tm4c1294ncpdt-explanation-for-jitter-in-pll-output/3888460 #3888460"]我也不确定他是否已按照讨论的那样改为使用120 MHz 外部振荡器来馈送它。  [/报价]

    根据数据表、PLL 输入频率限制为5-25MHz。 向 PLL 馈送120MHz OSC 是错误的。 我想这是 OP 的一个拼写错误。  

    [引用 userid="227181" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050247/tm4c1294ncpdt-explanation-for-jitter-in-pll-output/3888460 #3888460">回顾他所写的内容、我现在注意到他建议 PLL 具有输入预分频器、并由 Q 分频器控制。  这是我在数据表中未找到的信息类型(TI -您能否确认并提供有关 PLL 的更多信息?)。[/引述]

    Q 和 N 记录在数据表中。  

    [引用 userid="227181" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050247/tm4c1294ncpdt-explanation-for-jitter-in-pll-output/3888460 #3888460"]TI -您能告诉我们每个分频器的功能是什么以及可以将其设置为什么范围的值吗?  TM4C1290NCPDT 数据表中的26-18表很好、但我们可能还想了解其他有用的寄存器设置组合、这将有助于了解其中列出的组合。  例如 、sysctl.h 定义了 SYSCTL_XTAL_16_3MHz、并且在注释中建议它用于16.384MHz 晶体。  即使表26-18中未列出、也可以使用它吗?  数据表表表或源代码中未列出的其他值是什么?

    下面是我绘制的简要图、其中显示了各种组件。  根据数据表、晶体值可以是5MHz 至25MHz 之间的任何频率。

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

    感谢 Charles 的示意图。  这正是我要查找的信息类型。  

    我仍然很难让一切都变得有意义。  在该图中、预分频器似乎将晶体频率调整为(N+1)/(Q+1)倍。  这意味着数据表中写入 fin  =  fXTAL /(Q+1) (N+1)的方程式应该被解释(添加了括号)为  fin = ( fXTAL /(Q+1) ) (N+1)。  但是、查看 SysCtlVCOGE()的源代码、我看到以下行:

    ui32TempVCO /= ((ui32NDiv + 1) * (ui32QDiv + 1));

    这使我认为正确的操作顺序是  fin =  fXTAL /( (Q+1) (N+1) ) 、并且图表中的预分频器块应该显示

        1

    ----------

    (Q+1)(N+1)

    当然、如果您将 Q 设置为零、哪一项是正确的无关紧要(下面将详细介绍)。

    查看 SysCtlClockFreqSet(), 如果 ui32Config 包含  SYSCTL_USE_PLL,则“系统分频器”设置为 VCO 频率(320MHz 或480MHz)除以请求的系统时钟频率,并始终将分频值向上舍入,以避免结果超过请求的频率。  这最终会影响写入  SYSCTL_RSCLKCFG 的内容、这对于图中的"/ R"块来说是合理的。  通过这种方式定义"R"、它等于(PSYSDIV + 1)。  因此该块可以标记为1/(PSYSDIV + 1)。

    总结一下 (如果我正确的话):

    • 晶振频率应为5MHz 至25MHz。  如果您想使用以太网、它必须为25MHz。
    • 预分频  器可用于将该频率分频至 PLL 基准频率 fin 的4MHz 至30MHz 范围内的任何值。
    • PLL 将  fin 乘 以 M、这是一个具有整数部分和/1024部分的混合数、mint+mfrc/1024、以获得 VCO 频率、该频率应为320MHz 或480MHz。  如果 MFRAC 为0、则抖动更少、如果 VCO 频率恰好是 fin 的倍数、则情况将如此。  函数 _SysCtlFrequencyGet ()调用此 P 而不是 M
    • VCO 频率将被除以(PSYSDIV + 1)以获得系统时钟、该时钟可能高达120MHz、至少低至6MHz (这是 TM4C1290NPDT 数据表中表26-17中显示的最低值)。  为了获得最大 CPU 性能(120MHz 时钟)、您需要使用480MHz、因为无法将320MHz 除以整数并得到120MHz。

    我还没有解决一些问题、但在大多数情况下、这些问题都无关紧要:

    • 如果25MHz 确实是最大晶体频率、我不明白 Q 分频器的作用是什么。   表5-7下面的脚注"A"显示"对于列出的所有示例、Q=0 "、因此可能没有任何好的示例。  如果我正确理解了预分频器、您可以通过更改 N 来实现所有有用的分频器分频比。所需的最大分频值为5、因为下一个较高的值(6)会导致参考频率低于4MHz、这是支持的最低频率(25MHz/(6+1)= 3.57MHz)。   除非 赵洪章正好在他写的相关线程中、"根据数据表、我认为 PLL 可以用120 MHz 作为输入"。  如果是这样、也许您可以使用比 N 本身所能提供的更大的分频比。
    • 表5-6的脚注指出:"使用非整数除数会引入额外抖动、这可能会影响接口性能。"  其背景是 PSYSDIV 分频器、我认为该分频器仅支持整数值。  也许与 M 分频器存在混淆、这是有道理的。
    • 后面的段落是"第231页的表5-7显示了实际的 PLL 频率和给定晶振选择的误差。"  但是、表5-7中的所有示例都会导致实际 PLL 频率出现零误差。  这对于确定它的工作原理没有很大帮助。  一些不太完美的示例会更好。
    • 它还说:"内部转换提供了±1%的目标 PLL VCO 频率范围内的转换。"  这是否意味着 VCO 可以偏离其标称频率(320MHz 或480MHz)至少±1%?  如果是这样、您应该能够使用5MHz 至25MHz 范围内的任一晶振频率并使 PLL 锁定、因为它可以选择一个 M 值、使其在1%以内。  但是 SysCtlClockSet()的写入方式(使用表查找)、你必须使用其中一个预定义的晶振频率(或者自己设置寄存器)。 换句话说、如果您自己设置寄存 器、而不是使用 SysCtlClockSet()、我想您可以使用5MHz 至25MHz 范围内的任何晶体频率。
      • 我认为它应该能够接近1%、因为 M SysCtlClockSet()的最小值 大约为11、小数部分为 x/1024。  因此、在11个器件中、1024个器件中的1个器件在11000个器件中大约是1个器件、小于0.01%。
    • VCO 必须能够处理远大于 ±1%的变化、因为您可以将其与 PIOSC 一起用作基准、并且  PIOSC 在 0°C 以下的温度下的容差为±10%。  如果您使用容差比该更小的晶体、则可能可以对 M 分频器进行编程、以实现大约320MHz 或480MHz 10%范围内的频率目标、并且效果良好。  
      • 这表明、可能会将 MCU 超频高达10%;请考虑、您可能会在无意中通过使用 PIOSC 将其设置为规格的最大频率来实现此目的。  如果 PIOSC 频率恰好在其 ±10%容差范围的顶端(低于0C)、则 VCO 将以10%的速度快速运行。  另一方面、它可能只能在 温度较低时处理10%的快速运行。  如果您将 PLL 设置为针对超频频率、则希望使用精确的频率基准、因为您不希望频率基准中有意超频和误差的组合将实际频率推高超过10%、 除非 您从 TI 获得 VCO 频率范围的规格、这表明 这是可以的。  如果您尝试过它、PLL 不会锁定、这可能会导致问题。
      • 对于某些晶体频率、您可能希望实现与320MHz 或480MHz 稍有不同的目标、通过将 MFRAC 设置为0来最大限度地减少抖动、而不是设置为允许您尽可能接近320MHz 或480MHz 的分数。  例如、如果你使用 一个16.384MHz 晶振、 SysCtlClockSet()将 M 设定为一个混合数(MFRC 不是0)。  我建议可能没有必要这样做;将 M 设置为整数并让 VCO 在其标称频率基础上进一步运行会降低抖动。  您需要使用精确的频率基准、以便有意与标称差值的容差堆叠和合并基准的容差保持在10%以内。
      • 您可能希望将 VCO 频率设置 为与320MHz 或480MHz 稍有不同的另一个原因 是、这样做可能会让您更准确地达到特定的 PWM 频率。   例如、如果您使用16.384MHz 晶体、SysCtlClockSet()将尝试将 M 设置为分数值、以便尽可能接近标称 VCO 目标频率(在 M 设置为19 544/1024时、可以恰好达到320MHz、 如该主题中的第一条消息所述)。  遗憾的是、320MHz 或480MHz 都未按您可能希望的计时应用(尽管您可以非常接近)精确地(按整数)分频至32.768kHz。  在此示例中、如果对 M 使用任何整数值、则可将得到的 VCO 频率除以整数、以精确达到32.768kHz (因为16.384MHz 是32.768kHz 的精确倍数)。  通常、M 不一定是整数才能准确地实现特定的 PWM 频率、但如前一个点所述、这样做也会降低抖动、因此您也可以选择晶体和 VCO 频率、从而实现这两种优势。
    • 表5-6和表26-17是相同的、周围的一些材料也是相同的。  这是多余的,但比相互矛盾要好得多
    • 我不明白为什么 需要函数 SysCtlClockFreqSet()中的这些行。  显然、它们会调整_SysCtlFrequencyGet ()以返回两倍的系统时钟频率。   SysCtlFrequency 和 SysCtlClockFreq 之间是否有区别?  它们是否都不同于  SysCtlVCO?  我可能会弄明白这一点、但周五下午5点之后...

    Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="227181" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050247/tm4c1294ncpdt-explanation-for-jitter-in-pll-output/3889788 #3889788"]

    这使我认为正确的操作顺序是  fin =  fXTAL /( (Q+1) (N+1) ) 、并且图表中的预分频器块应该显示

        1

    ----------

    (Q+1)(N+1)

    当然、如果您将 Q 设置为零、哪一项是正确的无关紧要(下面将详细介绍)。

    [/报价]

    您好、Steve、

     您完全正确。 很抱歉造成混淆。 为了保持以下参考频率、N 必须如公式所示位于分母中。 您有太多问题需要我消化、现在是星期五。 我将在星期一回答您的问题。