基于Arduino的数字示波器

单片机相关 徐 自远 736℃

基于Arduino的数字示波器

联邦小学僧 2018-11-07 21:18:04

一、概述

经常在网上 看到有人制作数字示波器,数字示波器必须有数模转换单元,根据数模转换方式可以将电路分为两种模式:1.专用ADC芯片+单片机,2.利用单片机内部的ADC作数模转换。对于第一种模式我也做过两种(见我的博客: http://blog.sina.com.cn/ntwhq ),这种模式电路要复杂一点,元器件也较难配齐,对初学者来说比较困难。第二种结构比较简单,容易制作,但有一个明显的缺点,就是带宽比较窄,其中一个比较典型的作品是国外网友制作的:http://www.serasidis.gr/circuits/AVR_oscilloscope/avr_oscilloscope.htm ,这个示波器的带宽只有7.7KHz。国内也有网友用AVR和STC单片机制作的,但实际带宽均不超过10KHz。

最近看到有网友用Arduino做示波器,这可以说比上面的第二种方式还要简单,但观察其制作的效果却不理想,带宽很窄。因此我也想试一下,看看又没有好的方法来解决这一问题。通过实验制作,不断修改代码,提高数模转换的取样率,取得了很好的效果。

最终作品的主要参数

频率响应: 10Hz-50KHz

电 源: 5V

LCD液晶屏: 128×64(ST7920)

测量显示区:96×64

信息显示区:32×64,显示测试信号的频率、Vpp等内容

同步方式:上升沿触发

扫描速度:0.02ms/div~10ms/div,按1-2-5进位分九档

Hold功能:冻结显示波形和参数

二、基础试验

使用Arduino 做项目的最大优势就是其丰富的资源,同时也不需要了解太多单片机的知识。我下面的制作就利用了一个LCD的资源库u8glib,使得编程变得简单多了,不然LCD的驱动会花费你好多时间。

下面是我先用Arduino UNO搭建的试验电路,LCD使用ST7920控制的12864液晶屏。

只要输入法下列代码,编译下载后就能实现数字示波器的基本功能了,是不是很简单?

#include <U8glib.h> //声明库

U8GLIB_ST7920_128X64_4X u8g(13, 12, 11); // 声明液晶屏 SPI Com: SCK =13, MOSI = 12, CS = 11

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( ));

}

显示效果:

利用这个试验电路,我测量了Arduino 直接使用analogRead() 函数完成一次数模转换的时间约为111微秒,转换速度很慢,因此其带宽只有1KHz多点, 接下来的首要任务就是提高数模转换速度,同时增加其它功能。

三、最新程序

上述程序ADC使用片内1.1V基准电压,如果要使用片外5V基准电压,应将程序中

ADMUX=0xe0; 改为:ADMUX=0x60;

Vpp=(V_max-V_min)*1.1/255;改为: Vpp=(V_max-V_min)*5/255;

四、整机制作

上面做试验用的是Arduino UNO,实际制作时使用Arduino PRO mini,这样才能有小体积。

电路图:

主要元器件清单:

名称 数量

Arduino PRO mini 1

LCD12864液晶屏(ST7920) 1

电解电容器(100μ 25V) 1

电位器(50k) 1

洞洞板 2

按钮开关 3

电源开关 1

电池盒(配7号充电电池) 1

机壳 1

1、焊接Arduino PRO mini 插针。

2、 焊接电路板元件

3、制作LCD洞洞板

4、组装电路板

5、制作机壳

我用了一个充电宝的塑料包装盒改制机壳,在相应的地方打上孔。

6、总装

将电路板装入机壳,用厚点的白纸做一个面板,贴在前面板内侧。

五、程序下载与测试

由于 Arduino PRO mini 不自带USB转串口的电路,所以要通过一根USB转串口的下载线才能下载程序。

示波器的调试很简单,只要调节50k电位器使水平扫描线居中即可。

我用一台信号发生器作信号源。

开机LOGO

测试图:

这是一个最简单的数字示波器,可以在此基础上进一步完善;

 

基于Arduino的数字示波器http://t.jinritoutiao.js.cn/Rmmen2/

转载请注明:徐自远的乱七八糟小站 » 基于Arduino的数字示波器

喜欢 (0)

苏ICP备18041234号-1 bei_an 苏公网安备 32021402001397号