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

當(dāng)前位置:首頁 > 物聯(lián)網(wǎng) > 大魚機(jī)器人
[導(dǎo)讀]在單片機(jī)裸機(jī)的變成方法中,狀態(tài)機(jī)的方法是比較好的,經(jīng)典的比如按鍵的檢測判斷等。 其實,有很多地方可以使用這種思想。

原文:https://www.cnblogs.com/CodeWorkerLiMing/p/12501934.html

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

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

傳感器中使用fsm的方法

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

如下所示:我采用了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

那么我肯定不是死等的,死等,多浪費cpu,效率太低了,實際工作中根本無法接受。

因此,做了一個狀態(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ù)器清零,并回到發(fā)送命令狀態(tài) 否則,do nothing break; default: break; }}

定時器的基準(zhǔn)中斷可以自己細(xì)化,我是50ms一個中斷:

    
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ 如果ds18b20已經(jīng)處于等待狀態(tài), 則計數(shù)++}

這樣就是一個簡單的傳感器定時采樣的狀態(tài)機(jī)思路,不會死等,效率較高,而且穩(wěn)定。

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

-END-


猜你喜歡

看完這篇文章,還不會做平衡小車,你來打我。
為什么在中國電子工程師不如搞軟件的?
聊聊指針

?最 后 ??
?

若覺得文章不錯,轉(zhuǎn)發(fā)分享,也是我們繼續(xù)更新的動力。
5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機(jī)、等等!
在公眾號內(nèi)回復(fù)「 更多資源 」,即可免費獲取,期待你的關(guān)注~
長按識別圖中二維碼關(guān)注

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉