火柴盒示波器的制作

2020-02-08来源: elecfans关键字:火柴盒示波器

步骤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上生成。

如果您不想要“测试信号”输出,则不要包含连接器D3。在INO文件中,将bool常量bHasTestSignal设置为false。

步骤7:串行协议

示波器通过USB电缆将数据帧传输到PC,就好像它是115200波特,8位,无奇偶校验的串行数据流一样。


PC可以将两种命令发送到示波器。小写命令是单个字节:

‘a’将x轴设置为“1mS”= 1Msps

‘b’将x轴设置为“2mS”

‘c’将x轴设置为“5mS”

‘d’将x轴设置为“10mS”

‘e’将x轴设置为“ 20mS“

‘f’将x轴设置为”50mS“

‘g’将x轴设置为”100mS“

‘j’set y -axis to 5V

‘k

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

上一篇:关于示波器测量电流、纹波、市电的方法和应用介绍
下一篇:四种捕获模式重构波形的异同

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利
小广播
更多每日新闻
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved