文章

顯示從 8月, 2019 起發佈的文章

[應用] 以 STM32 晶片的 ADC 為基礎, 設計一個簡易示波器

圖片
目的         以 ADC 模組為基礎,設計一個簡易示波器觀察訊號變化,同時能記錄每筆資料以便數值分析。 設計         使用 STM32 系列晶片內的 ADC 模組,將類比訊號轉換成數位資料,然後將整筆數據從網路傳送到 PC 端,再由 PC 程式接收後繪製成曲線圖。開發過程,利用前面一文 「 以 STM32 晶片的 DAC 為架構設計一個訊號產生器 」 所產生的方波當做待測訊號源,此訊號源輸入到 ADC 接腳,如下圖一所示。 圖一:設計完整示波器的方塊圖 STM32F207        下圖是程式碼設定 ADC 的參數,第一個要先設定 ADC 取樣率的刻度,再來設定取樣率,如下面紅線標示。取樣率跟晶片的 operating clock 有關,從系統的高速時脈降頻到 ADC 的取樣率。第二個是選定 ADC 轉換資料的精密度,精密度越高,資料量則越大。最後,設定 ADC 轉換完畢後產生中斷通知 CPU,每次 ADC 轉換資料後,中斷的 IRQ 便會把數值從暫存器搬到記憶體裡。在設計裡,我們宣告兩塊 buffer 存放數值。 圖二:ADC 參數設定         下圖是在 PC 端寫一個網路接收資料的程式,並把資料繪製成曲線圖。當 ADC 取樣率為 15.2KHz時,從PC端看到的圖形比較像弦波,當我把 ADC 取樣率提高為 48KHz 時,PC端看到的圖形就像一個方波了。不過,取樣率高低對設計來說是一項架構問題,取樣率越高,代表資料量越高,傳輸速率越大,所需要的網路頻寬要夠,還要晶片的CPU有足夠的效能才行。 圖三-1:ADC 取樣率 15.2K 所顯示的方波 圖三-2:ADC 取樣率為 48K 所顯示的方波 問題         DMA資料搬運過程不穩定,當取樣率越高的時候,DMA搬運出現資料錯亂的情況。將這個問題放到 StackOverflow 網站尋求解答,連結如下「 ADC 與 DMA 資料搬運的問題 」。所以,在上面的測試過程,我們都採用 ADC 中斷的方式搬運資料到記憶體,而不是 DMA。 影片: [單晶片應用] 利用控制板設計一個簡單的示波器

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