火柴盒示波器的制作

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

’设置y轴为0.5V

‘l’设置y轴为0.1V‘m’设置y轴为200mV

‘n’将模式设置为“逻辑”

‘p’将触发设置为下降

‘q’将触发设置为上升

‘r ’设置测试信号关闭

‘s’设置测试信号31250Hz

‘t’设置测试信号3906Hz

‘u’设置测试信号976Hz

‘v’设置测试信号488Hz

‘w’设置测试信号244Hz

‘x’设置测试信号122Hz

‘y’设置测试信号30Hz

‘z’扫描并发送数据


扫描数据发送如下:

0xAA

0xBB

0xCC

1000字节数据

程序通过发送响应每个命令一个Ack字节 - “@”。


Arduino串行库使用中断来读取串行输入。扫描期间输入关闭,因此输入字节保留在Atmega的串行输入寄存器中。扫描结束时,串行库收集字节,程序可以读取它。但是如果在扫描期间到达第二个字节,它将被丢弃。


大写命令可以包含几个字节,因此如果在扫描期间发送,则会损坏。在发送大写命令之前,停止发送‘z’并等待结果。大写命令仅用于调试和测试。有几个可以包含整数十进制值‘n’:

‘A’n将ADC通道设置为n

‘B’报告“电池”电压= Vcc

‘D’报告状态

‘F’n设置频率pwm

‘R’n设置Vref为ADC

‘T’n触发上升或下降

‘U’n设置预分频器并发送扫描数据

‘V’n设置ADC的采样周期


步骤8:添加显示

示波器可以有自己的内置显示器--1.3“OLED。虽然1.3”听起来很小,但这些显示器非常清晰。


显示器有1.3“OLE运行在3.3V时,由SH1106芯片通过I2C总线控制。(SPI版本可用,但我使用Arduino SPI引脚作为“逻辑”。)


我需要一个非常快速的Arduino库和它最好是小的.U8glib库很慢而且很大,所以我自己编写。它只有很少的命令所以它叫做“SimpleSH1106”。


SH1106有一个内置缓冲区,每像素一位。它被安排为128列7个条带(其他尺寸可用)。每个样本高8像素,顶部有lsb。在SH1106文档中,swathes称为“pages”,但“swathe”是计算机图形学中的标准术语。您可以写入的最小单位是一个字节 - 从8像素边界开始的8像素列。


我的库在Arduino上没有屏幕缓冲区所以所有命令都基于将整个字节写入页面。它不太方便,但你获得1k的RAM。


Atmel328p内置I2C驱动程序连接到A4(SDA)和A5(SCL)引脚。 SDA和SCL需要上拉电阻;内置的I2C驱动程序使用Atmel328p弱上拉电阻约50kohm。 50k上拉电阻在低速下工作,但上升沿的速度不够快,因此我在Nano的3V3引脚上增加了1k的上拉电阻。


Arduino IDE有一个名为Wire.h的I2C驱动程序库。这是一个不错的小型快速库,但正如您对Arduino所期望的那样,文档记录很少。该库初始化I2C硬件以100kHz运行,但我想要更快。因此在调用Wire.begin()之后,我将Atmel328p TWBR寄存器设置为较小的值。


生成的库很快 - 示波器的扫描显示在40mS内绘制。可以使用以下命令:

void clearSH1106()用0字节(黑色)填充屏幕。

void DrawByteSH1106 绘制一个字节(一个8像素的列)。

int DrawImageSH1106 绘制图像。

int DrawCharSH1106 绘制一个角色。

int DrawStringSH1106 绘制一个字符串。

int DrawIntSH1106 绘制一个整数。

图像在程序存储器(PROGMEM)中声明。提供了一个Windows程序,用于将BMP文件转换为SimpleSH1106的游程编码图像。


库中给出了完整的描述。


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


有些显示器的引脚似乎有不同的顺序。检查它们。


我购买的0.9“显示器的像素的x坐标从x = 0到127运行。使用1.3”显示器它们是从x = 2到129.该库包含一个常量“colOffset”,允许您调整显示器的偏移量。


我已经为SM PCB附加了Gerber文件和EasyPC源文件。这些尚未经过测试,因此使用它们需要您自担风险。


步骤9:不同的屏幕

模拟显示屏显示带有刻度的波形。横轴表示时间im mS。纵轴表示伏特,虚线为4V,0.5V,0.1V和20mV;在DC模式下,0V位于底部;在AC模式下,0V在中间显示为虚线。


逻辑显示屏显示四个通道位。 D8是顶部通道,D11是底部通道。横轴表示以mS为单位的时间。


有两个按钮:一个用于调整时基轴的“水平”按钮和一个用于调整增益轴的“垂直”按钮。如果您按住任一按钮1秒钟,则会出现一个菜单屏幕。


当菜单显示时,“垂直”按钮会滚动浏览不同的设置,“水平”按钮会设置每个设置的值。 。如果您没有按任何一个按钮2秒钟,程序将返回显示波形。


步骤10:频率计数器

通过使用Timer1和Timer2,ArdOsc也可以充当频率计数器。频率计有两种工作方式:在一秒钟内计算上升沿的数量,或者测量从一个上升沿到下一个上升沿的时间。


再一次,值得吗?也许。我不记得我需要一个频率计数器的时间。为什么不这样做很容易?


为了计算D8“逻辑”信号的边沿,程序选择D5作为Timer1的时钟输入(16位计数器/定时器)。 D5外部连接到D8 - “逻辑”输入之一。 Timer0(一个8位定时器)设置为每毫秒溢出一次。每次Timer0溢出时,都会产生中断。 1000次中断后,Timer1中的计数显示为“频率”。如果Timer1计数超过65536,则会产生中断并记录此类中断的数量。


要测量从一个边沿到下一个AC信号的时间,定时器1被设置为空闲 - 运行16MHz计时器。 ICR1寄存器设置为在比较器变为高电平时捕获Timer1中的当前值。比较器的负输入连接到A3,正输入连接到D6。每次比较器变为高电平时,都会产生中断。一个中断和下一个中断之间的时间是周期(1/频率)。程序显示一秒钟内测量的平均频率。比较器意味着在上升沿触发,但没有杂音,因此如果有噪声,下降沿将被视为上升沿。这在低频时尤其重要,因此,例如,10Hz信号将被报告为20Hz。


同时,Timer2可能产生“测试信号”。因此没有定时器可用,我们不能使用正常的Arduino函数delay(),millis()等。


频率计数器的代码基于Nick Gammon的优秀网页。

如果您不想输入“频率计数器”,则不需要从D5到D8的连接。在INO文件中,将bool常量bHasFreq设置为false。


步骤11:电压表

示波器还可以作为电压表,可以测量大约-20V和+ 20V之间的电压。它使用Atmega328p的内置带隙电压参考,因此相当准确。


值得吗?功能的数量越来越荒谬。好的,为什么不呢?

在A6测量电压,ADC使用Vcc(即大约5V)作为参考。因为“5V”是近似值,我们还通过将其与1.1V带隙进行比较来测量Vcc的实际值。根据数据表,带隙仅为10%准确,但我尝试的几个接近1.1V。


要测量的输入电压通过电阻网络。我选择了上面显示的值

Ra = 120k

Rb = 150k

Rc = 470k

你会在MeasureVoltage()函数的开头附近找到这些常数。

Rc告诉你电压表的输入阻抗。与便宜的数字万用表相比,470k是低的,但是足够高,可以使用。


电压表可以测量的最低电压是

-5 * Rc/Ra = -19.6V

它可以测量的最高值是

5 * Rc/Rb + 5 = 20.7V

如果需要,可以选择不同的电阻。

如果超过这些电压怎么办?没事的。如果Arduino输入引脚上的电压高于Vcc或低于0V,保护二极管可以承受1mA电流。使用470k意味着理论上可以测试470V的电压。但是我不相信在470V的条形板绝缘,你不应该玩这样的电压和这种原油电路。


如果想要精确的测量,你需要校准电压表。将电压表输入“探头”连接到0V,看看电压表报告的内容。调整calibrateZero常数,直到电压表读数为“0.00V”。现在将电压表输入连接到已知电压源 - 如果你有一个不错的万用表,那么测量一个9V电池的电压。调整calibrateVolts常数直到电压表给出正确的答案。


如果您不想要“电压表”输入,那么您不需要连接到D6的电阻。在INO文件中,将bool常量bHasVoltmeter设置为false。


步骤12:测试引线

示波器通常具有花哨的测试引线。我通常使用无焊接面包板,所以我只是附加了一种用于面包板的插入式电线。由于示波器由5V供电,我将其连接到我在面包板上使用的任何5V和0V电源以及更多的插入式电线。


步骤13:添加信号发生器

信号发生器是一个非常有用的部分测试装备这个使用AD9833模块。我在这里描述了一个独立的版本;此步骤描述如何将一个添加到ArdOsc。 (此步骤是对此原始Instructable的编辑。)


AD9833可以生成0.1 MHz至12.5 MHz的正弦波,三角波和方波 - 本项目中的软件限制为1Hz至100kHz。它可以用作扫描发生器。扫频发生器有助于测试滤波器,放大器等的频率响应。


我选择的AD9833模块与此类似。我不是说这是最好或最便宜的供应商,但你应该买一张看起来像那张照片。


模块之间的连接是:

地面连接在一起

5V = AD9833的Vcc

D2 = FSync

D13 = Clk

D12 =数据

上面的示意图是步骤8中的原理图的补充。您可以使用另一块stripboard将另一层添加到步骤8中描述的三明治中。


我已在步骤中更新了INO文件8包括控制AD9833的代码。如果添加AD9833,则应将bHasSigGen变量设置为true(我将其保留为false,因为大多数人没有AD9833)。

新菜单控制AD9833。它允许您选择频率和波形以及是否扫描频率。


扫描发生器在1,5或20秒内反复输

[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