日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 工業(yè)控制 > 工業(yè)控制
[導讀] 例1 利用驅動庫函數的8x過采樣代碼段1.a ADC配置-驅動庫函數// // 初始化ADC,使用定序器0對通道1進行8x過采樣// 定序器將被其中一個通用定時器觸發(fā)// ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_TIMER, 0);

 

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統,而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉