为什么我的某些信号会“颤抖”(有抖动)?

电器工程 spi 信号完整性
2022-01-29 01:40:40

我有一个 2 MHz SPI 总线,但我注意到的一件事是我的一些信号经常“颤抖”。是的,我的触发器设置正确,所以我认为问题不存在。

你可以在这里看到我的意思:(这是在持久性模式下)。这是我的 SPI 总线的时钟。

在此处输入图像描述

在此处输入图像描述

SPI 工作正常。我已经在多个板上传输了数百兆字节,到目前为止还没有发现问题。但我仍然有兴趣知道这里可能存在什么问题。另外,即使它有效,我也应该费心修复它吗?

测量是在源头用一个非常小的接地夹进行的。

这是我的电路的简化示意图。当然,板上有更多的 SPI 设备,但就这个问题而言,这是准确的,因为除了 uC 和 SD 卡外,板上还没有焊接任何东西。

在此处输入图像描述

主控(AVR Mega 128)正在耗尽它的内部 RC 振荡器——我不知道这是否相关,但由于信号及时移动,RC 振荡器的抖动也可能最终出现在 SPI 总线中。只是想我会提到它。我还想到,在这些测量过程中,我以无限循环运行控制器。这是代码:

while(1)
{
    setFirstBitOnDriver(driver); // this sends a 8-bit command on the SPI bus.
    GLCD_SetCursorAddress(40); // Change cursor position on the display.
    GLCD_WriteText("LED: "); 
    for(wire=0;wire<72;wire++)
    {
        itoa(wire+1,str,10);
        GLCD_WriteText(str);
        GLCD_SetCursorAddress(44);
        _delay_ms(10);
        shiftVectorOnDriver(driver); // another command on SPI. 8-bit wide.
    }
}

当内部运行 72 次然后退出时,可能会发生抖动/颤抖。由于执行前三行需要额外的时间,因此由于额外的处理时间,每个第 73 个波形到达的时间可能略有不同。如果我必须打赌,我猜这就是我的问题的原因(如果可以的话,我会立即确认,但我的董事会在工作,下周休息!)但我仍然想要意见/ SE对此问题的回答。

但是考虑到 uC 以 8 Mhz 运行,我不会因为软件而抖动,因为它以纳秒为单位,而是以微秒为单位。但在第二张图中,可以看到一条平线。这会发生很短的一秒钟,其中整个波形随时间变化并且在屏幕上不可见。我猜是由于循环和第一张图片中的抖动是由于 RC 振荡器造成的。

4个回答

您的示波器显示的是一个典型的jitter示例,这意味着事件(上升沿或下降沿)时序中的错误,与信号上是否存在任何电压噪声无关。

但是什么会导致系统中的抖动?

  • 正如您推测的那样,如果 uC 主时钟抖动,那么抖动很可能会直接传输到 SPI 外设的时钟输出。

    不充分的旁路(除了您绘制的两个 100 nF 电容器之外,您的板上还应该有额外的大容量旁路)可能会导致 uC 时钟电路中的抖动。

    电路板上其他电路引入的电源噪声也可能产生这种影响(但会通过更多的旁路来减少)。

  • 抖动可能是 uC 的 SPI 外设性能所固有的。它必须参考系统时钟生成 SPI 时钟。如果它使用一个简单的分频器(在 8 MHz 系统时钟和 2 MHz SPI 时钟的情况下为 4 比 1),您根本不会期望看到太多额外的抖动(尽管系统时钟抖动会直接通过)。但如果它使用更复杂的方案,如 PLL,则该电路可能会改变 SPI 时钟脉冲宽度以与系统时钟保持同步,您会看到这是抖动。PLL 电路也可能对电源噪声特别敏感。

如果抖动幅度被限制在时钟周期的一小部分,就像它似乎在这里,没有理由这种抖动会导致 SPI 总线上的错误(与您的观察一致,即 SPI 总线似乎按预期工作) .

这对我来说看起来像是信号抖动。时钟周期是微小的变化,足以使示波器的持久性使边缘看起来“模糊”。

不知道你的Rigol示波器在测量的时候有没有计算统计的能力。如果是这样,您可以调整触发点,使触发沿出现在屏幕的左边缘,调整时基以显示完整的周期,并测量频率随时间的变化以感受变化。(抖动看起来比触发边缘在屏幕外时更糟。)

如果你想缩小抖动的来源,我会从 RC 振荡器开始。看看您是否可以选择使用不同的时钟方法(如晶体),实施它并重新测量抖动。

示波器图像可能会产生误导,您必须查看所有参数才能正确解释数据。第一张图片显示了 10 ns 的抖动,如果触发器只是在屏幕左侧,那就不是很好了。但右下角显示触发 + 1.78 µs,因此 10 ns 实际上只是时间间隔的 0.5%。这种抖动水平很可能是由 RC 振荡器引起的。期望使用晶体振荡器将抖动减少至少一个数量级。

你说你在 SPI 数据传输中还没有遇到任何问题。这要归功于 0.5% 的相对性。如果您在 CLK 脉冲前 1 µs 使用 MOSI,则 0.5 % 的抖动将导致 5 ns 的抖动,这不会违反建立和保持时间。

如果您需要保证,只需设置时基,以便您可以看到完整的位时间,包括 MOSI 和 CLK 通道。您会注意到抖动几乎看不到,并且连续的边缘保持很好的分离。

抖动是噪声的一种形式。如果您将脉冲边缘之间的到达间隔时间视为一种信号,那么如果这些边缘没有任何抖动,则意味着您的系统呈现出无噪声信号!

方波通常是通过对更连续的波进行阈值处理来产生的,其中一些施密特触发器类型的电路具有滞后行为。晶体或 RC 振荡器不会“本机”输出方波。

因此,如果该输入波上有一些电压噪声,则该噪声将转化为触发的轻微变化,因为电压有时会早晚达到任一阈值。

因此,一种噪声(电压噪声)变成另一种噪声(时序噪声)。