Stepping Motor control/步進馬達控制

一、關於步進馬達

步進馬達在很多地方都有應用,例如家中的冷氣出風口扇葉控制,高級豪宅的窗簾控制等等,諸如這種需要有定位需求的控制便宜的解決方案都會採用步進馬達。

不過很不幸的,本人今天第一次控制步進馬達,所以記錄一下自己所了解到的一些東西。

二、控制方式

步進馬達的控制方式依據馬達的種類不同而會有所不同(廢話),通常可以分為4線式或5、6線式,從控制上來說,主要的差別在於4線式的控制需要雙極性電源,意即控制訊號需要能夠提供雙向電源,在控制上稍微比較麻煩(如用現成控制器除外),而5或6線式僅須提供單向控制電源即可。

更多步進馬達的知識,可參考一下網址

http://www.sunholy.com.tw/epaper/NO.89/89.pdf

http://angel91250.pixnet.net/blog/post/...

三、步進馬達的規格

在選用步進馬達的時候,通常我們必須瞭解我們需要的控制方式、最高轉速、精度、扭力等等。

以某步進馬達為例(如下圖)

steppingmotor

由上圖可看出,該步進馬達是使用5線式控制,其控制時序如PHASE EXCITAION表

關於規格中的一些參數說明

a.Rated voltage

此處指的就是該步進馬達使用的工作電源,即為12V

b.Step angle(output shaft)

此處標明了該步進馬達每1步所運行的角度,此處標示為3.75/42.5,該3.75代表內部原始角度,42.5則是經過減速齒輪之比例,也就是說,每走一步內部是3.75度,而外部角度則為3.75÷42.5≒0.088235,所以也算相當精密唷。

所以假設我要使這顆步進馬達完整走完一圈,那我必須送出幾個pulse才能完成?

(360×42.5)÷3.75=4080個pulse才能完整走完一圈,有了這個數據,就可以做到指定角度囉。

另外這邊指的1pulse就是PHASE EXCITAION1~8的其中一個動作就是1個pulse。

c.Max response frequency

每顆步進馬達都是透過激磁的方式進行運轉,既然是機械動作就必然會有反應時間,此處標明了最大的頻率反應時間,大於250p.p.s,而pps代表的是pulse number per second,也就是一秒鐘所送出的pulse數量,例如每秒送出250個pulse的話相當於1/250pps=4mS就必須送出1個pulse,所以250pps可以直接理解成250Hz的控制頻率,知道了送出頻率的時間,我們也可以直接算出當步進馬達轉一圈的時候,須要花多久時間。

如上所計算出一圈需要送出4080pulse然後如果以250pps來算就是4080×4mS≒16.32sec才能完成一圈,算是相當的慢呢。

d.Pull in torque

扭矩的標稱值,這邊就是標稱扭力的地方這裡我也不知道怎麼驗證,只能依據這個參考值,然後實際做測試來看看能不能符合需求,通常扭矩都會使用Nm牛頓來標示,很難覺得那個量有多大,所以,我們就把牛頓換成Kg來理解吧。

147mN-m ≒ 1.4989828330806Kg-cm

http://www.convertunits.com/from/N-m/to/kg-cm

四、控制

步進馬達我測試的結果激磁的方式一定要按照順序,且如要停止馬達的時候,最好關閉所有輸出,盡量不要使用單相激磁咬住馬達使其作為固定,容易使其發熱久了會過熱損壞。

 

//------------------------------------------------------------------
//Stepping motor control
//------------------------------------------------------------------
#define FORWARD		0
#define	REVERSION	1
#define MOTOR_OFF	2
void stepMotorCtrl(uint8 direction)
	{
	uint8 stepReg[] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};
	static uint8 stepCnt;

	switch (direction)
		{
		case FORWARD:
			Control_Reg_1_Write(stepReg[stepCnt]);
			stepCnt = (stepCnt >= 7) ? 0 : stepCnt + 1;
			break;
		case REVERSION:
			Control_Reg_1_Write(stepReg[stepCnt]);
			stepCnt = (stepCnt == 0) ? 7 : stepCnt - 1;
			break;
		case MOTOR_OFF:
			Control_Reg_1_Write(0);
			break;
		}
		
	}
//------------------------------------------------------------------

 

五、測試影片

發表迴響