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


9

我有一条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振荡器引起的。


2
你的触发器是什么?
markrages 2012年

@markrages在CH1上将触发器设置为1.48V-上升沿。
萨德

2
一种猜测是,生成SPI时钟信号的uC(我的假设)使用的是PLL,该PLL通过缩短或延长一些时钟周期以使其自身锁定在参考电压上来工作。当那些短时钟周期或长时钟周期到来时,它会在示波器轨迹上产生抖动,因为您要查看的边缘相对于触发边缘要早/晚。
Photon

1
或在主循环中生成了SPI,但有时会有一个中断延迟执行主循环,因此您又会看到循环周期的差异。
Photon

2
这个词是“抖动”,但可能会说“颤抖” ;-)
stevenvh 2012年

Answers:


6

您的示波器显示的是一个典型的抖动示例,这意味着事件定时(上升沿或下降沿)出现错误,而与信号上是否存在电压噪声无关。

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

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

    旁路不足(除了已绘制的两个100 nF电容器外,板上还应有其他大容量旁路)可能导致uC时钟电路抖动。

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

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

如果将抖动幅度限制在时钟周期的一小部分(如此处所示),则没有理由认为该抖动会导致SPI总线出错(与您观察到的SPI总线似乎按预期工作一样) 。


我有一个100nF的旁路电容。在每个芯片上的每个vcc / gnd对上。您还会提出更多建议吗?如果是这样,还需要额外的100nF或1uF电容吗?
萨德2012年

如果此抖动是您板上最糟糕的性能“问题”,则无需进行任何更改。取决于系统中还有多少其他电路以及它们在做什么,通常在设计板上散布一些额外的1、10和/或100 uF旁路电容。这些未本地化至特定芯片,而是为整个电路板提供了“批量”旁路。
Photon

是的,为此,我板上有两个47u钽。所以我应该对旁路部分没问题。
萨德

2
SPI是完全同步的。抖动量不会导致SPI失败。
2012年

@markrages,在OP的情况下,是的。但是,原则上说,实际上,极端的周期抖动可能会例如减小上升沿和下降沿之间的间隔,从而足以违反从器件的建立时间,并导致接口发生故障。但是,抖动必须等于时钟周期的近一半才能发生。
Photon

6

这对我来说似乎是信号抖动。时钟周期变化很小,足以使示波器的持久性使边缘看起来“被抹上”。

我不知道您的Rigol示波器在测量时是否具有计算统计信息的功能。如果是这样,您可以调整触发点,使触发边缘出现在屏幕的左边缘,调整时基以显示完整的周期,并测量随时间变化的频率变化,以了解变化的感觉。(抖动看起来比触发器边缘不在屏幕上时要糟糕。)

如果要缩小抖动源,我将从RC振荡器开始。查看是否可以选择使用其他时钟方法(如晶体),实现它并重新测量抖动。


工作开始后,将使用外部振荡器尝试一下!
萨德2012年

6

示波器图像可能会误导您,您必须查看所有参数才能正确解释数据。第一张图像显示了10 ns的抖动,如果触发器刚好位于屏幕左端,那将不是一个很好的选择。但右下角表示触发+ 1.78 µs,因此10 ns实际上仅是时间间隔的0.5%。该抖动水平很可能归因于RC振荡器。期望使用晶体振荡器将抖动降低至少一个数量级。

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

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


史蒂文(Steven),您能解释一下扳机位置为何重要吗?您如何获得0.5%的数字?
萨德

2
@Saad-触发点是时间=0。显示屏上显示的内容将在1.78 us = 1780 ns之后发生。10 ns抖动(或多或少)就是那1780 ns的变化,因此10 ns / 1780 ns = 0.56%。它看起来如此糟糕,因为它放大了该下降沿,但是参考沿(触发器)将在左侧数十米处。因此,如果要缩小以使整个脉冲都能看到,则抖动看起来会小很多。如果触发点刚好在显示屏的左侧,例如-100 ns,那么10 ns的抖动将是10%。
stevenvh 2012年

1

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

方波通常是通过对一些具有滞后行为的施密特触发器类型的电路进行更连续波的阈值处理而生成的。晶体或RC振荡器不会“自然地”发出方波。

因此,如果该输入波上带有一些电压噪声,则该噪声将转化为触发中的轻微偏移,因为电压有时会更快地达到任一阈值,有时甚至会稍后达到。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.