QQ登录

只需一步,快速开始

创客帮-青少年创客创意社区

快捷导航
开启左侧

牛叉的基于Arduino的数字示波器

[复制链接]
老哈 发表于 2016-11-22 19:38:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x


(注:本作品在我写的新书《玩转Arduino电子制作》中有更详细的介绍)

151833ahsiglkrtpqg8q0d.jpg           201148hn1z6oy992911fky.jpg

                    

一、概述

       经常在网上 看到有人制作数字示波器,数字示波器必须有数模转换单元,根据数模转换方式可以将电路分为两种模式: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液晶屏: 128x64(ST7920)
     测量显示区:96x64
     信息显示区:32x64,显示测试信号的频率、Vpp等内容
     同步方式:上升沿触发
        扫描速度:0.02ms/div~10ms/div,按1-2-5进位分九档
        Hold功能:冻结显示波形和参数

二、基础试验

      使用Arduino 做项目的最大优势就是其丰富的资源,同时也不需要了解太多单片机的知识。我下面的制作就利用了一个LCD的资源库u8glib,使得编程变得简单多了,不然LCD的驱动会花费你好多时间。
      u8glib 下载: zip.gif u8glib_arduino_v1.13.zip(989.55 KB, 下载次数: 2758)   
       下面是我先用Arduino UNO搭建的试验电路,LCD使用ST7920控制的12864液晶屏。
       115227wsvnnqp9qd892tb3.jpg

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

[C] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include  //声明库
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( ));
}






显示效果:

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

三、最新程序
         下面是最新的源代码,使用时请保留我的开机LOGO,呵呵。
         Arduino_oscilloscope.zip(2.72 KB, 下载次数: 2952)        

         上述程序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,这样才能有小体积。

        电路图:

201131tfr1334o63uof7hc.jpg

       主要元器件清单:        
        名称                                                            数量
       Arduino PRO mini                                        1
        LCD12864液晶屏(ST7920)                       1
        电解电容器(100μ 25V)                              1               
        电位器(50k)                                             1
        洞洞板                                                           2
        按钮开关                                                       3
        电源开关                                                       1
        电池盒(配7号充电电池)                            1
        机壳                                                              1

      1、焊接Arduino PRO  mini 插针。

152111yef1pesozfzasfw1.jpg

152112raj4zj47ajyxx3hh.jpg

2、 焊接电路板元件

153400t7wryzul0n2ft31l.jpg

153359gplpglsaiv2v2p3s.jpg

3、制作LCD洞洞板

155051mllxz2ackeixztet.jpg

155052xtmacbxb4ffvkfhu.jpg

4、组装电路板

155429tc5yuc8zctxex0g4.jpg

155428jxruv8p9xzvvv3v3.jpg

155427om4nox4y4b1lyai3.jpg

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

155253qqonqfxsf4ftnsta.jpg

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

155839blnhur9w4w2dvddm.jpg

155730c6a6dcno022688na.jpg

155730aq5tg5ll5wzz5r62.jpg

155821iotdtenmttrotdoo.jpg

155731l44mplj4yjpooj7a.jpg

155729gz4zardpgzraa2xp.jpg


五、程序下载与测试
        
      由于 Arduino PRO mini 不自带USB转串口的电路,所以要通过一根USB转串口的下载线才能下载程序。
      示波器的调试很简单,只要调节50k电位器使水平扫描线居中即可。
      我用一台信号发生器作信号源。

   161937oh8lls1sks2l0lsl.jpg

   开机LOGO

205213jrm290f248jqrmmq.jpg
      
   测试图:

162040tovvtdgv87vfqx7g.jpg

162041uvvaqvbc34y8b3iq.jpg

六、测试视频

       测试过程中在调节信号源的频率输出方法,调节示波器的扫描速度按键和Hold按键。



七、几点说明

        1、这是一个最简单的数字示波器,可以在此基础上进一步完善;
        2、大家可能注意到我没有使用 I/O端口0-7,这正好是AVR单片机的一个8位并口,这是我为后续升级准备的,在使用专用ADC芯片的时候它可以作为数据输入,如果大家对这个示波器感兴趣,以后我会考虑升级;
       3、作品完成得比较仓促,有什么缺陷和不足的地方,请大家指教,你制作中有什么问题也可以在这里交流。
       谢谢大家!
好心情
您需要登录后才可以回帖 登录 | 注册

本版积分规则

客服热线
400-1234-888 周一至周日:09:00 - 21:00
公司地址:襄阳市樊城区长虹路现代城5号楼188

创客帮MAKER.BAND青少年创客创意社区是一个融教育、科技、体育资讯为一体的综合服务平台,专注于教育创新、专注于科技体育、专注于教育资讯。

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表