查看: 231723|回复: 428
打印 上一主题 下一主题

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

? [复制链接]
  • TA的每日心情
    郁闷
    2019-5-25 14:52
  • 签到天数: 169 天

    [LV.7]常住居民III

    跳转到指定楼层
    楼主
    发表于 2013-8-18 16:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 ntwhq 于 2016-8-17 07:58 编辑

    ??
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? ? ?基于Arduino的数字示波器

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

    ? ?? ?? ?

    ? ?? ?? ?? ?? ?? ???

    一、概述

    ? ?? ? 经常在网上 看到有人制作数字示波器,数字示波器必须有数模转换单元,根据数模转换方式可以将电路分为两种模式: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 下载: u8glib_arduino_v1.13.zip (989.55 KB, 下载次数: 4017) ? ?
    ? ?? ? 下面是我先用Arduino UNO搭建的试验电路,LCD使用ST7920控制的12864液晶屏。
    ? ?? ?

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

    kittenblock中小学创客名师推荐的图形化编程软件

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


    显示效果:

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

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

    ? ?? ?? ?上述程序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


    ? ?? ?
    ? ?测试图:





    六、测试视频

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



    七、几点说明

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



































    评分

    参与人数 1贡献 +1 收起 理由
    coloz + 1 赞一个!

    查看全部评分

    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2016-7-2 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    推荐
    发表于 2016-7-2 15:09 | 只看该作者
    这是我看的最认真的一个帖子,虽然我有很多不懂,也仿制了一个,相当NB,看见楼主这么认真而详细的回答,很佩服楼主,中国现在需要这样的人才。
  • TA的每日心情
    郁闷
    2015-3-9 00:09
  • 签到天数: 2 天

    [LV.1]初来乍到

    推荐
    发表于 2015-3-9 00:41 | 只看该作者
    code_asf 发表于 2013-8-19 09:49
    相当NB,打算山寨一个

    同感,同感
    不过,我想用intel 的galileo做,是不是2代伽利略采样能高很多啊/
  • TA的每日心情
    开心
    2017-5-18 22:11
  • 签到天数: 364 天

    [LV.8]以坛为家I

    推荐
    发表于 2014-6-12 21:52 | 只看该作者
    " 2、大家可能注意到我没有使用 I/O端口0-7,这正好是AVR单片机的一个8位并口,这是我为后续升级准备的,在使用专用ADC芯片的时候它可以作为数据输入,如果大家对这个示波器感兴趣,以后我会考虑升级;"出升级版本的啦,这个简易的M数太小了哦。

    该用户从未签到

    沙发
    发表于 2013-8-18 17:44 | 只看该作者
    果然高端大气上档次,显示屏还有更好的么,那就帅呆了
  • TA的每日心情
    奋斗
    2019-7-12 18:42
  • 签到天数: 48 天

    [LV.5]常住居民I

    板凳
    发表于 2013-8-18 17:45 | 只看该作者
    可以考虑用arduino due,芯片的采样率可以1M
    如果你觉得以上内容帮到了你,你可以打赏支持作者
  • TA的每日心情
    郁闷
    2019-5-25 14:52
  • 签到天数: 169 天

    [LV.7]常住居民III

    地板
    ?楼主| 发表于 2013-8-18 19:37 | 只看该作者
    小小弧 发表于 2013-8-18 17:44
    果然高端大气上档次,显示屏还有更好的么,那就帅呆了

    谢谢关注,再好就用TFT屏了,但u8glib库不支持,得另外找库或自己写驱动。
    打赏作者鼓励一下!
  • TA的每日心情
    郁闷
    2019-5-25 14:52
  • 签到天数: 169 天

    [LV.7]常住居民III

    5#
    ?楼主| 发表于 2013-8-18 19:41 | 只看该作者
    本帖最后由 ntwhq 于 2013-8-22 21:55 编辑
    coloz 发表于 2013-8-18 17:45
    可以考虑用arduino due,芯片的采样率可以1M

    ? ???谢谢加精和关注,arduino due太贵了,我这个arduino PRO mini经优化编程后采样率也达到400K了,要达到更高的采样率就要考虑采用片外ADC了.
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2015-9-22 09:46
  • 签到天数: 272 天

    [LV.8]以坛为家I

    6#
    发表于 2013-8-18 22:28 | 只看该作者
    高端大气上档次
  • TA的每日心情
    郁闷
    2019-5-25 14:52
  • 签到天数: 169 天

    [LV.7]常住居民III

    7#
    ?楼主| 发表于 2013-8-19 07:55 | 只看该作者
    袁培根 发表于 2013-8-18 22:28
    高端大气上档次

    谢谢鼓励!
    打赏作者鼓励一下!
  • TA的每日心情
    慵懒
    2019-4-17 21:21
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    8#
    发表于 2013-8-19 09:36 | 只看该作者
    很不错,但是输入阻抗偏小了,最好加运放跟随下,以及没有电压衰减,加两个电阻分压下就不错了。


    然后程序上丰满下,加上偏移的电路。

    该用户从未签到

    9#
    发表于 2013-8-19 09:49 | 只看该作者
    相当NB,打算山寨一个
  • TA的每日心情
    郁闷
    2019-5-25 14:52
  • 签到天数: 169 天

    [LV.7]常住居民III

    10#
    ?楼主| 发表于 2013-8-19 20:39 | 只看该作者
    珜羽 发表于 2013-8-19 09:36
    很不错,但是输入阻抗偏小了,最好加运放跟随下,以及没有电压衰减,加两个电阻分压下就不错了。

    ? ?? ?您的建议很好,我这次就是想尽量做得简单点,可以根据需要再加入输入电路。5V的电压用运放效果不是太好,用升压电路又复杂了,可以考虑在输入级用场效果管作跟随器。
    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册 ?

    本版积分规则

    热门推荐

    关于温湿度传感器在LCD显示上的问题
    关于温湿度传感器在LCD显
    我建立了一个程序,想要将dht11传感器得到的数据显示在LCD1602上,但是LCD显的都是乱
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    【Arduino】108种传感器模块系列实验(74)--- 4位LED数码管模块
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    (开源)ESP8266改装小风扇,app远程控制+天猫精灵控制
    (开源)ESP8266改装小风
    材料准备 [*]USB风扇一个 [*]ESP8266一块 [*]3.3继电器一块 拆解风扇 第一次,没有
    基于机器视觉的智能分拣机械臂
    基于机器视觉的智能分拣机
    本作品是一个基于机器视觉的智能机械臂操作平台,其采用atmega32单片机作为主控制系统
    Copyright ???2015-2016??Arduino中文社区??Powered by?Discuz! ??( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表