當(dāng)前位置:首頁 > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀]在單片機(jī)裸機(jī)的編程方法中,狀態(tài)機(jī)的方法是比較好的,經(jīng)典的比如按鍵的檢測(cè)判斷等。其實(shí),有很多地方可以使用這種思想,比如傳感器的數(shù)據(jù)采集。因?yàn)閱纹瑱C(jī)不可能一直等待著運(yùn)行,那樣的效率是很低的,通常都是結(jié)合fsmtimer的方式來提高CPU的使用率。下面簡(jiǎn)單介紹一下傳感器中使用fsm的方...


單片機(jī)裸機(jī)的編程方法中,狀態(tài)機(jī)的方法是比較好的,經(jīng)典的比如按鍵的檢測(cè)判斷等。

其實(shí),有很多地方可以使用這種思想,比如傳感器的數(shù)據(jù)采集。因?yàn)?a href="/tags/單片機(jī)" target="_blank">單片機(jī)不可能一直等待著運(yùn)行,那樣的效率是很低的,通常都是結(jié)合fsm timer的方式來提高CPU的使用率。

下面簡(jiǎn)單介紹一下傳感器中使用fsm的方法。

大家都知道,ds18b20的采集是比較慢的,發(fā)送轉(zhuǎn)換指令后,最慢需要等待720ms,這個(gè)時(shí)間有點(diǎn)太長(zhǎng)了。簡(jiǎn)直不能忍受。

如下所示,我采用了11bit分辨率,0.125的分辨率足夠了,作為溫度參考而已。

9 - bit resolution 93.75 ms 0.5
10 - bit resolution 187.5 0.25
11 - bit resolution 375 0.125
12 - bit resolution 750 0.0625
那么,我肯定不是死等的。死等多浪費(fèi)cpu,效率太低了,實(shí)際工作中根本無法接受。因此,我做了一個(gè)狀態(tài)機(jī):

int main(int argc, char const *argv[])
{
while(1)
{
ds18b20_discope();
}
return 0;
}
void ds18b20_discope(void)
{
switch (ds18b20的狀態(tài)機(jī)的全局變量)
{
case 發(fā)送命令:
發(fā)送轉(zhuǎn)換命令
賦值到等待裝態(tài)
break;
case 等待裝態(tài):
判斷是否有超時(shí),
如果有超時(shí),則:讀取,計(jì)數(shù)器清零,并回到發(fā)送命令狀態(tài)
否則,do nothing
break;
default:
break;
}
}
定時(shí)器的基準(zhǔn)中斷可以自己細(xì)化,我是50ms一個(gè)中斷:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
如果ds18b20已經(jīng)處于等待狀態(tài),
則計(jì)數(shù)
}
這樣就是一個(gè)簡(jiǎn)單的傳感器定時(shí)采樣的狀態(tài)機(jī)思路,不會(huì)死等,效率較高,而且穩(wěn)定。

注意:ds18b20的時(shí)序性比較嚴(yán)格,網(wǎng)上說不能被打斷的,但是后來移植到freertos中,也是可以的,溫度采樣還算穩(wěn)定,但是考慮到后續(xù)程序比較大,因此還是裸機(jī)了,狀態(tài)機(jī)的思路基本能解決。


END
作者:wdliming原文地址:www.cnblogs.com/CodeWorkerLiMing/p/12501934.html版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。
嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(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)系本站刪除。
換一批
延伸閱讀

串口作為單片機(jī)開發(fā)的一個(gè)常用的外設(shè),應(yīng)用范圍非常廣。大部分時(shí)候,串口需要接收處理的數(shù)據(jù)長(zhǎng)度是不定的。那么怎么才能判斷一幀數(shù)據(jù)是否結(jié)束呢,今天就以STM32單片機(jī)為例,介紹幾種接收不定長(zhǎng)數(shù)據(jù)的方法。

關(guān)鍵字: 單片機(jī) 串口 STM32

單片機(jī)誕生于1971年,經(jīng)歷了SCM、MCU、SoC三大階段。單片機(jī)由以前的1位、4位、8位、16位,發(fā)展到現(xiàn)在的32位甚至64位。當(dāng)前國(guó)內(nèi)MCU廠商已有上百家,對(duì)標(biāo)進(jìn)口芯片的情況非常嚴(yán)重,導(dǎo)致國(guó)內(nèi)MCU產(chǎn)品將陷入同質(zhì)化...

關(guān)鍵字: 單片機(jī) MCU 市場(chǎng)

(微控制單元 MCU(Microcontroller Unit),又稱單片機(jī),是把中央處理器(CentralProcess Unit; CPU)的頻率與規(guī)格做適當(dāng)縮減,并將內(nèi)存(memory)、計(jì)數(shù)器(Timer)、US...

關(guān)鍵字: 單片機(jī) 芯片 CPU

在疫情的影響下,出門后、用餐前使用酒精消毒已成了人們的日常,而酒精噴霧機(jī)也因此變得十分熱銷。為了避免交叉感染的風(fēng)險(xiǎn),自動(dòng)酒精噴霧器也就應(yīng)運(yùn)而生。不同于傳統(tǒng)手動(dòng)噴霧器不美觀、手部接觸不衛(wèi)生的bug,此款自動(dòng)感應(yīng)酒精噴霧器使...

關(guān)鍵字: 芯嶺技術(shù) 方案開發(fā) 解決方案 單片機(jī)

在實(shí)際的單片機(jī)控制系統(tǒng)中,有時(shí)候會(huì)使用數(shù)字邏輯芯片對(duì)單片機(jī)和受控元件進(jìn)行隔離,以保護(hù)單片機(jī),或者令單片機(jī)更好地對(duì)后級(jí)進(jìn)行控制。

關(guān)鍵字: 單片機(jī) 數(shù)字邏輯芯片 受控元件

MH32F103AVET6使用高性能的32位內(nèi)核,內(nèi)置了多達(dá)2個(gè)高級(jí)定時(shí)器、10個(gè)通用定時(shí)器、2個(gè)基本定時(shí)器、3個(gè)12位的ADC、2個(gè)12位的DAC,還包含標(biāo)準(zhǔn)和先進(jìn)的通信接口包括:3個(gè)SPI接口、2個(gè)I2S接口、2個(gè)I...

關(guān)鍵字: 單片機(jī) MCU

最近由于換季,天氣突然的轉(zhuǎn)涼,大家也是直呼好冷。天冷了自然是要注意防寒保暖。一個(gè)能夠當(dāng)充電寶用的暖手寶會(huì)是你最好的陪伴。暖手寶是一種非常便捷易用的發(fā)熱工具,并且體形小巧,可以隨身攜帶并輕易握在手中,也可以放置在身上的其它...

關(guān)鍵字: 芯嶺技術(shù) 方案開發(fā) 解決方案 單片機(jī)

XL32F003 系列微控制器采用高性能的 32 位 ARM?Cortex?- M0+ 內(nèi)核,寬電壓工作范圍的MCU。嵌入高達(dá)64 Kbytes flash和8 Kbytes SRAM存儲(chǔ)器,最高工作頻率32 MHz。包...

關(guān)鍵字: 單片機(jī) MCU

電動(dòng)洗鼻器是一種全新的鼻腔清潔工具,一般是通過水壓將生理鹽水送進(jìn)鼻腔,借助于生理鹽水的殺菌作用及水流的沖擊力,將鼻腔內(nèi)已聚集的致病菌及污洉排出,從而使鼻腔恢復(fù)正常的生理環(huán)境,恢復(fù)鼻腔的自我排毒功能,達(dá)到保護(hù)鼻腔的目的。讓...

關(guān)鍵字: 芯嶺技術(shù) 方案開發(fā) 解決方案 單片機(jī)

大家好,我是小舒,今天我?guī)砹艘粋€(gè)開源項(xiàng)目。學(xué)習(xí)單片機(jī)的小伙伴,對(duì)J-link一定不會(huì)陌生。J-link可以使用JATA和SWD接口進(jìn)行在線Debug和程序的燒錄,曾經(jīng)一段時(shí)間,某寶上J-Link鋪天蓋地,各種各樣,價(jià)格...

關(guān)鍵字: 開源項(xiàng)目 J-link 單片機(jī)

嵌入式微處理器

1170 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉