Arduino数字示波器(二)
Arduino数字示波器(二)
一、背景
前面用Arduino结合processing制作了最简单的示波器。那个示波器实际还能完善和提升。
让Arduino离开电脑串口,自带屏幕制作成示波器,也就是稍实用且极简单能实际制作的,在网上搜索一下,至少能见到四、五种方案。这里选择的是很早期的一种方案,稍稍做了一点点改动。
这个方案在Arduino中国等网站上都有发布,署名仲敬、江苏吴汉清,但转载和修改过多,已难找出原作,不再列出链接地址。
二、元件列表
Arduino UNOX1,LCD12864(ST7920主控)X1,电位器X1,面包板、杜邦线等
三、接线图
这个接线图的原始版本,在ArduinoCN上,信号输入上有个100微法隔直电容器,这里去掉了。
另外在8、9、10号脚上有Hold、div调节,图中去掉了。LCD12864的3号脚可以通过另一电位器调节背光,一并去掉。
A0脚提前用电位器拉高电平,有点儿“钳位”的意思,如果去掉了,会因为输入信号与Arduino不共地,噪声和杂波的影响无法去除而不能测量。
这个电路,只能测正电压,若测负电压,可以接ADS115,12864就要把一些脚让出来。
四、代码
#include <U8glib.h> //U8glib库
U8GLIB_ST7920_128X64_4X u8g(13, 12, 11); //SPI接线
int x, y;
int Buffer[128];
void setup( ) { }
void sample( ) //采样
{
for (x = 0; x < 128; x++)
Buffer[x] = analogRead(A0);
for (x = 0; x < 128; x++)
Buffer[x] = 63 - (Buffer[x] >> 4); //计算纵坐标值
}
void draw( )
{
for (x = 0; x < 127; x++)
u8g.drawLine(x, Buffer[x], x, Buffer[x + 1]);
u8g.drawLine(64, 0, 64, 63); // 画坐标轴
u8g.drawLine(0, 32, 128, 32);
for (x = 0; x < 128; x += 8) //画刻度
u8g.drawLine(x, 31, x, 33);
for (x = 0; x < 64; x += 8)
u8g.drawLine(63, x, 65, x);
u8g.drawFrame(0, 0, 128, 64); //画边框
}
void loop( )
{
sample(); //采样
u8g.firstPage(); //清屏
do draw( ); //显示
while ( u8g.nextPage( ));
}
五、实测
测干电池两端稳恒电压:万用表测量1.18V,Arduino示波器5V分成8行,每行0.625V,测量结果一致。
测杂波信号,把A0前方的电位器VCC和GND断开: