概述
Luminary Micro在Stellaris系列微控制器的部分產(chǎn)品中提供了模數(shù)轉(zhuǎn)換器(ADC)模塊。ADC的硬件分辨率為10位,但由于噪音和其它使精度變小的因素的影響,實際的精度小于10位。本應(yīng)用文檔提供了一個基于軟件的過采樣技術(shù),從而使轉(zhuǎn)換結(jié)果的有效位數(shù)(ENOB)得到了改善。文檔中描述了對輸入信號執(zhí)行過采樣的方法,以及在精度和整個系統(tǒng)性能上的影響。
過采樣
過采樣,顧名思義就是從輸入信號中采集額外的轉(zhuǎn)換數(shù)據(jù)。模擬信號采樣的標(biāo)準(zhǔn)約定指出:采樣頻率fS至少是輸入信號的最高頻率成分fH的兩倍。這被稱作奈奎斯特采樣定理(Nyquist Theorem)(見等式1)。
等式1 奈奎斯特采樣定理:
fS=2fH
只要所選的采樣頻率高于fS就被看作是過采樣。當(dāng)過采樣與平均技術(shù)相結(jié)合時,可改善ENOB。這是可以實現(xiàn)的,因為在將過采樣的結(jié)果進行平均的同時也將量化噪音進行了平均,這樣就提高了信噪比(SNR),信噪比的提高會在ENOB上產(chǎn)生一個直接的影響,從而改善ENOB。
精度上每提高一位,必須對信號進行4倍的過采樣,即過采樣頻率fOS與采樣頻率fS的關(guān)系如等式2所示:
等式2 過采樣頻率:
fOS=4X*fS
x為ENOB上需改進的位數(shù)(例如,需要改進2位,則x=2)。
平均
平均操作可看作是輸入信號上的一個低通濾波器,當(dāng)采樣數(shù)據(jù)寬度(simple size)增加時濾波器的通帶變窄。有兩種方法可對轉(zhuǎn)換結(jié)果進行平均:常規(guī)平均和滑動平均(rolling average)。
常規(guī)平均
對輸入信號進行n次采樣,將采樣值相加并將結(jié)果除以n,這即是常規(guī)平均。當(dāng)在過采樣方案中使用常規(guī)平均時,使用該技術(shù)之后,用于計算平均值的采樣數(shù)據(jù)被丟棄。每次應(yīng)用程序需要一個新的轉(zhuǎn)換結(jié)果時,重復(fù)該處理。
在應(yīng)用中,常規(guī)平均方案可理想地用于采樣頻率與ADC的采樣率相比較小的情況。
要點:當(dāng)在常規(guī)平均方案中執(zhí)行n倍過采樣時,有效的ADC采樣率將按照相同的因子降低。例如,在對輸入信號進行4倍過采樣時,最大的有效ADC采樣率降低為原來的1/4,即采樣率為250K/s的ADC有效地變?yōu)?2.5K/s的ADC。
解決方案使用常規(guī)平均對輸入源進行4倍過采樣。在該例中,應(yīng)用要求在每個t階段(t0、t1、t2等等)準(zhǔn)備好一個新值(平均操作完成)。
在使用平均技術(shù)時,因為計算后的轉(zhuǎn)換結(jié)果要與上面的n個采樣點對應(yīng),因此稍微有一點延遲。延遲時間使用等式3中的公式來計算:
等式3 平均后的采樣延遲:
tdelay=(tSn-tS0)/2+tprocess
tS0為進行平均時第一個采樣點出現(xiàn)的時間,tSn為最后一個采樣點出現(xiàn)的時間。中斷處理程序處理采樣數(shù)據(jù)所需的時間,并被計算為供應(yīng)用使用的平均tproces也被分解到等式中。
滑動平均
滑動平均在平均計算中使用存放n個最近采樣值的采樣緩沖區(qū),允許ADC在其最大采樣率時采樣(ADC采樣率并不象常規(guī)平均那樣減小為原來的1/n),這樣它可理想地用于要求過采樣和更高采樣率的應(yīng)用中。在未知狀態(tài)中,采樣緩沖區(qū)能夠用有效的采樣數(shù)據(jù)預(yù)先填充(通過捕獲第一個“實際”數(shù)據(jù)點之前的n-1個采樣點),也可保持為空,由應(yīng)用來決定。不預(yù)先填充緩沖區(qū)的危害是前面的n-1個采樣點包含無效的數(shù)據(jù),并在滑動平均計算中產(chǎn)生不利的影響。如果這些影響可被應(yīng)用所接受,并且如果軟件能夠解決前面的n-1個偏移的采樣點的可能性,則可去除緩沖區(qū)填充操作。
顯示了采用滑動平均的過采樣實例。圖中顯示的情況為:輸入信號進行4倍過采樣,即采樣緩沖區(qū)使用4個最近的采樣值來計算平均值。在該例中,應(yīng)用要求在每個t時刻有一個新的采樣值。在t0時刻計算第一個過采樣的結(jié)果之前,采樣緩沖區(qū)收集了3個采樣值,這樣提供給應(yīng)用的第一個數(shù)據(jù)有效。
在使用滑動平均時,等式3中計算得來的采樣延遲也同樣適用。要點:因為必須在每次中斷過程中執(zhí)行采樣緩沖區(qū)處理,因此使用滑動平均增加了額外的處理開銷。
實現(xiàn)
Luminary Micro在ADC中使用采樣定序器(sample sequencer)結(jié)構(gòu),它使用一次觸發(fā)就可采集到高達17個不同的采樣值(來自任意的模擬通道),這樣過采樣的實現(xiàn)就變得非常簡單。而通過向應(yīng)用提供在任意給定的時刻對多個通道進行過采樣的方法,使得軟件的實現(xiàn)也具有極大的靈活性。
下面將給出使用Stellaris微控制器的多種過采樣實現(xiàn)。有許多方法是將采樣定序器的配置、ADC觸發(fā)和中斷相結(jié)合來工作的。這里所舉的例子焦點都集中在最常使用的技術(shù)上。
所有的實例代碼都使用Stellaris系統(tǒng)驅(qū)動庫的ADC函數(shù)。驅(qū)動庫和本文檔中顯示的軟件實例的源代碼可從Luminary Micro網(wǎng)站:http://www.luminarymicro.com中獲得。
使用驅(qū)動庫函數(shù)的8倍過采樣
Stellaris驅(qū)動庫具有內(nèi)置的允許進行高達8倍過采樣的函數(shù)。該級別的過采樣能夠使ENOB改進大約1.4位,因此在大多數(shù)應(yīng)用中已足夠了。
使用驅(qū)動庫的過采樣函數(shù)是對輸入信號進行過采樣的最簡單的方法。配置“典型”ADC轉(zhuǎn)換和過采樣轉(zhuǎn)換的主要不同在于函數(shù)調(diào)用。過采樣函數(shù)有一個ADCSoftwareOversample前綴,很容易從標(biāo)準(zhǔn)ADC函數(shù)中識別出。
一旦確定好ADC轉(zhuǎn)換處理的參數(shù)(采樣頻率、觸發(fā)源、通道、等等),寫代碼是非常簡單的。舉例:例1中的代碼段即為建立一個8倍過采樣的10ms周期轉(zhuǎn)換(由定時器觸發(fā))的代碼。
代碼段1.a ADC配置-驅(qū)動庫函數(shù)
//
// 初始化ADC,使用定序器0對通道1進行8x過采樣
// 定序器將被其中一個通用定時器觸發(fā)
//
ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_TIMER, 0);
ADCSoftwareOversampleConfigure(ADC_BASE, 0, 8);
ADCSoftwareOversampleStepConfigure(ADC_BASE, 0, 0, (ADC_CTL_CH1
| ADC_CTL_IE | ADC_CTL_END));
//
// 初始化定時器0,每隔10ms觸發(fā)一次ADC轉(zhuǎn)換
//
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 100);
TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
代碼段1.a的ADC配置表示在采樣完成時產(chǎn)生一個中斷,這樣就必須具有中斷處理程序(見代碼段1.b)。驅(qū)動庫的過采樣函數(shù)自動將采樣的數(shù)據(jù)進行平均,因此,中斷處理函數(shù)相對來說也是很基礎(chǔ)的。但要記?。阂獙⒚看沃袛嘀杏嬎愕钠骄岛陀嬎愕拈_銷提供給中斷處理程序。
代碼段1.b ADC中斷處理程序
void
ADCIntHandler(void)
{
long lStatus;
//
// 清除ADC中斷
//
ADCIntClear(ADC_BASE, 0);
//
// 獲得ADC的平均數(shù)據(jù)
//
lStatus = ADCSoftwareOversampleDataGet(ADC_BASE, 0, g_ulAverage);
//
// 占位符,供ADC處理數(shù)據(jù)
//
}
在將配置步驟和中斷處理程序放在適當(dāng)位置后,啟動轉(zhuǎn)換處理。定時器打開(開始計數(shù))之前,ADC定序器和中斷必須使能(見代碼段1.c)。
代碼段1.c 使能ADC和中斷
//
// 使能ADC定序器0及其中斷 (在ADC和NVIC中)
//
ADCSequenceEnable(ADC_BASE, 0);
ADCIntEnable(ADC_BASE, 0);
IntEnable(INT_ADC0);
//
//使能定時器并啟動轉(zhuǎn)換處理
//
TimerEnable(TIMER0_BASE, TIMER_A);
使用多個定序器或一個定時器實現(xiàn)大于8倍的過采樣
驅(qū)動庫的過采樣函數(shù)最大只能進行8倍過采樣(根據(jù)采樣定序器的硬件限制),因此需要更大過采樣因子的應(yīng)用必須使用其它的實現(xiàn)。本小節(jié)將描述如何使用下面的兩種方法:在過采樣頻率下運行的多個采樣定序器和一個定時器來解決這個問題。
例2:使用多個采樣定序器的16x過采樣
采樣定序器的靈活性允許對其進行多種配置。將采樣定序器0-2累積起來可獲得16個采樣(8+4+4),因此使用采樣定序器0-2可實現(xiàn)16倍過采樣。為使該級別的過采樣能夠工作,定序器中的所有階段必須設(shè)置為對相同的模擬輸入進行采樣,這意味著丟棄了使用一個定序器采樣多個輸入的功能。
代碼段2.a使用定序器0-2配置一個10ms的周期轉(zhuǎn)換。使用一個定時器觸發(fā)就可啟動所有3個定序器的采樣操作,而無需復(fù)雜的觸發(fā)配置。為獲得所需的結(jié)果,要對采樣定序器的優(yōu)先級進行配置,這樣,采樣定序器2的優(yōu)先級最低(即它最后采樣),并且在采樣定序器2的最后一步之后,配置為發(fā)出一個“轉(zhuǎn)換結(jié)束”中斷。