基於狀態機的簡單控制:
公司是做一些簡單的夾具的,大部分功能是幾個按鍵加上幾個電磁閥,再加乙個顯示屏就構成了乙個簡單的控制系統。
工控行業一般要求是比較穩定的,所以我需要在啟動電磁閥之後去判斷我的氣缸是否到了指定位置,這樣我們就需要用到了sensor,那麼問題來了
首先我按下了按鍵,氣缸也動作了,接下來我就要等待氣缸到達位置,之前一直用的是while(sensor),但是這樣就出現了乙個問題,氣缸壓著手了,氣缸沒到位就一直等待,而我需要急停,可是我的這個急停按鈕檢測放在**呢?
1:放在中斷中,這個方法無疑是最快的,可以立刻關閉電磁閥,但是,關閉電磁閥之後呢,很明顯是退出中斷,繼續執行之前的程式,這很明顯不是我想要的結果,因為既然急停了,就說明我這裡有情況了,要麼產品有問題,要麼外部環境有阻礙,理想狀態下應該是復位才對!
2:用乙個定時器每間隔多久採集一次,這個問題和外部中斷的問題是一樣的。
下面就引入我要介紹的這種基於狀態機的控制,狀態機想必大家都知道了
舉個最簡單的例子。人有三個狀態健康,感冒,**中。觸發的條件有淋雨(
t1),吃藥(
t2),打針(
t3),休息(
t4)。所以狀態機就是健康-(
t4)->
健康;健康-(
t1)->
感冒;感冒-(
t3)->
健康;感冒-(
t2)->
**中;**中-(
t4)->
健康,等等。就是這樣狀態在不同的條件下跳轉到自己或不同狀態的圖。
那麼我們的觸發條件就是
sensor
到位,定時器到時間(這裡我們有數碼管按時重新整理),等等
這樣的話,我們的主程式只需要去
switch
狀態機,然後根據狀態機做動作就行了,這樣的好處就是我們不需要去等待氣缸到位
case 3:y2=0;actionstatus=4;break;
case 4:if(!x7) ;break;
case 6:y2=1;actionstatus=7;break;
case 7:if(!x6) actionstatus=0; break;
有**可以看出y2是開啟氣缸,x7是氣缸sensor,這樣的話,主程式便有大把時間去幹其他事了!
那麼,我們的主程式裡或許還要去檢測其他按鍵,這樣我們的按鍵處理可以用訊息機制來處理
void systick_handler(void)//10ms中斷
static uint32_t time,temp;
keycheck();
if(actionstatus==2)
time++;
if(time>=100)
actionstatus=3;
time=0;
}else
if(actionstatus==5)
temp++;
if(temp>=100)
temp=0;
keeppretimecount--;
if(keeppretimecount<1)
keeppretimecount=keeppretime;
actionstatus=6;
oled_8x16str(0,2,tostr(keeppretimecount));
}else
if(actionstatus==0x0a)//stop
time=0;
temp=0;
keeppretimecount=keeppretime;
oled_8x16str(0,2,tostr(keeppretimecount));
actionstatus=0xa6;
switch(messange)
case 3:actionstatus=0x0a;messange=0;break;
case 11: keeppretime++;freshtime();messange=0;break;
case 12: keeppretime--;freshtime();messange=0;break;
default:break;
我們用10ms中斷去檢測按鍵,同時也做了消抖處理,不知道大家是否看了出來
switch message仍然放在主函式中去判斷,進行處理,如果有數碼管需要進行重新整理的話也可以在定時器中發出乙個訊息,然後在主程式中進行處理,這樣免得在中斷中耽誤太多時間!
回歸到我們剛開始提出的中斷,通過程式可以看出急停按下後會發出訊息,主程式會立刻對訊息進行處理,然後可以改變當前狀態,這樣很容易就改變了程式的執行方向
偶然心血來潮總結了自己的歷程,希望對大家有所幫助!
狀態機簡單介紹
可以把狀態機的要素分為4個要素,即 現態 條件 動作 次態。現態 和 條件 是因,動作 和 次態 是果。1 現態 是指當前所處狀態 2 條件 又稱為 事件 當條件被滿足時,將會觸發乙個動作,或者執行一次狀態的遷移。3 動作 條件滿足後執行的動作。動作不是必須的,當條件滿足後,也可以不執行任何動作,直...
狀態機 狀態機0
近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...
基於狀態機的按鍵程式
基於狀態機的按鍵程式 一般的按鍵輸入軟體介面程式非常簡單,在程式中一旦檢測到按鍵輸入口為低電平 有時可能為高 便採用軟體延時的方法來進行消抖,然後再次檢測按鍵輸入,如果再次確認為低電平則表示有按鍵按下,轉入執行按鍵處理程式。如果延時後檢測的電平為高電平則放棄本次按鍵檢測,重新開始一次按鍵檢測過程。在...