日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机的状态机框架

發(fā)布時間:2023/12/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机的状态机框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

其實有很多地方可以使用這種思想。比如傳感器的數(shù)據(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)機:

int main(int argc, char const *argv[]){ while(1) { ds18b20_discope(); } return 0;}void ds18b20_discope(void){ switch (ds18b20的狀態(tài)機的全局變量) { case 發(fā)送命令: 發(fā)送轉(zhuǎn)換命令 賦值到等待裝態(tài) break; case 等待裝態(tài): 判斷是否有超時, 如果有超時,則:讀取,計數(shù)器清零,并回到發(fā)送命令狀態(tài) 否則,do nothing break; default: break; }}

定時器的基準中斷可以自己細化,我是50ms一個中斷:

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

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

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

-END-

猜你喜歡

看完這篇文章,還不會做平衡小車,你來打我。

為什么在中國電子工程師不如搞軟件的?

聊聊指針

?最 后??

?

若覺得文章不錯,轉(zhuǎn)發(fā)分享,也是我們繼續(xù)更新的動力。

5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等

在公眾號內(nèi)回復「更多資源」,即可免費獲取,期待你的關注~

長按識別圖中二維碼關注

總結(jié)

以上是生活随笔為你收集整理的单片机的状态机框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。