新聞中心

        EEPW首頁 > 測試測量 > 設計應用 > 利用雙通道示波器展示傳輸線行為的方法

        利用雙通道示波器展示傳輸線行為的方法

        ——
        作者:BobHaas 時間:2014-06-26 來源:電子產品世界 收藏
        編者按:摘要:本文采用創新方法,通過雙通道示波器測量出傳輸線上的駐波,從而利用受控的移動圖像展現信號在傳輸線中的真實情況。

          2 直接數字合成

        本文引用地址:http://www.104case.com/article/248900.htm

          為獲得穩定的顯示,就必須產生準確的頻率。這里的“穩定”表示節點的水平位置或者圖案的最大或最小位置在屏幕上不移動。一種實現辦法,采用具有數控振蕩器(NCO)2的DDS。NCO采用一個16位計數器,稱之為相位累加器,來實現。FCLOCK(圖5)為一個固定的時鐘頻率遞增量,Fcw為調制量或頻率控制量。FCLOCK遠遠高于波形頻率。

          將相位累加器的高8位的值和正弦查找表(LUT)對應,然后將查找值發送至DAC。相位累加器中的值可認為對應的是一個圓上的某一個點;調制量定義為繞圓周的“步長”。調制量越大,繞圓周旋轉的越快,因此輸出的頻率也越高。產生的頻率由下式給出:

          FOUT = FCW × FCLOCK/216

          輸出頻率與FCW成正比。本例中,FCLOCK為31.25kHz。FCW值采用841、839和837,計算得到三個頻率為:

          F1=841×31250/65536= 401.02Hz
          F2=839×31250/65536= 400.06Hz
          F3=837×31250/65536= 399.11Hz

          這里的頻率表示采用保留兩位小數,但實際上(F1 – F2和(F2 – F3)是完全相等的。頻率差精確到9位小數時為0.953674316Hz。

          3 實現

          本演示使用® MAX5715 4通道12位數/模轉換器(DAC)的三個通道來實現,由® Uno板上的Atmel® 處理器驅動。是一個開放的軟硬件平臺,對于基于系統開發環境,非常方便。 DAC通過SPI(串行外設接口)很容易和相連,硬件支持SPI接口,Arduino軟件庫自帶SPI驅動。運行Arduino 庫中的SPI程序初始化AVR SPI硬件。也提供現存的SPI數據傳輸的程序,但速度太慢,未使用。

          三個相位累加器采用16的位計數器,計數器遞增是通過一個中斷程序來實現,中斷程序由處理器中的一個定時器來觸發。每32µs (1/31.25kHz)中斷一次。利用LUT將兩個相位累加器值(生成F1和F3)轉換為正弦值并然后送給DAC的兩個通道。將第三個相位累加器(生成F2)的兩個最高有效位發送至第三個DAC通道,產生一個4節拍的觸發信號。通過改變觸發電平,可選擇想要的相位去進行開路或短路端接仿真。

          Arduino SPI庫中的數據傳輸程序太慢,導致中斷程序的運行時間超過了中斷周期。因此,改用直接寫至AVR SPI硬件的代碼。

          中斷程序代碼:

          //******************************************************************
          // Timer2 Interrupt Service at 31372.550 Hz = 32uSec
          // this is the timebase REFCLOCK for the DDS generator
          // FOUT = (M (REFCLK)) / (2 exp 32)
          ISR(TIMER2_OVF_vect) {
          // set the SS line low
          PORTB &= (0xFF ^ 4);
          // send in the address and value via SPI:
          SPDR = CODEA;
          // update phase accumulators while waiting
          phaccu_a += tword_a;
          phaccu_b += tword_b;
          phaccu_c += tword_c;
          while (!(SPSR & _BV(SPIF)))
          ;
          // do the table lookup based on accum 'a' high-order byte
          SPDR = pgm_read_byte_near(sine256 + highByte(phaccu_a));
          while (!(SPSR & _BV(SPIF)))
          ;
          SPDR = 0;
          while (!(SPSR & _BV(SPIF)))
          ;
          // set the SS line high
          PORTB |= 4;
          // set the sS line low for the second SPI transfer
          PORTB &= (0xFF ^ 4);
          // do the second SPI transfer
          //SPDR = CODEB_LOADALL;
          SPDR = CODEB;
          while (!(SPSR & _BV(SPIF)))
          ;
          // do table lookup based on accum 'b'
          SPDR = pgm_read_byte_near(sine256 + highByte(phaccu_b));
          while (!(SPSR & _BV(SPIF)))
          ;
          SPDR = 0;
          while (!(SPSR & _BV(SPIF)))
          ;



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 甘南县| 客服| 新丰县| 靖江市| 巴楚县| 张家港市| 区。| 阿尔山市| 墨竹工卡县| 玛沁县| 无棣县| 醴陵市| 陇西县| 岚皋县| 祁连县| 马公市| 女性| 玉环县| 宿松县| 石家庄市| 穆棱市| 城市| 浦北县| 老河口市| 平顺县| 红原县| 永兴县| 平定县| 剑河县| 安阳市| 清水河县| 读书| 青田县| 嵩明县| 延庆县| 曲松县| 乌兰浩特市| 江口县| 文水县| 濉溪县| 铜鼓县|