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