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