Labview控制步進馬達
感謝高手 林X民教我步進馬達的控制方法跟原理,學會了步進馬達的原理之後,我就想設計一個可以由8051當成接收器,接收指令,然後接步進馬達,將接收到的指令計算好做對應的移動,以下我給自己出了一個題目:
在Labview端做一個旋鈕,然後轉動旋鈕,步進馬達會跟著轉,而且角度要對應,不可以跟旋鈕不同步
設計開始:
1.硬體端:
1.步進馬達:1個COM端及4個線圈端A.B.C.D共5線式步進馬達
2.快被我燒爛的8051一台(老師說只能燒一千次,我的差不多嚕)
3.330歐姆 X 4 (這個任意,只要B極能飽合就好試過1K也行,3K也行,手邊有什麼就用什麼)
4.NPN9014 X 4
先找出步進馬達的旋轉順序:COM端接5V,把4條線依序接地找出正確的A.B.C.D線圈
試出來後8051的P1_1接330歐姆再接9014的B極,C極接+5V,E極接到A線圈...依序一直接到P1_4對應D線圈,完成。(不接P1_0是為了給C語言判斷移位用)
步進馬達接了一支玩具槍,為了看轉動的角度方便
硬體端完成圖
點圖可以放大
2.8051端C語言部份:
/*程式功能:步進馬達隨著labview上的旋鈕移動角度
//設計變數的作用:
location 取得labview旋鈕位址
last_location 記錄labview上一次的旋鈕位址
move_step 現在labview的位子減掉上一次旋鈕的位址=要馬達移動的步數
即move_step=location-last_location
*/
#include <regx51.h>
unsigned char move_step,location,last_location;
void delay(unsigned char b)
{
unsigned char x,i,j;
for(x=0;x<b;x++)
for(i=0;i<50;i++)
for(j=0;j<50;j++);
}
void left(unsigned char b) //步進馬達向左旋轉副程式
{
unsigned char x;
for(x=0;x<b;x++)
{
P1=P1<<1;
if(P1==0x20)P1=0x02;
delay(1);
}
}
void right(unsigned char b) //步進馬達向右旋轉副程式
{
unsigned char x;
for(x=0;x<b;x++)
{
P1=P1>>1;
if(P1==0x01)P1=0x10;
delay(1);
}
}
void main(void) //主程式設定傳輸率跟中斷致能
{
TMOD=0x20;
TH1=253;
TR1=1;
SCON=0x50;
IE=0x90;
P1=0x02; //P1=00000010 =>即P1_1激磁
while(1);
}
void SCON_int(void)interrupt 4 //Labview有資料送進來就執行這個服務程式
{
if(TI==1)TI=0;
else
{
location=SBUF; //取Labview端送來的值當成目的地
move_step=location-last_location; //計算到目的地要移動的步數
RI=0;
if(move_step>128&&move_step<256) //負數就做左轉
{
move_step=256-move_step; //將負的步數轉成正的步數
left(move_step); //左轉
move_step=0; //移動完將步數歸零,避免下一個if判斷成右轉
}
if(move_step>0&&move_step<128) //正數就做右轉
{
right(move_step); //直接正轉
move_step=0; //正轉完將步數歸0
}
last_location=SBUF; //中斷結束前計錄PC端現在的位置給下次做計算移動步數用
}
}
3.PC的Labview端部份
Labview這裡就超級簡單嚕,只要把旋鈕的值傳送給8051就好,這裡我讓8051去負責計算要移動的步數,Labview只負責傳送,其實也可以在Labview就算好要移動的步數,直接丟給8051去跑就好了啦,但問題是.....我不會XD ,Labview還不是很熟,努力中~"~
如圖示
點圖可以放大
4.完成嚕,一切正常,角度都對應Labview不會出錯不會亂轉,很順利,感謝高手 林X民 的指導。
有試過同步轉動,就是一邊旋轉按鈕,槍口就跟著轉,但由於是RS232的綠故,轉快一點就錯亂了,慢慢轉還是OK的,有機會改USB來試看看是否跟的上電腦的轉動速度
執行影片
5.週休二日的成果:我的研究室又變亂了XD
喔喔,我想把他裝在我的破車上自動對準附近最近的會發出人體紅外線的人,呵呵呵