1. gzyueqian
      18529173453
      首頁 > 新聞中心 > > 正文

      微控制器無需CPU即可生成同步正弦波與余弦波

      更新時間: 2007-02-17 17:24:08來源: 粵嵌教育瀏覽量:592

        
        嵌入式系統(tǒng)通常需要數(shù)模轉(zhuǎn)換器 (DAC) 生成模擬電壓與波形。DAC 有時用作嵌入式處理器的外置器件,有時集成至處理器中。無論哪種情況,CPU 都必須在適當(dāng)時間將預(yù)期輸出值寫入 DAC。一般情況下我們采用定時器中斷 CPU寫入預(yù)期值來實現(xiàn)上述目的。如果 DAC 必須生成周期波形,CPU須從表格寫入下一個值,遞增數(shù)據(jù)表指針 (table pointer),并且檢查表格邊界,以便確定何時復(fù)位數(shù)據(jù)表指針。

        將周期值寫入 DAC 的過程要求 CPU 開銷保持輸出波形。所需要的 CPU 開銷取決于數(shù)據(jù)表的長度、輸出波形的頻率以及 CPU 的工作頻率。例如,為了每個周期采用 32 個數(shù)據(jù)點生成 1 個 1kHz 的正弦波,在 CPU 頻率為 1MHz 情況下要求 CPU 每秒能夠處理 32000 個中斷信號。處理如此多的中斷僅在中斷之間留下 1000000 / 32000 = 31.25 個 CPU 指令周期。針對上下文切換與執(zhí)行,如果每個中斷服務(wù)只需要 15 個 CPU 周期,所需 CPU 開銷就會達(dá)到近 50%。

        如果應(yīng)用要求第二個模擬輸出波形,那么 CPU 負(fù)載將會增大,甚至在所需的中斷服務(wù)時間內(nèi)不能更新兩個 DAC。 MSP430F15x/16x 器件是解決該問題的良好方案。這些器件集成了兩個 DAC 與 1 個 DMA 控制器。DMA 控制器的用途是在無需 CPU 干預(yù)情況下將數(shù)據(jù)從一個位置轉(zhuǎn)移到另一個位置。在本例中,DMA 能夠在規(guī)定時間內(nèi)將數(shù)據(jù)從數(shù)據(jù)表轉(zhuǎn)移到 2 個 DAC。數(shù)據(jù)轉(zhuǎn)移結(jié)構(gòu)圖如下所示。

        DMA 控制器具有三條獨立的通道。每條通道在配置后都可以用于將數(shù)值在任何地址之間進(jìn)行轉(zhuǎn)移。因此,一個數(shù)據(jù)表可以同時用于正弦波與余弦波,而兩條 DMA 通道只需存取數(shù)據(jù)表的不同部分,以便形成正弦與余弦輸出。

        此外,每條 DMA 通道都可以獨立遞增其源地址或目的地址。本例中,每條 DMA通道編程后遞增其源地址,但目的地址不變,始終為其對應(yīng)的 DAC 數(shù)據(jù)寄存器。

        DMA 傳輸次數(shù)也可以配置。在每條 DMA 通道傳輸完已編程數(shù)據(jù)值數(shù)量之后,即可以從初編程的源地址開始進(jìn)行下一次傳輸,從而使每條 DMA 通道都構(gòu)成一個帶數(shù)據(jù)表的環(huán)形緩沖區(qū)并生成周期波形。

        為移動數(shù)據(jù)值,每條 DMA 通道都需要一個觸發(fā)器。本例中,來自每個 DAC 的中斷標(biāo)記用作其相應(yīng) DMA 通道的觸發(fā)器。如果 2 條通道同時觸發(fā),則需要對DMA 通道進(jìn)行優(yōu)先排序,這樣一來,會在其中一個接收數(shù)據(jù)的 DAC 中造成延遲,進(jìn)而造成輸出信號失真,因此應(yīng)單獨處理 DAC 更新。

        這些器件中的每個 DAC 都能通過定時器觸發(fā),這樣在需要下一個 DAC 數(shù)據(jù)值之前就可以將其加載到 DAC 數(shù)據(jù)寄存器中,當(dāng)定時器觸發(fā) DAC 時,每個 DAC均能輸出新的值。本例中設(shè)置由 Timer_A1 輸出信號觸發(fā)每個 DAC。由于 2 個 DAC 采用相同的觸發(fā)信號,因此每個 DAC 的輸出波形相互同步,以便保持相應(yīng)的正弦/余弦關(guān)系。

        下面列出完整代碼以及 2 個輸出波形的示波器畫面。

      ------------------------------------------------------------------------- #define FS_Val 4095


      static int Sin_tab[40] = {
      0.500*FS_Val,
      0.598*FS_Val,
      0.691*FS_Val,
      0.778*FS_Val,
      0.854*FS_Val,
      0.916*FS_Val,
      0.962*FS_Val,
      0.990*FS_Val,
      1.000*FS_Val,
      0.990*FS_Val,
      0.962*FS_Val,
      0.916*FS_Val,
      0.854*FS_Val,
      0.778*FS_Val,
      0.691*FS_Val,
      0.598*FS_Val,
      0.500*FS_Val,
      0.402*FS_Val,
      0.309*FS_Val,
      0.222*FS_Val,
      0.146*FS_Val,
      0.084*FS_Val,
      0.038*FS_Val,
      0.010*FS_Val,
      0.000*FS_Val,
      0.010*FS_Val,
      0.038*FS_Val,
      0.084*FS_Val,
      0.146*FS_Val,
      0.222*FS_Val,
      0.309*FS_Val,
      0.402*FS_Val,
      0.500*FS_Val,
      0.598*FS_Val,
      0.691*FS_Val,
      0.778*FS_Val,
      0.854*FS_Val,
      0.916*FS_Val,
      0.962*FS_Val,
      0.990*FS_Val
      };

      void main(void)
      {
      WDTCTL = WDTPW + WDTHOLD; // Stop WDT
      ADC12CTL0 = REF2_5V + REFON; // Internal 2.5V ref

      //Setup DMA triggers for both DMA channels
      DMACTL0 = DMA0TSEL_5 + DMA1TSEL_5; // DAC12IFG trigger

      // Setup DMA0
      DMA0SA = (int) Sin_tab; // Source block address
      DMA0DA = DAC12_0DAT_; // Destination single address
      DMA0SZ = 0x20; // Block size
      DMA0CTL = DMADT_4 + DMASRCINCR_3 + DMAEN; // Rpt single ch, inc src, word-word

      //Setup DAC0 Load with Timer_A, group with DAC1
      DAC12_0CTL = DAC12LSEL_2 + DAC12IR + DAC12AMP_2 + DAC12IFG + DAC12ENC + DAC12GRP;

      //Setup DMA1
      DMA1SA = (int) Sin_tab+8; // Source block address
      DMA1DA = DAC12_1DAT_; // Destination single address
      DMA1SZ = 0x20; // Block size
      DMA1CTL = DMADT_4 + DMASRCINCR_3 + DMAEN; // Rpt single ch, inc src, word-word

      //Setup DAC1 Load with Timer_A
      DAC12_1CTL = DAC12LSEL_2 + DAC12IR + DAC12AMP_2 + DAC12IFG + DAC12ENC;

      //Setup Timer_A
      CCTL1 = OUTMOD_3; // CCR1 set/reset
      CCR1 = 1; // CCR1 PWM Duty Cycle
      CCR0 = 3; // Clock period of CCR0
      TACTL = TASSEL_1 + MC_1; // ACLK, upmode

      //Turn Off CPU forever
      LPM3;
      }
      -------------------------------------------------------------------------

        ,每次 DMA 傳輸都會強(qiáng)行占用 2 個 CPU 時鐘周期。雖然 CPU 并不用于傳輸操作,但時鐘周期的占用會造成必要的 CPU 開銷且大于零。不過,對于 1kHz 的正弦波來說,假設(shè)有 32 個數(shù)據(jù)點,第 31.25個數(shù)據(jù)點之外的 2 個周期僅需要 6.4%的開銷,相比之下不使用 DMA 時開銷達(dá)到近 50%。另外,產(chǎn)生 2 個波形只需要 4個周期或 7.8% 的開銷,而在不使用 DMA 時幾乎不可能產(chǎn)生 2 個 1kHz 正弦波。

      免費預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 日本人妖一区二区 | 日本系列有码字幕中文字幕 | 永久A电影三级在线观看 | 亚洲精品伊人久久久大香 | 日韩亚洲欧美中文字幕影音先 | 正在播放少妇最爽 |