<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > Stellaris系列微控制器的ADC過(guò)采樣技術(shù)(二)

Stellaris系列微控制器的ADC過(guò)采樣技術(shù)(二)

作者: 時(shí)間:2012-06-29 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/160365.htm
1 利用驅動(dòng)庫函數的8x過(guò)
代碼段1.a 配置-驅動(dòng)庫函數
//
// 初始化,使用定序器0對通道1進(jìn)行8x過(guò)
// 定序器將被其中一個(gè)通用定時(shí)器觸發(fā)
//
SequenceConfigure(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));
//
// 初始化定時(shí)器0,每隔10ms觸發(fā)一次ADC轉換
//
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 100);
TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
代碼段1.aADC配置表示在完成時(shí)產(chǎn)生一個(gè)中斷,這樣就必須具有中斷處理程序(見(jiàn)代碼段1.b)。驅動(dòng)庫的過(guò)采樣函數自動(dòng)將采樣的數據進(jìn)行平均,因此,中斷處理函數相對來(lái)說(shuō)也是很基礎的。但要記?。阂獙⒚看沃袛嘀杏嬎愕钠骄岛陀嬎愕拈_(kāi)銷(xiāo)提供給中斷處理程序。
代碼段1.b ADC中斷處理程序
void
ADCIntHandler(void)
{
long lStatus;
//
// 清除ADC中斷
//
ADCIntClear(ADC_BASE, 0);
//
// 獲得ADC的平均數據
//
lStatus = ADCSoftwareOversampleDataGet(ADC_BASE, 0, g_ulAverage);
//
// 占位符,供ADC處理數據
//
}
在將配置步驟和中斷處理程序放在適當位置后,啟動(dòng)轉換處理。定時(shí)器打開(kāi)(開(kāi)始計數)之前,ADC定序器和中斷必須使能(見(jiàn)代碼段1.c)。
代碼段1.c 使能ADC和中斷
//
// 使能ADC定序器0及其中斷 (ADCNVIC)
//
ADCSequenceEnable(ADC_BASE, 0);
ADCIntEnable(ADC_BASE, 0);
IntEnable(INT_ADC0);
//
//使能定時(shí)器并啟動(dòng)轉換處理
//
TimerEnable(TIMER0_BASE, TIMER_A);
使用多個(gè)定序器或一個(gè)定時(shí)器實(shí)現大于8倍的過(guò)采樣
驅動(dòng)庫的過(guò)采樣函數最大只能進(jìn)行8倍過(guò)采樣(根據采樣定序器的硬件限制),因此需要更大過(guò)采樣因子的應用必須使用其它的實(shí)現。本小節將描述如何使用下面的兩種方法:在過(guò)采樣頻率下運行的多個(gè)采樣定序器和一個(gè)定時(shí)器來(lái)解決這個(gè)問(wèn)題。
2:使用多個(gè)采樣定序器的16x過(guò)采樣
采樣定序器的靈活性允許對其進(jìn)行多種配置。將采樣定序器0-2累積起來(lái)可獲得16個(gè)采樣(8+4+4),因此使用采樣定序器0-2可實(shí)現16倍過(guò)采樣。為使該級別的過(guò)采樣能夠工作,定序器中的所有階段必須設置為對相同的模擬輸入進(jìn)行采樣,這意味著(zhù)丟棄了使用一個(gè)定序器采樣多個(gè)輸入的功能。
代碼段2.a使用定序器0-2配置一個(gè)10ms的周期轉換。使用一個(gè)定時(shí)器觸發(fā)就可啟動(dòng)所有3個(gè)定序器的采樣操作,而無(wú)需復雜的觸發(fā)配置。為獲得所需的結果,要對采樣定序器的優(yōu)先級進(jìn)行配置,這樣,采樣定序器2的優(yōu)先級最低(即它最后采樣),并且在采樣定序器2的最后一步之后,配置為發(fā)出一個(gè)轉換結束中斷。
代碼段2.a ADC配置-多個(gè)采樣定序器
//
// 初始化ADC,以便使用定序器0-2對通道1進(jìn)行16x過(guò)采樣
// 轉換操作通過(guò)GPTM觸發(fā)
//
ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_TIMER, 0);
ADCSequenceConfigure(ADC_BASE, 1, ADC_TRIGGER_TIMER, 1);
ADCSequenceConfigure(ADC_BASE, 2, ADC_TRIGGER_TIMER, 2);
//
// 配置定序器0的序列步驟(sequence step
//
ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 0, 1, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 0, 2, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 0, 3, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 0, 4, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 0, 5, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 0, 6, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 0, 7, (ADC_CTL_CH1 | ADC_CTL_END));
//
//配置定序器1的序列步驟
//
ADCSequenceStepConfigure(ADC_BASE, 1, 0, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 1, 1, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 1, 2, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 1, 3, (ADC_CTL_CH1 | ADC_CTL_END));
//
//配置定序器2的序列步驟
//
ADCSequenceStepConfigure(ADC_BASE, 2, 0, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 2, 1, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 2, 2, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC_BASE, 2, 3, (ADC_CTL_CH1 | ADC_CTL_IE
| ADC_CTL_END));
//
// 初始化定時(shí)器0,每隔10ms觸發(fā)一次ADC轉換
//
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 100);
TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
在代碼段2.b中,中斷處理程序必須收集FIFO的數據并進(jìn)行平均計算。因為不需要處理函數開(kāi)銷(xiāo)就可以獲得所需的結果,所以不使用ADCSequenceDataGet函數,并且使用直接的寄存器讀操作來(lái)清空定序器的FIFO。而使用ADCSequenceDataGet時(shí),要求函數定義一個(gè)額外的8入口采樣緩沖區,即使使用直接的寄存器讀操作,中斷處理程序中執行的總和計算和平均計算仍然會(huì )有可計算的開(kāi)銷(xiāo)。
代碼段2.b ADC中斷處理程序
void
ADCIntHandler(void)
{
unsigned long ulIdx;
unsigned long ulSum = 0;
//
// 清除中斷
//
ADCIntClear(ADC_BASE, 2);
//
// 獲得來(lái)自定序器0的數據
//
for(ulIdx = 8; ulIdx; ulIdx--)
{
ulSum += HWREG(ADC_BASE + ADC_O_SSFIFO0);
}
//
// 獲得來(lái)自定序器12的數據
//
for(ulIdx = 4; ulIdx; ulIdx--)
{
ulSum += HWREG(ADC_BASE + ADC_O_SSFIFO1);
ulSum += HWREG(ADC_BASE + ADC_O_SSFIFO2);
}
//
// 將過(guò)采樣的數據進(jìn)行平均
//
g_ulAverage = ulSum >> 4;
//
// 占位符,以便ADC處理代碼
//
}
在啟動(dòng)轉換處理之前,將采樣定序器和中斷使能(見(jiàn)代碼段2.c)。
代碼段2.c 使能ADC和中斷
//
// 使能定序器和中斷
//
ADCSequenceEnable(ADC_BASE, 0);
ADCSequenceEnable(ADC_BASE, 1);
ADCSequenceEnable(ADC_BASE, 2);
ADCIntEnable(ADC_BASE, 2);
IntEnable(INT_ADC2);
//
// 使能定時(shí)器并啟動(dòng)轉換處理
//
TimerEnable(TIMER0_BASE, TIMER_A);
3 使用在fOS下運行的定時(shí)器進(jìn)行16x過(guò)采樣
另一個(gè)實(shí)現16x過(guò)采樣的方法(無(wú)需消耗ADC定序器的大部分資源)是使用一個(gè)在過(guò)采樣頻率下運行的周期定時(shí)器。例如,如果轉換處理每10ms必須返回到主應用程序并且即將進(jìn)行16倍過(guò)采樣,則能夠將定時(shí)器配置為每625µs獲得一個(gè)采樣值。讓定時(shí)器在過(guò)采樣頻率下觸發(fā)一次轉換明顯地產(chǎn)生了額外的ADC中斷,這必須在應用程序中說(shuō)明。
ADC和定時(shí)器配置為執行上述操作的代碼見(jiàn)代碼段3.a。
代碼段3.a ADC配置-在fOS下運行的定時(shí)器
//
// 初始化ADC,以便在檢測到一次觸發(fā)時(shí)在通道1、定序器3上獲得一個(gè)采樣值。
//
//
ADCSequenceConfigure(ADC_BASE, 3, ADC_TRIGGER_TIMER, 0);
ADCSequenceStepConfigure(ADC_BASE, 3, 0, (ADC_CTL_CH1 | ADC_CTL_IE
| ADC_CTL_END));
//
//初始化定時(shí)器0,每625µs觸發(fā)一次ADC轉換
//
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 1600);
TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
既然ADC在過(guò)采樣頻率下進(jìn)行采樣操作,中斷處理程序必須知道已獲得的采樣數以及總和(見(jiàn)代碼段3.b)。在累積了16次轉換后,將這16個(gè)采樣值進(jìn)行平均,并清除全局采樣計數變量和總和變量。
代碼段3.b ADC中斷處理程序
void
ADCIntHandler(void)
{
//
// 清除中斷
//
ADCIntClear(ADC_BASE, 3);
//
// 將新的采樣值加到全局總和中
//
g_ulSum += HWREG(ADC_BASE + ADC_O_SSFIFO3);
//
// g_ucOversampleCnt1
//
g_ucOversampleCnt++;
//
// 如果累積了16個(gè)采樣值,則將它們平均并將全局變量復位
//
if(g_ucOversampleCnt == 16)
{
g_ulAverage = g_ulSum >> 4;
g_ucOversampleCnt = 0;
g_ulSum = 0;
}
//
// 占位符,以便ADC處理代碼
//
}
最后,在使能定時(shí)器之前,將定序器3及其中斷使能,并清除全局計數器和總和變量(見(jiàn)代碼段3.c)。
代碼段3.c 使能ADC、中斷并清除全局變量
//
// 使能定序器和中斷
//
ADCSequenceEnable(ADC_BASE, 3);
ADCIntEnable(ADC_BASE, 3);
IntEnable(INT_ADC3);
//
// 將過(guò)采樣計數器和總和變量清零
//
g_ucOversampleCnt = 0;
g_ulSum = 0;
//
// 使能定時(shí)器并啟動(dòng)轉換處理
//
TimerEnable(TIMER0_BASE, TIMER_A);
使用滑動(dòng)平均進(jìn)行過(guò)采樣
當采樣頻率接近ADC的最大采樣率時(shí),滑動(dòng)平均非常有用?;瑒?dòng)平均應用中的主要元件是采樣緩沖區,它在每次轉換完成時(shí)減去/加上數據。
4ADC配置為每隔100µs進(jìn)行一次采樣,采樣緩沖區含有16個(gè)入口。注意:應用程序不向采樣緩沖區預先填充有效的數據,這樣,前16個(gè)采樣值必須相應地由軟件來(lái)處理。ADC配置為在定時(shí)器觸發(fā)時(shí)采樣,并在每次轉換之后將處理器中斷。
4 使用滑動(dòng)平均每100µs過(guò)采樣
代碼段4.a ADC配置-滑動(dòng)平均
//
// 初始化ADC,以便在檢測到觸發(fā)時(shí)在通道1、定時(shí)器3上獲得一個(gè)采樣值。
//
//
ADCSequenceConfigure(ADC_BASE, 3, ADC_TRIGGER_TIMER, 0);
ADCSequenceStepConfigure(ADC_BASE, 3, 0, (ADC_CTL_CH1 | ADC_CTL_IE
| ADC_CTL_END));
//
// 初始化定時(shí)器0,每100µs觸發(fā)一次ADC轉換
//
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 10000);
TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
中斷處理程序必須更新采樣緩沖區并進(jìn)行平均計算(見(jiàn)代碼段4.b)。在每次ADC中斷時(shí),去掉采樣緩沖區中的最后一個(gè)元素,緩沖區中剩下的數據移動(dòng)一個(gè)位置。然后,在計算平均值之前將新的轉換結果放在采樣緩沖區的開(kāi)始處。中斷處理程序中執行的額外計算又一次增加了開(kāi)銷(xiāo),這一點(diǎn)必須要考慮到。
代碼段4.b ADC中斷處理程序
void
ADCIntHandler(void)
{
//
// 清除中斷
//
ADCIntClear(ADC_BASE, 3);
//
// 檢查g_ucOversampleIdx,確保它的值在范圍內
//
if(g_ucOversampleIdx == 16)
{
g_ucOversampleIdx = 0;
}
//
// 從全局總和中減去最早的值
//
g_ulSum -= g_ulSampleBuffer[g_ucOversampleIdx];
//
// 用新的采樣值代替最早的值
//
g_ulSampleBuffer[g_ucOversampleIdx] = HWREG(ADC_BASE + ADC_O_SSFIFO3);
//
// 將新的采樣值加到總和中
//
g_ulSum += g_ulSampleBuffer[g_ucOversampleIdx];
//
// g_ucOversampleIdx1
//
g_ucOversampleIdx++;
//
// 從采樣緩沖區的數據中獲得平均值
//
g_ulAverage = g_ulSum >> 4;
//
// 占位符,供ADC處理代碼
//
}
在啟動(dòng)定時(shí)器之前,使能定時(shí)器及其中斷(見(jiàn)代碼段4.c)。
代碼段4.c 使能ADC和中斷
//
// 使能定序器和中斷
//
ADCSequenceEnable(ADC_BASE, 3);
ADCIntEnable(ADC_BASE, 3);
IntEnable(INT_ADC3);
//
// 使能定時(shí)器并啟動(dòng)轉換處理
//
TimerEnable(TIMER0_BASE, TIMER_A);
需考慮的問(wèn)題
本文檔中描述的過(guò)采樣需要額外的代碼來(lái)執行平均計算,附加中斷,和/或大部分采樣定序器資源,因此它在整個(gè)系統性能上有一個(gè)顯著(zhù)的影響。在選擇最適合應用的時(shí),需在增加的中斷和龐大的中斷處理程序之間進(jìn)行權衡。
結論
Luminary Micro的采樣定序器結構為過(guò)采樣的實(shí)現提供了大量的選項。當與軟件平均技術(shù)相結合時(shí),該結構能夠使系統設計人員有效地在采樣頻率、系統性能和采樣解決方案之間進(jìn)行權衡。


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>