大连林海 发表于 2015-12-3 08:26:54

基于arduino的示波器

基于arduino的示波器


原地址 http://www.arduino.cn/thread-3703-1-1.html

基于Arduino的数字示波器


http://www.arduino.cn/data/attachment/forum/201308/18/151833ahsiglkrtpqg8q0d.jpg   
       http://www.arduino.cn/data/attachment/forum/201308/18/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 下载:
下面是我先用Arduino UNO搭建的试验电路,LCD使用ST7920控制的12864液晶屏。
       http://www.arduino.cn/data/attachment/forum/201308/18/115227wsvnnqp9qd892tb3.jpg

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


#include <U8glib.h> //声明库
U8GLIB_ST7920_128X64_4X u8g(13, 12, 11); // 声明液晶屏 SPI Com: SCK =13, MOSI = 12, CS =11
int x,y; //绘点坐标
int Buffer; //缓存值储存数组
void setup( ) {}
//采样
void sample( )
{
for(x = 0;x < 128;x++)
   Buffer = analogRead(A0);//信号采样
for(x = 0;x < 128;x++)
   Buffer = 63-(Buffer>>4); //计算纵坐标值
}
//显示
void draw( )
{
for(x = 0;x < 127;x++)
   u8g.drawLine(x,Buffer,x,Buffer);//画相邻两点连线
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();//清屏
   dodraw( );      //显示
   while( u8g.nextPage( ));
}
显示效果:

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

三、最新程序
         下面是最新的源代码,使用时请保留我的开机LOGO,呵呵。




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

   电路图:

http://www.arduino.cn/data/attachment/forum/201308/18/201131tfr1334o63uof7hc.jpg主要元器件清单:      
      名称                                                            数量
       Arduino PRO mini                                        1
      LCD12864液晶屏(ST7920)                     1
      电解电容器(100μ 25V)                              1               
      电位器(50k)                                             1
      洞洞板                                                         2
      按钮开关                                                       3
      电源开关                                                       1
      电池盒(配7号充电电池)                            1
      机壳                                                            1

      1、焊接Arduino PROmini 插针。

http://www.arduino.cn/data/attachment/forum/201308/18/152111yef1pesozfzasfw1.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/152112raj4zj47ajyxx3hh.jpg

2、 焊接电路板元件

http://www.arduino.cn/data/attachment/forum/201308/18/153400t7wryzul0n2ft31l.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/153359gplpglsaiv2v2p3s.jpg

3、制作LCD洞洞板

http://www.arduino.cn/data/attachment/forum/201308/18/155051mllxz2ackeixztet.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/155052xtmacbxb4ffvkfhu.jpg

4、组装电路板

http://www.arduino.cn/data/attachment/forum/201308/18/155429tc5yuc8zctxex0g4.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/155428jxruv8p9xzvvv3v3.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/155427om4nox4y4b1lyai3.jpg

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

http://www.arduino.cn/data/attachment/forum/201308/18/155253qqonqfxsf4ftnsta.jpg

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

http://www.arduino.cn/data/attachment/forum/201308/18/155839blnhur9w4w2dvddm.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/155730c6a6dcno022688na.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/155730aq5tg5ll5wzz5r62.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/155821iotdtenmttrotdoo.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/155731l44mplj4yjpooj7a.jpg

http://www.arduino.cn/data/attachment/forum/201308/18/155729gz4zardpgzraa2xp.jpg


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

   http://www.arduino.cn/data/attachment/forum/201308/18/161937oh8lls1sks2l0lsl.jpg

   开机LOGO

http://www.arduino.cn/data/attachment/forum/201308/19/205213jrm290f248jqrmmq.jpg
      
   测试图:

http://www.arduino.cn/data/attachment/forum/201308/18/162040tovvtdgv87vfqx7g.jpg


六、测试视频

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

http://v.youku.com/v_show/id_XNTk3Mjc2MjQw.html



七、几点说明

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

dsweiliang 发表于 2015-12-3 09:36:49

精度够不够噶?

丄帝De咗臂 发表于 2015-12-3 09:42:47

现在开始关注这个啦

大连林海 发表于 2015-12-3 09:51:03

dsweiliang 发表于 2015-12-3 09:36
精度够不够噶?

俺不知道 不太清楚啊

大连林海 发表于 2015-12-3 09:51:16

丄帝De咗臂 发表于 2015-12-3 09:42
现在开始关注这个啦

看着这个不错 要是有器材也想试试看

孙毅 发表于 2015-12-3 15:35:04

牛! 你赶紧做个简单的手持示波器出来,可以卖了。吼吼

大连林海 发表于 2015-12-3 15:37:59

孙毅 发表于 2015-12-3 15:35
牛! 你赶紧做个简单的手持示波器出来,可以卖了。吼吼

你来 你来 这个照着做不就可以了吗 大圣明天我们放假 吼吼

孙毅 发表于 2015-12-3 15:42:59

大连林海 发表于 2015-12-3 15:37
你来 你来 这个照着做不就可以了吗 大圣明天我们放假 吼吼

为毛放假?真幸福!

大连林海 发表于 2015-12-3 18:02:31

孙毅 发表于 2015-12-3 15:42
为毛放假?真幸福!

停水一天····················

15071446702 发表于 2017-4-21 09:56:32

为什么编译程序时,提示出错

20060606 发表于 2020-8-14 05:25:50

感谢分享u8g库
页: [1]
查看完整版本: 基于arduino的示波器