字體:小 中 大 | |
|
|
2015/03/04 15:34:33瀏覽605|回應0|推薦0 | |
單軸馬達微控器 — 開發程式說明二 壹, 前言 在上一篇討論到微控器的TIMER0中斷副程式,已經介紹了馬達運轉架構,接下來本文要解說其他的部份,本次主要的是介紹在此開發案中的幾個訊息顯示的副程式,分別有 以下兩個副程式: 解析指令碼的副程式 void FunChar(void) LCM主要顯示字幕副程式 void DispScreen(void) 當然此部份副程式,有些可於產品化降低成本的條件下,免裝LCM模組的情形而加以減化,一方面可讓微控器使用低成本小包裝的89C2051即可,二者省略LCM模組之成本,三者減化顯示器之程式碼,以適合89C2051之程式碼容量大小,當然也可使用89C52的硬體,並保留程式碼於內部,而在需要進行DEBUG時,只要將預留的P0與P2接頭,將LCM接上,即可於DEBUG整體操作在微控器端的動作訊息,目前LCM是使用20X4字元型LCD螢幕,在四行的字幕中,分別加以分為四類的訊息, 第一行:微控器名稱與版本 第二行:顯示主機下達的指令碼 第三行:顯示微控器在運作的狀態資訊 第四行:顯示微控器偵測運作的訊息內容 貳,解說void FunChar(void)副程式的程式碼 首先需介紹指令碼的結構,此意思是指主機在下達指令的第一個位元至第八個位元所代表的意義,在此其中也包含微控器在運作時針對所發生的狀況,更新第一位元的字元,來讓void DispScreen(void)主要顯示字幕副程式來對應顯示資訊。先在此說明第一字元所定義的指令, 第一字元 功能說明 F 由主機下達的指令,表示正轉命令 R 由主機下達的指令,表示反轉命令 H 由主機下達的指令,表示要求馬達反轉至HOME位置,因此需待微控器控 制馬達反轉至偵測HOME位置SENSOR被觸動才停止 Z 此為微控器反應運作上的狀態,在微控器完成前一個指令後,Rcv_Buf[0]會 被填入"Z"字碼,以表示任務完成。 W 此為微控器處於待主機下達指令的狀態 S 此為微控器在操作時,遭遇外部緊急按鍵立即停機的要求,即M_STOP P3︿2處於LOW狀態時發生後的訊息 L 此為微控器在運作,當持續正轉時,卻遭遇到偵測M_HOME P3︿3 光遮SENSOR被觸動,此表示馬達正轉已達限制位置,為了避免正轉過 頭,微控器雖未完成指令,但是會立即停止, E 是微控器的M_STOP被偵測,要求馬達立即停機 C 是由主機下達之指令,其意義是要求微控器清除步進數值為0 Y 是微控器在運作時有偵測M_SYNC為LOW狀態,即表示處於等待信號 SYNC同步的要求,此時馬達會停止動作,一直等到M_SYNC恢復為 HIGH狀態時,再繼續完成任務的要求,此信號之設計在,如果主機同時 控制數個微控器,而主機希望各個微控器在各自下達了指令後,能夠於動作 時是同步的功能,只需由主機輸出一個OPEN DRAIN共接數個微控 器的M_SYNC接腳,所以當各微控器都已接收到指令碼後,就處於等待 狀態,一直待主機將此連線信號恢復為HIGH時,那麼各個微控器就會立 即依指令碼運作之。 B 是微控器在馬達運作期間,顯示屬於BUSY收態,尚未完成任務中 第二位元~第六位元 是一個五位數的步進數,範圍必需在0~65535之內 第七位元~第八位元 是一個兩位元的運轉速度值,範圍必需在3~19之間 舉例如下: F0204805 表示正轉,2048步進數,以05速度動作。 在解說程式碼部份,此程式在鑑別指每碼後,也分別依各指每碼去設定不同的旗號,讓上一篇的馬達運轉副程式依設定去運作之,當然此副程式的後段有將步進數字元與速度值進行轉換為數值型態,並同時判斷是否超過範圍。 /************************************/ void FunChar(void) { unsigned char i; switch(Rcv_Buf[0]) { case 0x00:OnOff_flag=0;Err_flag=1;FR_flag=0;Busy_flag=0;break; case 0x46:OnOff_flag=1;Err_flag=1;FR_flag=0;Busy_flag=0;break; //"F" Forward function case 0x52:OnOff_flag=1;Err_flag=1;FR_flag=1;Busy_flag=0;break; //"R" Reverse function case 0x48:OnOff_flag=1;Err_flag=4;FR_flag=1;Busy_flag=0;break; //"H" Home function case 0x5a:OnOff_flag=0;Err_flag=1;Busy_flag=0;break; //"Z" sleep function case 0x57:OnOff_flag=0;Err_flag=1;FR_flag=0;Busy_flag=0;break; //"W" Waiting function case 0x53:OnOff_flag=0;Err_flag=6;Home_flag=0;Rcv_Buf_Index=0;timesy=0;break; //"S" Stop function case 0x4c:OnOff_flag=0;Err_flag=5;Rcv_Buf_Index=0;break; //"L" Limit function case 0x45:OnOff_flag=0;Err_flag=2;break; //"E" function case 0x43:OnOff_flag=1;Err_flag=9;FR_flag=0;Busy_flag=0;Rcv_Buf_Index=0;timesx=0;break; //"C" function case 0x59:Err_flag=8;break; //"Y" Sync Waiting case 0x42:Err_flag=0;break; //"B" Busy Status default:Err_flag=0;break; } if(Err_flag!=4 ||Err_flag!=5 ||Err_flag!=9) //將步進數字元轉換為數值型態 { timesx=(Rcv_Buf[1] & 0x0f)*10000+(Rcv_Buf[2] & 0x0f)*1000+(Rcv_Buf[3] & 0x0f)*100+(Rcv_Buf[4] & 0x0f)*10+(Rcv_Buf[5] & 0x0f); if(timesx>65535 && Err_flag==0) { OnOff_flag=0;FR_flag=0;Err_flag=2;Busy_flag=0; } //STEP COUNT OVER Speed=(Rcv_Buf[6] & 0x0f)*10 + (Rcv_Buf[7] & 0x0f); //速度字元轉換為數值 if((2>>Speed || Speed>>20) && Err_flag==0) { OnOff_flag=0;FR_flag=0;Err_flag=3;Busy_flag=0; } //SPEED SETTING OVER } if(Err_flag==4) { timesx=65534;FR_flag=1; } //IF HOME INSTRUCTION HAS RECIVED, SET REVERSE TO HOME SENSOR WAS DECTECTED if(Err_flag==9) { timesx=timesy=0;for (i=1;i<8;i++) rcv_buf="" i="" 0x00="" o:p=""> } 參,解說void DispScreen(void)副程式 舉例 : 第二行 “F 2048 05 0 0 0 1 0” 依順序 F表正轉,2048步進數,速度5,最後五個單一字元分別依順序代表以下狀態旗號 OnOff_flag=0,FR_flag=0,Busy_flag=0,Err_flag=1,Sensor_flag=0 第三行 “ 2048 1 1 1 1 1 1” 依順序2048表是目前馬達已進行之步進數, 次一數值1是表示SENSOR計數,基本設計SENSOR是在轉軸上的每轉一圈就會讓透光式SENSOR產生觸動,微控器平時會偵測此SENSOR,並加以計數次數。 後續五個字元表示以下五個硬體SENSOR信號 Home_flag=1,M_home=1,M_sync=1,M_sensor=1,M_limit=1 第四行 " Waiting ",表示微控器在待機中狀態 /************************************/ void DispScreen(void) { sprintf(temp,"%1c %5u %2d",Rcv_Buf[0],(unsigned short)timesx,(int)Speed); LCD_Write_String(0,0,temp);//顯示第二行 DelayMs(1); sprintf(temp,"%1d %1d %1d ",(int)OnOff_flag,(int)FR_flag,(int)Busy_flag); LCD_Write_String(11,0,temp);//顯示第二行 sprintf(temp,"%1d %1d",(int)Err_flag,(int)Sensor_flag); LCD_Write_String(17,0,temp);//顯示第二行 // sprintf(temp,"%5u %3u %1d ",(unsigned short)timesy,(unsigned short)SensorCnt,(int)Home_flag); LCD_Write_String(row2,0,temp);//顯示第三行 sprintf(temp,"%1d %1d %1d %1d",(int)M_home,(int)M_sync,(int)M_sensor,(int)M_limit); LCD_Write_String(33,0,temp);//顯示第三行 switch(Err_flag) //顯示第四行訊息 { LCD_Write_String(row2,0,Clearn); case 0 : LCD_Write_String(row2,1,Err_Table0);break; case 1 : LCD_Write_String(row2,1,Err_Table1);break; case 2 : LCD_Write_String(row2,1,Err_Table2);break; case 3 : LCD_Write_String(row2,1,Err_Table3);break; case 4 : LCD_Write_String(row2,1,Err_Table4);break; case 5 : LCD_Write_String(row2,1,Err_Table5);break; case 6 : LCD_Write_String(row2,1,Err_Table6);break; case 7 : LCD_Write_String(row2,1,Err_Table7);break; case 8 : LCD_Write_String(row2,1,Err_Table8);break; case 9 : LCD_Write_String(row2,1,Err_Table9);break; default:break; } } 肆,結論 以上是說明在整體程式中的另外兩個比較大的副程式,主要負責在解析指令碼,與隨時顯示微控器運作的旗號,SENSOR狀態與動作訊息等資訊,各位在閱讀時可能對有些旗號與SENSOR之功能,可能需看完所有發表之文章後,就會比較了解。(待續之) |
|
( 興趣嗜好|其他 ) |