分享

NO.22 基于Arduino的数字示波器(完成)

 lhktija 2014-10-10
基于Arduino的数字示波器


         

                    

一、概述

       经常在网上 看到有人制作数字示波器,数字示波器必须有数模转换单元,根据数模转换方式可以将电路分为两种模式:1.专用ADC芯片+单片机,2.利用单片机内部的ADC作数模转换。对于第一种模式我也做过两种(见我的博客: http://blog.sina.com.cn/ntwhq ),这种模式电路要复杂一点,元器件也较难配齐,对初学者来说比较困难。第二种结构比较简单,容易制作,但有一个明显的缺点,就是带宽比较窄,其中一个比较典型的作品是国外网友制作的:http://www./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 下载: u8glib_arduino_v1.13.zip (989.55 KB, 下载次数: 858)    
       下面是我先用Arduino UNO搭建的试验电路,LCD使用ST7920控制的12864液晶屏。
      

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

[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.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多点, 接下来的首要任务就是提高数模转换速度,同时增加其它功能。

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

四、整机制作

       上面做试验用的是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


      
   测试图:





六、测试视频

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



七、几点说明

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多