单片机的状态机框架
原文: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é)
- 上一篇: 再论PID,PID其实很简单。。。
- 下一篇: 【拆解】华为Mate Xs ,胶水用的出