RTOS 采樣任務(wù)設(shè)計(jì)
筆者能力有限,如果文中出現(xiàn)錯(cuò)誤的地方,還請各位讀者能給我及時(shí)指出來,我將不勝感激,謝謝~
引言
在現(xiàn)實(shí)生活中,大多數(shù)我們所接觸到的信號(hào)都是一種模擬信號(hào),電壓、電流、聲音信號(hào)等。我們在嵌入式開發(fā)過程中,有時(shí)候會(huì)涉及到模擬信號(hào)的采集,在采集過程中,為了更好地還原出信號(hào)原本的樣子,有這個(gè)一個(gè)采樣定理,被稱之為 Nyquist 采樣定理,采樣定理的內(nèi)容是這樣的:要從采樣信號(hào)中不失真地恢復(fù)原始信號(hào),那么采樣頻率應(yīng)該大于原始信號(hào)最高頻率的兩倍,所以在編寫程序中,我們?yōu)榱四軌驈牟蓸有盘?hào)中不失真的恢復(fù)出原始信號(hào),那么我們必須設(shè)置合適的采樣率,下面筆者將不同地角度闡述幾種確定采樣率的方法,也就是確定采樣周期。
使用延時(shí)函數(shù)控制采樣周期
當(dāng)采樣的對象是一個(gè)低頻信號(hào)時(shí),采樣頻率就可以設(shè)置的很低,也就是說采樣周期比系統(tǒng)節(jié)拍周期要長的多,將采樣周期設(shè)置為系統(tǒng)節(jié)拍周期的整數(shù)倍,就可以使用 RTOS 系統(tǒng)提供的延時(shí)函數(shù)來控制采樣周期。這個(gè)時(shí)候,采樣功能就可以由一個(gè)獨(dú)立的采樣任務(wù)來完成。下面是關(guān)于使用延時(shí)函數(shù)來控制采樣率的一個(gè)流程框圖:
使用定時(shí)中斷控制采樣周期
當(dāng)采樣周期與系統(tǒng)節(jié)拍周期在同一個(gè)數(shù)量級(jí)時(shí),如果仍然采用延時(shí)函數(shù)來控制采樣周期,其采樣周期的時(shí)間抖動(dòng)將比較明顯,會(huì)嚴(yán)重影響采樣結(jié)果的質(zhì)量。這時(shí),可以采用的方法是,另外使用一個(gè)定時(shí)器,由定時(shí)中斷產(chǎn)生穩(wěn)定的采樣周期。
下面的偽代碼是一個(gè)采樣管周期為 500 us 的數(shù)據(jù)采集程序,采樣周期由定時(shí)器 0 來控制,采樣操作在定時(shí)器 0 的 ISR 中完成,使用消息郵箱與采樣任務(wù)進(jìn)行通信,采樣數(shù)據(jù)保存在全局?jǐn)?shù)組中。
void?timer0Isr(void)????/*?定時(shí)器?0?中斷服務(wù)函數(shù)?*/
{
????OSIntEnter();???????/*?調(diào)用進(jìn)入中斷服務(wù)函數(shù)?*/
????/*?清除中斷標(biāo)志位?*/
????/*?讀取?AD?轉(zhuǎn)換的結(jié)果?*/
????/*?將數(shù)據(jù)發(fā)送至郵箱?*/
????OSIntExit();????????/*?調(diào)用退出中斷服務(wù)函數(shù)?*/
}
void?SampleTask(void?*pdata)
{
????uint8_t?i;
????for?(i?=?0;?i?100;?i++)
????{
????????/*?郵箱等待數(shù)據(jù)到達(dá)?*/
????}
????/*?顯示信號(hào)波形?*/
}
下面是使用定時(shí)中斷控制采樣周期的一個(gè)程序流程框圖:
使用節(jié)拍鉤子函數(shù)進(jìn)行采樣
在實(shí)時(shí)操作系統(tǒng)中,都會(huì)存在一個(gè)鉤子函數(shù),用于使底層調(diào)用應(yīng)用層寫的程序,對于鉤子函數(shù)來講,其實(shí)也只是回調(diào)函數(shù)的另一種叫法,鉤子函數(shù)是與系統(tǒng)節(jié)拍所掛鉤的,每產(chǎn)生一次系統(tǒng)節(jié)拍就調(diào)用一次鉤子函數(shù),因此,當(dāng)某種功能的運(yùn)行周期與系統(tǒng)節(jié)拍周期相同時(shí),使用系統(tǒng)節(jié)拍函數(shù)的鉤子函數(shù)來完成此功能是非常有利的,另外,需要注意的一點(diǎn)是,系統(tǒng)鉤子節(jié)拍函數(shù)是系統(tǒng)節(jié)拍函數(shù)的一部分,具有 ISR 的性質(zhì),應(yīng)當(dāng)盡可能的簡潔,不允許調(diào)用任何使自己掛起來的系統(tǒng)服務(wù)函數(shù)。下面的偽代碼是系統(tǒng)使用系統(tǒng)節(jié)拍鉤子函數(shù)進(jìn)行采樣的一個(gè)示例:
void?OSTimeTickHook(void)????/*?系統(tǒng)節(jié)拍鉤子函數(shù)?*/
{
????if?(Samples?!=?0)???????/*?提前設(shè)置?*/
????{
????????/*?AD?數(shù)據(jù)轉(zhuǎn)換?*/
????????/*?郵箱發(fā)送?*/
????????Samples?--;
????}?
}
void?SampleTask(void?*pdata)
{
????/*?省略相關(guān)代碼?*/
????Samples?=?100;
????for?(i?=?0;?i?100;?i++)
????{
????????/*?等待郵箱數(shù)據(jù)?*/
????}
}
總結(jié)
上述便是本次介紹的在 RTOS 中的幾種采樣任務(wù)的設(shè)計(jì),根據(jù)被測信號(hào)的頻率選擇合適的方法來設(shè)計(jì)合適的采樣周期,從而最大限度地恢復(fù)出原始信號(hào)的波形。
參考資料:
《基于嵌入式實(shí)時(shí)操作系統(tǒng)的程序設(shè)計(jì)技術(shù)》
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請聯(lián)系我們,謝謝!