新聞中心

        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)))
          ;



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 芮城县| 新民市| 外汇| 广汉市| 象州县| 同江市| 凤翔县| 介休市| 池州市| 年辖:市辖区| 扶风县| 胶南市| 石河子市| 南京市| 江安县| 和硕县| 云龙县| 当雄县| 玉溪市| 桂平市| 瑞昌市| 南汇区| 三都| 武鸣县| 颍上县| 临泉县| 清原| 汝城县| 沽源县| 武胜县| 凌源市| 丽江市| 锡林浩特市| 原平市| 梅州市| 临泽县| 辽中县| 将乐县| 桂林市| 德格县| 鹤庆县|