華北電力大學 陳邵權 王 濤 范寒柏 王 磊
對模擬信號進行頻譜分析時,一般需要對信號進行AD采樣,并確定采樣速率。而對頻率分辨率較高的場合,對采樣速率要求較為準確,但一般的模數轉換器并不能保證準確的采樣速率。由此,本文以STM32F407VG為模數轉換器,介紹其設定出準確的采樣速率的方案[1][2]。
(1)STM32F407VG數模轉換器
STM32F407VG數模轉換器簡稱ADC,是12位逐次逼近模擬數字轉換器,擁有多個通道,每個通道可以單次、連續(xù)、掃描或間接模式進行模數轉換。轉換又可分為規(guī)則轉換和注入轉換,這兩種轉換均可以由外部觸發(fā)。在72MHz工作頻率下,一次的模數轉換的時間時間僅為1.17us。
(2)STM32F407VG直接存儲器
STM32F407VG直接存儲器簡稱DMA,DMA用來在外設和存儲器之間或者存儲器之間的高速數據傳輸。數據可以通過DMA快速移動,無須CPU干預,節(jié)省了CPU資源。擁有兩個DMA控制器,DMA1有七個通道,DMA2有5個通道,每個通道專門原來管理來自于一個或多個外設對存儲器訪問的請求。同時還有一個仲裁器來協調各個DMA請求的優(yōu)先權。
(3)STM32F407VG高級控制定時器
STM32F407VG高級控制定時器有兩個,為別為TIM1和TIM8。這兩個高級定時器由一個16位能夠向上、向下、向上向下自動裝載計數器組成,并由一個可編程的預分頻器驅動,預分頻系數可以從1~65535之間的任意數值,他們是完全獨立的,不共享任何資源。在主要功能中,可以作為ADC注入觸發(fā)的事件。
由上面的介紹可知,STM32F407VG的ADC可以進行注入轉換,注入轉換可以由定時器產生,ADC轉換之后的結果可以通過DMA通道快速轉移。由此,ADC精準采樣的工作思路如圖1所示。
由轉換圖知,只要保證了定時器的觸發(fā)速度不大于ADC的轉換速度,那么定時器的注入觸發(fā)ADC轉換就能夠及時的采樣數據,并保證了每次采樣的間隔同時,也即能夠由定時器的定時觸發(fā)設定出精準的采樣速率。
(1)ADC初始化設定
ADC轉換需要基準源、輸入信號、轉換時鐘、轉換方式、轉換速率、轉換的分辨率、轉換結果數據對齊方式等,由此選擇ADC基準源設定了內部基準源,接著設定輸入信號的通道,開啟轉換的時鐘,轉換方式為定時器觸發(fā)的注入的轉換方式,并設定了定時器內部PWM上升沿觸發(fā),轉換速率設定了轉換時鐘的二分頻,轉換分辨率設定為12位,數據對齊方式為右對齊。
(2)定時器初始化設定
定時器初始化需要時鐘、計數方式、內部Trig頻率及咱空比等,這里我們只需要內部PWM的頻率以及上升沿能夠有效觸發(fā)ADC轉換即可,并且PWM的頻率可以隨時修改。
(3)DMA初始化設定
DMA數據轉移涉及DMA通道的選擇、數據的轉移地址、數據緩存大小等,這里只要選對相應的ADC對應的DMA通道即可。
程序流程見圖2。
ADC定時采樣ADC初始化設置代碼如下:
ADC_InitTypeDef ADC_ACCInit;
//定義結構體參數ADC_ACCInit
ADC_ACCInit.ADC_Resolution=ADC_Resolution_12b;
//設置ADC分辨率為12位;
ADC_ACCInit.ADC_ScanConvMode=DISABLE;
//ADC非掃描模式
ADC_ACCInit.ADC_ContinuousConv-Mode=DISABLE;
//ADC非連續(xù)轉換
ADC_ACCInit.ADC_ExternalTrigConv-Edge=ADC_ExternalTrigConvEdge_Rising;
//ADC轉換由Trig上升沿觸發(fā),也即定時器觸發(fā)的
ADC_ACCInit.ADC_ExternalTrigConv=
ADC_ExternalTrigConv_T8_CC1;
//設置Trig產生的源為定時器8通道1
圖1 注入轉換圖
圖2 程序設計流程
ADC_ACCInit.ADC_DataAlign=ADC_DataAlign_Right;
//ADC轉換數據對齊方式為右對齊
ADC_Init(ADC3,&ADC_ACCInit);
//初始化ADC參數
ADC_RegularChannelConfig(ADC3,ADC_Channel_12,1,ADC_SampleTime_3Cycles);
//選擇ADC信號輸入通道
ADC_DMARequestAfterLastTransferC md(ADC3,ENABLE);
//使能DMA數據快速轉移
ADC_DMACmd(ADC3,ENABLE);
//使能ADC轉換數據的DMA請求
ADC_ExternalTrigInjectedConvConf ig(ADC3,ENABLE);
//使能外部Trig觸發(fā)源
ADC_ExternalTrigInjectedConvEdge Config(ADC3,ENABLE);
//使能外部Trig邊沿觸發(fā)
ADC_InjectedDiscModeCmd(ADC3,ENA BLE);
//使能ADC為注入轉換模式
ADC_Cmd(ADC3,ENABLE);
//使能ADC
定時器初始化以及DMA初始化比較簡單就不一一列出。
STM32F407VG模數轉換器ADC具有的注入轉換方式,可以配合自身的定時器TIM和快速數據轉移的DMA請求進行精準的信號采樣。本文對這三個資源進行分析的基礎上給出了實現模數轉換的精準采樣的方案。為需要精準采樣速率的數字信號處理過程提供了可靠保證。
[1]STM3240G-MCU2.RM0090 Reference manual.2011.
[2]STM32F10xxx參考手冊.2009.