[應用] 以 STM32 晶片的 DAC 為架構設計一個訊號產生器

目的:產生方波或正弦波的訊號
設計:以 STM32 系列內建的 DAC 模組為架構,搭配內部的 Timer 當做取樣率,讓 DAC 輸出週期性訊號。

        我們設計訊號產生器靠 DAC 模組將數值轉換成類比訊號,接著產生一個週期性訊號需要使用 Timer,利用它產生的 event 通知我們產生一個訊號數值,簡單說就是一個取樣點,而取樣率就是 Timer 的參數設置。這裡會有個效能的問題,如果取樣速率越高,那麼系統核心每次要 DAC 轉換數值的頻率就會增加,這會占用到系統 CPU 的運算時間。因此,DAC 需要配合 DMA 模組以達到系統效能。

        圖一所示為上述三個模組的運作流程圖,第一步 Timer 產生取樣點的事件,驅動第二步的 DAC 模組,因為設定 DAC 與 DMA 搭配合作,第三步 DAC 會對 DMA 發出一個請求,要求 DMA 將波形訊號數值搬到 DAC 暫存器裡面,最後 DMA 執行這個請求。

圖一:STM32 DAC 運作的流程圖

        圖二和圖三所示為程式碼的說明,首先要宣告一塊記憶體存放波形資料,這陣列代表一個波形的完整週期。接著,我們要初始化 TimerDACDMA 模組,Timer 設定取樣率,DMA 和 DAC 要設定資料搬運的位址與長度。設計到這裡,比較困難的地方在怎麼計算適當的取樣率,它會影響到波形的週期大小。我們以 STM32F207 晶片為例,Timer 模組的 clock 是 60MHz,當 TIM_Period 設定為 500 時,每個取樣點產生的頻率為 120KHz = 60MHz/500,再來看一個完整波形的週期需要 30 個取樣點,所以這個波形頻率為 4KHz = 120KHz/30,其週期為 250us。程式在 STM32F207 板卡上運行的結果顯示在最後一張圖。
圖二:波形資料的定義
圖三:每個模組參數的初始化


留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Visual Studio 遠端偵錯的設定步驟

[筆記] Android APP BLE範例程式 -- BluetoothLeGatt

[模組] LD3320 離線語音辨識晶片與 ESP32 無線傳輸