先看一個(gè)沒有做任務(wù)調(diào)度的XY軸復(fù)位的程序A:
//XY軸復(fù)位
unsigned int XYReset(unsigned char reset)
{
static unsigned char operation = STEP1;
static unsigned int baseTime;
if(reset == TRUE)
{
operation = STEP1;
}
switch(operation){
case STEP1:
sm_run(SM101,3200); //步進(jìn)電機(jī)SM101運(yùn)動(dòng)3200步
operation = STEP2;
break;
case STEP2:
if(sm_state[SM101]==SM_STOP)
{ //3200步運(yùn)動(dòng)完成
baseTime = systemTime; //開始延時(shí)
operation = STEP3;
}
break;
case STEP3:
if(Timer(baseTime,500)==TRUE)
{ //延時(shí)500ms完成
sm_run(SM102,3200); //步進(jìn)電機(jī)SM102運(yùn)動(dòng)3200步
operation = STEP4;
}
break;
case STEP4:
if(IsSensorOn(X101))
{
sm_stop(SM102);
return TRUE;
}
else if(sm_state[SM102] == SM_STOP)
{
return -2; //動(dòng)作報(bào)錯(cuò)
}
break;
default:break;
}
return 0; //動(dòng)作正在運(yùn)行
}
下面增加任務(wù)調(diào)度的XY軸復(fù)位的程序B:
//XY軸復(fù)位
void XYReset()
{
switch(GetStep())
{
case STEP1:
sm_run(SM101,3200);
wait_sm_stop(SM101,STEP2);//任務(wù)切換,讓出當(dāng)前的運(yùn)行權(quán)限,直到SM101電機(jī)停止后切換回來
break;
case STEP2:
wait_time(500,STEP3);//任務(wù)切換 500ms后切換回來
break;
STEP3:
find_sensor(SM102,3200,X101,STEP4,STEP_ERROR);//任務(wù)切換,傳感器感應(yīng) 電機(jī)停止后回來
break;
STEP4:
set_ation_ok(); //正確結(jié)束當(dāng)前的動(dòng)作任務(wù),退出就緒隊(duì)列
break;
STEP_ERROR:
set_error("SM102電機(jī)丟步");//錯(cuò)誤結(jié)束當(dāng)前動(dòng)作任務(wù),退出就緒隊(duì)列
break;
}
}
程序A和程序B的共同點(diǎn):
- 都有耗時(shí)操作:電機(jī)運(yùn)動(dòng),等待傳感器狀態(tài)變化,延時(shí)等。
- 使用switch case做狀態(tài)轉(zhuǎn)換
- 都是非阻塞,沒有死等卡在當(dāng)前的函數(shù),系統(tǒng)其它函數(shù)也可以運(yùn)行.
程序A程序B的不同點(diǎn):
- 程序A的局部變量多,程序B要簡短,代碼行數(shù)只有程序A的56%
- 程序B的電機(jī)狀態(tài) 傳感器狀態(tài) 時(shí)間狀態(tài)都是系統(tǒng)管理查詢的,極大的提高了代碼的復(fù)用,因?yàn)橐粋€(gè)項(xiàng)目一般都有幾十個(gè)動(dòng)作動(dòng)作函數(shù).
- 程序B沒有if else都是函數(shù)調(diào)用,邏輯清晰,更接近自然表達(dá).
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
傳感器
+關(guān)注
關(guān)注
2551文章
51168瀏覽量
754181 -
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44562瀏覽量
635913 -
電機(jī)
+關(guān)注
關(guān)注
142文章
9028瀏覽量
145643 -
代碼
+關(guān)注
關(guān)注
30文章
4791瀏覽量
68693
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
專注單片機(jī)工控編程開發(fā)#步控電子#步驟編程#單片機(jī) #單片機(jī)開發(fā)
單片機(jī)
東莞市步控電子科技有限公司
發(fā)布于 :2022年08月03日 22:55:10
單片機(jī)工控板
,指示燈,計(jì)數(shù)器,撥碼開關(guān))如果用PLC成本太高,即使時(shí)最入門的也不是太合算,而且還需要自備24V開關(guān)電源,對(duì)配線也是個(gè)難題,就有這個(gè)一個(gè)想法,可對(duì)單片機(jī)了解甚少,還望對(duì)如上所列給予指點(diǎn)1.能否實(shí)現(xiàn)2.開發(fā)這個(gè)通用的班子費(fèi)用和周期3.有意向合作開發(fā)的mail至:leon51717@163.com
發(fā)表于 03-18 14:31
從單片機(jī)初學(xué)者邁向單片機(jī)工程師
從單片機(jī)初學(xué)者邁向單片機(jī)工程師從單片機(jī)初學(xué)者邁向單片機(jī)工程師
發(fā)表于 01-15 16:33
?45次下載
實(shí)用單片機(jī)工具應(yīng)用程序合集免費(fèi)下載
本文檔的主要內(nèi)容詳細(xì)介紹的是超級(jí)單片機(jī)工具軟件應(yīng)用程序合集免費(fèi)下載包括了:51波特率計(jì)算應(yīng)用程序,超級(jí)單片機(jī)工具軟件,單片機(jī)小精靈。
發(fā)表于 04-28 16:24
?33次下載
單片機(jī)工控實(shí)現(xiàn)任務(wù)執(zhí)行管理
前面寫了switch case做任務(wù)調(diào)度的應(yīng)用,這邊寫一下如何實(shí)現(xiàn).像一般的RTOS一樣都有一個(gè)任務(wù)控制塊(TCB)列表來管理所有的任務(wù),所以這里也需要一個(gè)結(jié)構(gòu)體來管理動(dòng)作任務(wù),這里叫做ACB吧.
單片機(jī)工控事件
單片機(jī)工控通常有延時(shí),電機(jī)狀態(tài),傳感器狀態(tài)等通用耗時(shí)操作,業(yè)務(wù)程序查詢這些狀態(tài),就會(huì)產(chǎn)生大量的冗余代碼,不簡潔.使用事件則是把這些通用操作丟給系統(tǒng)去處理,系統(tǒng)操作完成后,則運(yùn)行業(yè)務(wù)程序的下一個(gè)Step.
單片機(jī)工控的電機(jī)減速算法是什么?
單片機(jī)給步進(jìn)驅(qū)動(dòng)一個(gè)脈沖,電機(jī)轉(zhuǎn)動(dòng)一個(gè)步距角,單片機(jī)給脈沖越快,步進(jìn)電機(jī)單位時(shí)間內(nèi),轉(zhuǎn)動(dòng)的角度也就越大.即脈沖頻率正比于電機(jī)轉(zhuǎn)速.
單片機(jī)工控的工程分離是什么?
單片機(jī)電路板一般專有的,如汽車的車燈控制電路板和EPS控制的電路板是完全不同的。專有的電路板,軟件就比較難通用,軟件編程比較強(qiáng)調(diào)的是單片機(jī)系統(tǒng)。
51單片機(jī)工程模板創(chuàng)建方法
本教程將向大家介紹如何使用KEIL C51 軟件以及如何創(chuàng)建51 單片機(jī)工程。通過本教程的學(xué)習(xí),讓大家創(chuàng)建屬于自己的51 單片機(jī)工程模板,為后面學(xué)習(xí)51 單片機(jī)編程做好鋪墊。
發(fā)表于 07-15 15:27
?4916次閱讀
評(píng)論