STM32 使用DMA+DAC+TIMER 輸出正弦波
之前已經簡單論述過,根據我個人菜鳥的瞭解與認識,對之前的知識進行整理回顧:
DMA:我的理解就是一個通道,或者是一座橋樑。在靜態記憶體到靜態記憶體,或者外設到靜態記憶體間的一個通訊的通道。建立這個通道的好處是:可以拋開CPU,不佔用CPU的資源,直接使用這塊記憶體的內容,速度也會加快。
DAC:STM32F103中有兩個DAC,可以同時使用。DAC的作用就是將數字量轉化為模擬量(電壓),在這就不作太多的講解。
TIMER:定時器。不作講解。
那麼對於使用DMA+DAC+TIMER產生正弦波的原理或過程,我有這樣一個簡單的理解:
先將一個可以生成正弦波的資料表儲存在靜態記憶體中,然後在DAC以及這塊記憶體中間使用DMA建立一個通道,經過以上步驟之後,DAC模組就可以通過DAM通道拿取靜態記憶體中可以生成正弦波的資料,拿取資料,然後經過數模準換,在引腳進行輸出就可以得到正弦波了。那麼當然,這個速度是非常快的,如果沒有一定的延時,那麼得到的估計就是一個變化很快的模擬量。所以這個時候就需要使用定時器TIMER了。DAC在初始化的時候,可以設定成使用定時器觸發,這就意味著,當定時器溢滿的時候,就會觸發DAC工作。這樣一來,就可以通過改變定時器的定時時間來改變正弦波的週期了。
以上是我的一個簡單的瞭解,應該會有很多不嚴謹不正確的地方,畢竟是一個新手菜鳥,以上見解也是方便自己學習,本人也會根據不斷學習進行補充營養的。下面貼出一個例子進行分析:
1、初始化波形表以及輸出的引腳
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
2、初始化DAC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
3、定時器配置
1 2 3 4 5 6 7 8 9 10 11 12 |
|
4、DMA配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1;//外設地址為DAC通道1的地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SineWave_Value;//波形資料表記憶體地址
DMA_Init(DMA2_Channel3, &DMA_InitStructure);//初始化
DMA_Cmd(DMA2_Channel3, ENABLE); //使能DMA通道3
}
5、正弦波初始化
1 2 3 4 5 6 7 8 9 10 |
|
經過以上的簡單配置,就可以使得32板輸出sin波形了。