當(dāng)前位置:首頁 > 電源 > 數(shù)字電源
[導(dǎo)讀] 例1 利用驅(qū)動(dòng)庫函數(shù)的8x過采樣代碼段1.a ADC配置-驅(qū)動(dòng)庫函數(shù)// // 初始化ADC,使用定序器0對(duì)通道1進(jìn)行8x過采樣// 定序器將被其中一個(gè)通用定時(shí)器觸發(fā)// ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_TIMER, 0);

 

1 利用驅(qū)動(dòng)庫函數(shù)的8x過采樣
代碼段1.a ADC配置-驅(qū)動(dòng)庫函數(shù)
//
// 初始化ADC,使用定序器0對(duì)通道1進(jìn)行8x過采樣
// 定序器將被其中一個(gè)通用定時(shí)器觸發(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));
//
// 初始化定時(shí)器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.aADC配置表示在采樣完成時(shí)產(chǎn)生一個(gè)中斷,這樣就必須具有中斷處理程序(見代碼段1.b)。驅(qū)動(dòng)庫的過采樣函數(shù)自動(dòng)將采樣的數(shù)據(jù)進(jìn)行平均,因此,中斷處理函數(shù)相對(duì)來說也是很基礎(chǔ)的。但要記?。阂獙⒚看沃袛嘀杏?jì)算的平均值和計(jì)算的開銷提供給中斷處理程序。
代碼段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)位置后,啟動(dòng)轉(zhuǎn)換處理。定時(shí)器打開(開始計(jì)數(shù))之前,ADC定序器和中斷必須使能(見代碼段1.c)。
代碼段1.c 使能ADC和中斷
//
// 使能ADC定序器0及其中斷 (ADCNVIC)
//
ADCSequenceEnable(ADC_BASE, 0);
ADCIntEnable(ADC_BASE, 0);
IntEnable(INT_ADC0);
//
//使能定時(shí)器并啟動(dòng)轉(zhuǎn)換處理
//
TimerEnable(TIMER0_BASE, TIMER_A);
使用多個(gè)定序器或一個(gè)定時(shí)器實(shí)現(xiàn)大于8倍的過采樣
驅(qū)動(dòng)庫的過采樣函數(shù)最大只能進(jìn)行8倍過采樣(根據(jù)采樣定序器的硬件限制),因此需要更大過采樣因子的應(yīng)用必須使用其它的實(shí)現(xiàn)。本小節(jié)將描述如何使用下面的兩種方法:在過采樣頻率下運(yùn)行的多個(gè)采樣定序器和一個(gè)定時(shí)器來解決這個(gè)問題。
2:使用多個(gè)采樣定序器的16x過采樣
采樣定序器的靈活性允許對(duì)其進(jìn)行多種配置。將采樣定序器0-2累積起來可獲得16個(gè)采樣(8+4+4),因此使用采樣定序器0-2可實(shí)現(xiàn)16倍過采樣。為使該級(jí)別的過采樣能夠工作,定序器中的所有階段必須設(shè)置為對(duì)相同的模擬輸入進(jìn)行采樣,這意味著丟棄了使用一個(gè)定序器采樣多個(gè)輸入的功能。
代碼段2.a使用定序器0-2配置一個(gè)10ms的周期轉(zhuǎn)換。使用一個(gè)定時(shí)器觸發(fā)就可啟動(dòng)所有3個(gè)定序器的采樣操作,而無需復(fù)雜的觸發(fā)配置。為獲得所需的結(jié)果,要對(duì)采樣定序器的優(yōu)先級(jí)進(jìn)行配置,這樣,采樣定序器2的優(yōu)先級(jí)最低(即它最后采樣),并且在采樣定序器2的最后一步之后,配置為發(fā)出一個(gè)轉(zhuǎn)換結(jié)束中斷。
代碼段2.a ADC配置-多個(gè)采樣定序器
//
// 初始化ADC,以便使用定序器0-2對(duì)通道1進(jìn)行16x過采樣
// 轉(zhuǎn)換操作通過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轉(zhuǎn)換
//
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 100);
TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
在代碼段2.b中,中斷處理程序必須收集FIFO的數(shù)據(jù)并進(jìn)行平均計(jì)算。因?yàn)椴恍枰幚砗瘮?shù)開銷就可以獲得所需的結(jié)果,所以不使用ADCSequenceDataGet函數(shù),并且使用直接的寄存器讀操作來清空定序器的FIFO。而使用ADCSequenceDataGet時(shí),要求函數(shù)定義一個(gè)額外的8入口采樣緩沖區(qū),即使使用直接的寄存器讀操作,中斷處理程序中執(zhí)行的總和計(jì)算和平均計(jì)算仍然會(huì)有可計(jì)算的開銷。
代碼段2.b ADC中斷處理程序
void
ADCIntHandler(void)
{
unsigned long ulIdx;
unsigned long ulSum = 0;
//
// 清除中斷
//
ADCIntClear(ADC_BASE, 2);
//
// 獲得來自定序器0的數(shù)據(jù)
//
for(ulIdx = 8; ulIdx; ulIdx--)
{
ulSum += HWREG(ADC_BASE + ADC_O_SSFIFO0);
}
//
// 獲得來自定序器12的數(shù)據(jù)
//
for(ulIdx = 4; ulIdx; ulIdx--)
{
ulSum += HWREG(ADC_BASE + ADC_O_SSFIFO1);
ulSum += HWREG(ADC_BASE + ADC_O_SSFIFO2);
}
//
// 將過采樣的數(shù)據(jù)進(jìn)行平均
//
g_ulAverage = ulSum >> 4;
//
// 占位符,以便ADC處理代碼
//
}
在啟動(dòng)轉(zhuǎ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)轉(zhuǎn)換處理
//
TimerEnable(TIMER0_BASE, TIMER_A);
3 使用在fOS下運(yùn)行的定時(shí)器進(jìn)行16x過采樣
另一個(gè)實(shí)現(xiàn)16x過采樣的方法(無需消耗ADC定序器的大部分資源)是使用一個(gè)在過采樣頻率下運(yùn)行的周期定時(shí)器。例如,如果轉(zhuǎn)換處理每10ms必須返回到主應(yīng)用程序并且即將進(jìn)行16倍過采樣,則能夠?qū)⒍〞r(shí)器配置為每625µs獲得一個(gè)采樣值。讓定時(shí)器在過采樣頻率下觸發(fā)一次轉(zhuǎn)換明顯地產(chǎn)生了額外的ADC中斷,這必須在應(yīng)用程序中說明。
ADC和定時(shí)器配置為執(zhí)行上述操作的代碼見代碼段3.a。
代碼段3.a ADC配置-在fOS下運(yùn)行的定時(shí)器
//
// 初始化ADC,以便在檢測(cè)到一次觸發(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轉(zhuǎn)換
//
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 1600);
TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
既然ADC在過采樣頻率下進(jìn)行采樣操作,中斷處理程序必須知道已獲得的采樣數(shù)以及總和(見代碼段3.b)。在累積了16次轉(zhuǎn)換后,將這16個(gè)采樣值進(jìn)行平均,并清除全局采樣計(jì)數(shù)變量和總和變量。
代碼段3.b ADC中斷處理程序
void
ADCIntHandler(void)
{
//
// 清除中斷
//
ADCIntClear(ADC_BASE, 3);
//
// 將新的采樣值加到全局總和中
//
g_ulSum += HWREG(ADC_BASE + ADC_O_SSFIFO3);
//
// g_ucOversampleCnt1
//
g_ucOversampleCnt++;
//
// 如果累積了16個(gè)采樣值,則將它們平均并將全局變量復(fù)位
//
if(g_ucOversampleCnt == 16)
{
g_ulAverage = g_ulSum >> 4;
g_ucOversampleCnt = 0;
g_ulSum = 0;
}
//
// 占位符,以便ADC處理代碼
//
}
最后,在使能定時(shí)器之前,將定序器3及其中斷使能,并清除全局計(jì)數(shù)器和總和變量(見代碼段3.c)。
代碼段3.c 使能ADC、中斷并清除全局變量
//
// 使能定序器和中斷
//
ADCSequenceEnable(ADC_BASE, 3);
ADCIntEnable(ADC_BASE, 3);
IntEnable(INT_ADC3);
//
// 將過采樣計(jì)數(shù)器和總和變量清零
//
g_ucOversampleCnt = 0;
g_ulSum = 0;
//
// 使能定時(shí)器并啟動(dòng)轉(zhuǎn)換處理
//
TimerEnable(TIMER0_BASE, TIMER_A);
使用滑動(dòng)平均進(jìn)行過采樣
當(dāng)采樣頻率接近ADC的最大采樣率時(shí),滑動(dòng)平均非常有用。滑動(dòng)平均應(yīng)用中的主要元件是采樣緩沖區(qū),它在每次轉(zhuǎn)換完成時(shí)減去/加上數(shù)據(jù)。
4ADC配置為每隔100µs進(jìn)行一次采樣,采樣緩沖區(qū)含有16個(gè)入口。注意:應(yīng)用程序不向采樣緩沖區(qū)預(yù)先填充有效的數(shù)據(jù),這樣,前16個(gè)采樣值必須相應(yīng)地由軟件來處理。ADC配置為在定時(shí)器觸發(fā)時(shí)采樣,并在每次轉(zhuǎn)換之后將處理器中斷。
4 使用滑動(dòng)平均每100µs過采樣
代碼段4.a ADC配置-滑動(dòng)平均
//
// 初始化ADC,以便在檢測(cè)到觸發(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轉(zhuǎn)換
//
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 10000);
TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
中斷處理程序必須更新采樣緩沖區(qū)并進(jìn)行平均計(jì)算(見代碼段4.b)。在每次ADC中斷時(shí),去掉采樣緩沖區(qū)中的最后一個(gè)元素,緩沖區(qū)中剩下的數(shù)據(jù)移動(dòng)一個(gè)位置。然后,在計(jì)算平均值之前將新的轉(zhuǎn)換結(jié)果放在采樣緩沖區(qū)的開始處。中斷處理程序中執(zhí)行的額外計(jì)算又一次增加了開銷,這一點(diǎn)必須要考慮到。
代碼段4.b ADC中斷處理程序
void
ADCIntHandler(void)
{
//
// 清除中斷
//
ADCIntClear(ADC_BASE, 3);
//
// 檢查g_ucOversampleIdx,確保它的值在范圍內(nèi)
//
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++;
//
// 從采樣緩沖區(qū)的數(shù)據(jù)中獲得平均值
//
g_ulAverage = g_ulSum >> 4;
//
// 占位符,供ADC處理代碼
//
}
在啟動(dòng)定時(shí)器之前,使能定時(shí)器及其中斷(見代碼段4.c)。
代碼段4.c 使能ADC和中斷
//
// 使能定序器和中斷
//
ADCSequenceEnable(ADC_BASE, 3);
ADCIntEnable(ADC_BASE, 3);
IntEnable(INT_ADC3);
//
// 使能定時(shí)器并啟動(dòng)轉(zhuǎn)換處理
//
TimerEnable(TIMER0_BASE, TIMER_A);
需考慮的問題
本文檔中描述的過采樣技術(shù)需要額外的代碼來執(zhí)行平均計(jì)算,附加中斷,和/或大部分采樣定序器資源,因此它在整個(gè)系統(tǒng)性能上有一個(gè)顯著的影響。在選擇最適合應(yīng)用的技術(shù)時(shí),需在增加的中斷和龐大的中斷處理程序之間進(jìn)行權(quán)衡。
結(jié)論
Luminary Micro的采樣定序器結(jié)構(gòu)為過采樣技術(shù)的實(shí)現(xiàn)提供了大量的選項(xiàng)。當(dāng)與軟件平均技術(shù)相結(jié)合時(shí),該結(jié)構(gòu)能夠使系統(tǒng)設(shè)計(jì)人員有效地在采樣頻率、系統(tǒng)性能和采樣解決方案之間進(jìn)行權(quán)衡。
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉