查看: 232450|回復: 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, 下載次數: 4028)    
           下面是我先用Arduino UNO搭建的試驗電路,LCD使用ST7920控制的12864液晶屏。
          

    只要輸入法下列代碼,編譯下載后就能實現數字示波器的基本功能了,是不是很簡單?

    kittenblock中小學創客名師推薦的圖形化編程軟件

    #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.zip (2.72 KB, 下載次數: 4666)         

             上述程序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的電壓用運放效果不是太好,用升壓電路又復雜了,可以考慮在輸入級用場效果管作跟隨器。
    打賞作者鼓勵一下!
    您需要登錄后才可以回帖 登錄 | 立即注冊  

    本版積分規則

    熱門推薦

    arduino實現L298N控制工業步進電機
    arduino實現L298N控制工業
    求助 L298N是ST公司生產的一種高電壓、大電流電機驅動芯片。該芯片采用15腳封裝。主
    arduino IDE錯誤,有點崩潰了,要搞作業!
    arduino IDE錯誤,有點崩
    無論編譯什么程序文件都是這個錯誤!程序自帶例程,最簡單的點亮led燈也是 這個 問題
    【項目】基于Arduino Nano的多功能桌面感應垃圾桶
    【項目】基于Arduino Nano
    基于Arduino Nano的多功能桌面感應垃圾桶隨著大學生活不斷往前邁進,宿舍桌面上的雜物
    在芯間投資成立的零知實驗室發布國內的STM32開源開發板
    在芯間投資成立的零知實驗
    在芯間電子元器件商城成立于2016年,是集電子元器件采購、SMT貼片、PCB打樣、于一
    【原創】全球最小口袋3D打印機mini one直播教程貼
    【原創】全球最小口袋3D打
    最近閑得蛋疼,沒事搞個掌上3D打印機,先放效果圖吧。 搞了半天,終于能正常打印,
    Copyright   ©2015-2016  Arduino中文社區  Powered by©Discuz!   ( 蜀ICP備14017632號-3 )
    快速回復 返回頂部 返回列表
    美娱娱乐登录网址