摩尔芯闻 > 行业新闻 > 半导体 > 如何制作一款火柴盒示波器?

如何制作一款火柴盒示波器?

eefocus ·2020-08-25 00:00·电子工程世界
阅读:861

步骤 1:以每秒 1M 个样本进行采样


火柴盒示波器的制作

我们称这个示波器为“ArdOsc”(因为这是 INO 文件的名称)。

六年前,Cristiano Lino Fontana 为他的 Girino 设计发布了一个 Instructable。

它有点工作但有问题。特别是,它的最大可靠采样率约为 37ksps(75ksps 偶尔会冻结)并且触发器似乎无法正常工作。它也没有显示。

Girino 很慢,因为它使用中断。由于保存和恢复寄存器所需的代码,中断很慢。中断是危险的,因为它们可能导致软件出现错误,而且很少发生错误。我已经编写了 40 年的嵌入式代码,我尽可能避免中断。轮询好,中断不好。注意我的话。

因此,ArdOsc 禁用所有中断,进入紧密循环并在需要时从 ADC 中获取数据。如果 ADC 没有完成:太糟糕了 - 只要给我你所拥有的。它抓取 1000 个样本(每个一个字节),然后重新启用中断并通过串行端口以 115200 波特率将字节发送到 PC - 或者它抓取 128 个样本并将其显示在屏幕上。

Girino Instructable 详细描述了 Arduino ADC。如果您有兴趣,请阅读并阅读 Atmega328p 数据表。我只想告诉你大纲。

Arduino ADC 使用“逐次逼近”。它测量最重要的位 - 是 0 还是 1?得到它之后,它将其“到目前为止的答案”与输入电压进行比较并测量下一个最重要的位。接下来。等等 10 位。这些位存储在 ADCH 寄存器(前 8 位)和 ADCL(后两位。我只想要 8 位,所以我忽略了 ADCL。

ADC 测量全部 10 位时设置一个标志。但我只想要 8 位,所以我忽略了标志并读取 ADCH 是否 ADC 完成。我原本以为这意味着我会得到“答案到目前为止”但我没有。到目前为止的“答案”存储在其他地方,我们得到的是上传到 ADCH 的最后一个答案。这意味着在 1Msps 模式下,每个连续的 4 个样本集都是相同的。 Arduino 草图使它们平滑,因此它们看起来很好但不会被愚弄:你看到 250ksps。 (感谢 AndrewJ177 指出这一点 - 请参阅下面的讨论。)


测量每个位需要时间。该定时脉冲来自于将 Atmega 的时钟(16MHz)除以“预分频器”值:2,4,8,16,32,64 或 128. 如果将预分频器设置为 2,则为 0.125uS,这对于 ADC 正确地进行比较 - 质量很差。预分频器= 4,表示 0.25uS 哪种工作 - 结果有噪声。预分频器= 8,表示 0.5uS,对于 8 位非常合理。一般来说,每位给 ADC 的时间越长,工作效果就越好。

但如果你允许 ADC,比如每位 1uS 那么它每个字节需要 8uS,即 125ksps - 相当慢。如果将预分频器设置得太低,则只能正确转换前几位,并且得到的图形具有大的锯齿状步长。如果将预分频器设置得过高,则需要等待很长时间才能进行转换。

因此,这是每比特时间和每秒采样之间的权衡。

我们还必须考虑输入信号需要多长时间才能改变 ADC 采样保持电容的电压。我们不会在每次转换之前更改通道,因此充电时间不必与 Atmel 文档建议的时间一样长,但仍有效果。示波器可以达到 20kHz,但响应会下降。您可以看到一个 50kHz 的正弦波,但它的大小应该是它的四分之一。

ArdOsc 代码只有一个完全正确的长度,以 1Msps 的速度采样 - 即它需要 16 个时钟周期环。另一个更复杂的循环会占用更长的采样时间。

第 2 步:最简单的示波器


最简单的 ArdOsc 由 Arduino Nano(328p 16MHz)4 个电阻和 3 个电容组成。

示波器由 USB 连接供电并传输帧通过 USB 将数据传送到 PC。

输入信号被送入 ADC A0 引脚。在极端电压情况下,10k 电阻可为 Atmega 提供一些保护。

Atmega 引脚具有二极管,可防止其输入超过 Vcc(5V)或低于 0V。二极管可以传导高达 1mA 的电流,因此示波器的输入信号可以安全地在 -10V 和+ 15V 之间变化。 ADC 引脚的输入阻抗约为 100M 和 14pF,因此额外的 10k 对 ADC 的精度影响不大。

ADC 使用 Vcc 作为参考电压读取 A0 引脚电压 - 因此测量范围为 0V 至 5V。 (实际上它是 0 到 Vcc * 254/255。)不幸的是,Vcc 很少是 5V,所以程序读取 Vcc 的实际值并适当地绘制“示波器显示”的格线。

输入是也通过一个 100nF 电容馈入 ADC A1 引脚。 A1 通过 1M 电阻连接到 0.55V。因此,A1 引脚看到输入信号的交流分量以 0.55V 为中心。

ADC 使用内部 1.1V 参考电压读取 A1 引脚电压 - 因此测量值为 -0.55V 至+ 0.55V。

0.55V 是由 Nano 的 3V3 引脚的分压器产生的。 3V3 引脚电压比 USB 连接的“5V”稳定得多。 3V3 引脚的输出不完全是 3.3V,因此您必须修整分压器以提供 0.55V 的电压。将示波器输入连接到地,然后查看 AC 范围显示的“电压”。调整 R1 直到线位于屏幕中心 - 我需要 R1 = 33k。

我已经展示了电路的条形板布局。条形板与 Arduino Nano 的尺寸相同,形成三明治。 Nano 的底面位于条形板的铜侧(因此在图中,Nano 从下方显示)。将一些引脚焊接到条板上,然后将 Nano 安装在引脚上并将它们焊接到 Nano 上。在我的图表中,条形板的铜以青色显示。红线是条形板上的导线或柔性导线从电路板上传出信号和电源。


步骤 3:放大信号


“最简单”示波器有两个输入范围:


0V 至 5V


-0.55 V 至+ 0.55V


但我们感兴趣的许多信号都小于此值。因此我们可以添加两个放大级。


LM358 双运算放大器放大 A1 的 AC 信号。运算放大器采用交流耦合,两个输入均以 0.55V 为中心。两个运算放大器级的增益都不到 5 倍。它们的输出转到 A2 和 A3,因此 Atmega 可以选择要采样的信号。

示波器现在有四个输入范围:


0V 到 5V


-0.55V 至+ 0.55V


-117mV 至+ 117mV


-25mV 至+ 25mV

它使用相同的 INO 文件并且作为“最简单”的执行。

将交流信号对中在 0.55V 附近的优点是运算放大器信号保持低电平。 LM258 输出不能在 Vcc 的 1.5V 范围内;所以它的范围是 0V 到 3.5V - 可怕。

我已经展示了电路的条形板布局。有两个条板 - 一个用于 Nano,另一个用于 LM358。他们应该形成三明治。电路板从元件侧显示。精细的柔性电线连接两块板。将电路板与粘垫,焊接支架或其他任何东西连在一起。在我的图表中,条形板的铜以青色显示。红线是条形板上的线链或将板连接在一起的柔性线。我没有显示“测试引线”。

再一次,你可能需要修整分压器给 0.55V。将示波器输入连接到地并调整 R9 直到线位于屏幕中央 - 我需要 R9 = 33k。

LM358 可能存在问题。如果信号大于 LM358 可以处理 LM358 的输出失真。您应该使用较高增益设置来查看小信号。如果你在大信号上使用它们,它们就会变形。你可以尝试更好的芯片 - 如果你有一个 - LM358 是一个相当差的芯片。

第 4 步:逻辑显示


通常你在处理逻辑电平 - 示波器是否可以显示几个“逻辑”通道。是的 - 这比搞乱 ADC 更容易。

值得吗?可能不是,但很容易这样做为什么不呢?


示波器现在有五个输入范围:


0V 到 5V


-0.55V 到+ 0.55V


-117mV 至+ 117mV


-25mV 至+ 25mV

逻辑


在“逻辑”中“模式,四个逻辑通道可以连接到 Arduino 引脚 D8,D9,D10 和 D11。它们在显示屏上显示为四行。

D8 至 D11 对应于 Atmega328p 芯片的端口 B 引脚 0 至 3. 芯片将整个端口 B 读入其采样缓冲器而不是 ADC 输出在 ADCH 寄存器中。

在 1Msps 模式下,你能看到的理论最大频率是 500kHz - 但你得到的只是一个“状态变化”的实心条。实际上,250kHz 信号更容易看到。

如果您不想要“逻辑”输入,则不要将连接器包括在 D8 到 D11 中。在 INO 文件中,将 bool 常量 bHasLogic 设置为 false。 (我尝试重新编写代码以使用#define 而不是 bool const 但是它很乱。)

步骤 5:触发器


假设您正在查看重复波形,例如正弦波。如果示波器在每次扫描时在屏幕上的相同位置显示它,那就太好了。因此,示波器扫描应该被启动,就像波从负变为正。

首先我尝试使用比较器来触发扫描(即开始收集数据)吉里诺做到了。它似乎很理想,但结果却有缺点。我决定使用 0.55V 的固定触发电压 - 交流信号的中间位置。 Atmel 允许您将比较器连接到当前 ADC 通道。听起来不错。但您必须关闭 ADC,并在触发发生时再次将其重新打开。 ADC 需要一段时间才能启动。不太好。

所以我采取简单的方法 - 运行 ADC 并观察它产生的值。当它们从中途下降到中途时,开始扫描。

在“逻辑”模式下,D8 用作触发器。

如果没有信号则示波器应该是自由运行的。在等待一段时间后开始扫描。我选择了最长等待 250 毫秒。程序初始化 Timer1(一个 16 位定时器),然后等待,直到它计算了足够数量的滴答。我只是看着 Timer1 的计数器 - 应该有一个更好的方法来使用标志,但它非常复杂,我无法让它 100%可靠地工作。

步骤 6:测试信号输出


您偶尔需要一个信号来测试您正在构建的任何电路。很多人已经有了信号发生器。


ArdOsc 电路可以提供以下频率的方波:


31250/1 = 31250Hz


31250/8 = 3906Hz


31250/32 = 977Hz


31250/64 = 488Hz


31250/128 = 244Hz


31250/256 = 122Hz


31250/1024 = 31Hz


测试信号在引脚 D3 上生成。

关键字: 火柴盒示波器 寄存器 采样 编辑:什么鱼 引用地址: http://news.eeworld.com.cn/Test_and_measurement/ic507568.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
分享到:
微信 新浪微博 QQ空间 LinkedIn

上一篇:示波器安全测量220V市电的方法

下一篇:选购示波器应考虑哪些参数

打开摩尔直播,更多新闻内容
半导体大咖直播分享高清观看
立即下载