//Logo Image
作者:蔡宗成(2005-03-07);推薦:吳昌暉、徐業良(2005-03-08)

PIC_SERVER教材(4)—近端馬達控制

本文接續PIC_SERVER教材(3),暫不考慮PIC_SERVER的網路功能,僅討論以PIC_SERVER作近端馬達控制。

1.     馬達控制的基本目標與馬達驅動器的基本功能

馬達控制的基本目標有三,包括控制馬達的開與關、控制馬達的轉速、以及控制馬達的運轉方向。單晶片不能直接用來推動馬達,因為如PIC_SERVERPIC18F4620單晶片的I/O接腳最多僅能輸出或接收25mA的電流,最多也僅能承受5V的電壓。低功率玩具馬達通常要6~24V的驅動電壓,無負載運轉時需要0.1A以上的電流,起動或高負載時會用到0.5A以上的電流(請拿電表測量額定9V的樂高玩具馬達,在無負載時及當轉軸被握住時會消耗多大的電流)。

因此單晶片必須搭配馬達驅動器,才能驅動馬達。馬達驅動器的基本功能為提供馬達運轉所需的高電壓與大電流,以及依據輸入端的低電壓(5V)、低電流(<10mA)的邏輯或脈波信號,實現前述三項馬達控制的基本目標。

1PIC_SERVER硬體架構,有一顆可用於驅動直流有刷馬達、繼電器、或電磁閥的L293D驅動IC,最高可承受36V的電壓,最大連續輸出電流為0.6A,最大瞬間電流為1.2AL293D共有4個輸出點,視接線方式可最多可驅動4個小玩具馬達,或一個二相步進馬達。

1. PIC_SERVER單板電腦硬體架構

直流馬達的速度控制的原理,與發光二極體LED的亮度控制的原理完全相同,因此本文先從LED亮度控制開始介紹,接著討論如何用L293D驅動玩具馬達和二相步進馬達。

2.     PWM驅動方式控制LED的亮度

發光二極體LED的亮度可以用「波寬調制(Pulse Width Modulation, PWM)」的方式控制其亮度,從全滅到全亮可以細分為數十段甚至於千段的亮度。此處先從全亮全滅的控制開始,再逐步介紹PWM亮度控制。

2.1 控制LED的開與關

如圖2所示,PIC_SERVER板上已有一顆A4_LED,正極經2.2kW 接到+5V電源,負極接PIC_SERVERRA4接腳(如圖3電路圖)。再拿一顆LED,正極接到圖2中板上的CN5.8(RB3),負極接到CN4.8(GND),用CCS編譯器提供的數位輸出指令output_high()output_low()即可控制兩個LED明滅:

output_low(PIN_A4);              A4_LED亮(電流由電源+5VLEDPIC

output_high(PIN_A4);              A4_LED

output_low(PIN_B3);               LED

output_high(PIN_B3);              LED亮(電流由PIC流出經LEDGND

注意高低電位輸出和LED正負極接法的關係(如圖4),當使用output_high()指令時,PIC“source”、提供LED電流,當使用output_low()時,PIC“sink”、接收經過LED的電流。

2. 部分layout

3. PIC_SERVER電路圖之A4_LED

4. 腳位高低電位狀態和LED正負極接法關係

2.2 用軟體PWM驅動方式來控制LED的亮度

5的程式以軟體模擬PWM驅動方式,來控制發光二極體LED的亮度為全亮時的20%。圖5主程式while(1)迴圈中的兩行指令(第65~66行),讓LED5msec的週期中僅通電1msec(使用output_high()指令,由PIC_SERVER供給LED電源),也就是僅有20%的時間導通,則LED的平均電壓約為電源電壓的20%,功率約為最高功率的20%,這種驅動方式就是PWM波寬調制。本例中的PWM頻率是200Hz,工作週期(Duty Cycle)20%,執行程式時可拿台示波器看看電壓信號。

5. 軟體PWM驅動方式來控制LED的亮度

上述程式是以PIN_B3為控制對象,必須要注意PIN_B3的輸出入設定。在pic_SERVER_init.c中,PIN_B3被預設為數位輸入,因此圖5程式中第62行使用set_tris_b()指令,設定PORT_B腳位為輸出或輸入,覆蓋原先pic_SERVER_init.c中的設定。圖5中設定PIN_B3為數位輸出指令為set_tris_b(0b00000101),其中1代表輸入,0代表輸出,從右算起第4個數值(PIN_B3)被設定為0

2.3 用單晶片的硬體PWM模組控制LED的亮度

單晶片PIC18F4620內建兩個硬體PWM模組,其輸出腳分別是RC2RC1,這裡先用RC2來控制PIC_SERVER板上的M2A_LED(圖6之藍色點)的亮度。接線上請先拔掉板上的L293D晶片(圖6U6),再將其插座的1011腳短路(如圖6紅點,圖7紅色圓圈處),接腳共接短路後,RC2M2A連接M2A_LED

6. M2A_LEDL293D晶片之位置

7. 使用RC2控制M2A_LED

8為使用硬體PWM控制M2A_LED的亮度之程式碼,這裡用CCS編譯器提供的PWM指令set_pwm1_duty()即可控制LED亮度。單晶片設定PWM功能時,是使用計時器Timer2做計時功能,讓RC2接腳產生PWM輸出,也就是設定計時器Timer2,使得時間到時,讓RC2腳位產生HighLow切換狀態,並將計時器重新計時,pic_SERVER_init.c檔案裡有計時器Timer2之相關設定。

例如PIC_SERVERPWM的輸出頻率為40kHz,希望設定工作週期為20%(即控制LED亮度固定在20%),所以RC2接腳的輸出週期為25ms,但高電位輸出週期為5msset_pwm1_duty()指令即在設定高電位輸出所需計時器Timer2的週期數,而PIC_SERVER是採用40MHz振盪晶體,其計時器Timer2的預除器比例設定為1:1(即Timer2的週期和PIC_SERVER振盪週期相同。pic_SERVER_init.c檔案裡有行指令setup_timer_2(T2_DIV_BY_1, 249, 1),指令功能是設定預除器比例設定為1:1,週期為(249+1)×4=1000個振盪器時脈,使用40MHz振盪器時脈時,一個振盪器時脈的時間是1/40MHz=0.025ms,故週期為1000×0.025 ms=25 ms,亦即PWM的頻率為40kHz。將0~(249+1)×4的數值傳入函數set_pwm1_duty(),即可實現0~100%工作週期,因此圖8程式碼第8行指令set_pwm1_duty(200),即設定工作週期為20%

8. 使用硬體PWM控制M2A_LED的亮度之程式碼

接著把L293D插回去(1011腳不用短路),把樂高玩具馬達的兩條線接到圖6CN12.1(GND)CN12.2(M2A),圖8中的程式就可以同時控制M2A_LED的亮度和樂高玩具馬達的轉速了。再略微修改程式,改成set_pwm1_duty(read_analog(0)),就可以用PIC_SERVER板上的可變電阻VR1來控制LED亮度和馬達的轉速了。

3.     PWM驅動方式控制直流有刷馬達的運轉方向與速度

馬達控制與LED控制的差異在於電壓電流需求不同,且藉由控制電流流向的不同讓馬達可以正反雙向運轉。如前所述,直接把馬達接到單晶片的輸出腳去,是不可能讓馬達轉動的,因此需要一個能承受高電壓大電流的開關,以單晶片輸出接腳的小訊號驅動能承受高壓大電流的開關,例如機械式的繼電器、電子式的固態繼電器、用電晶體做個驅動電路、或是用積體電路型的驅動晶片(Driver IC,馬達驅動器)

3.1 用功率驅動晶片控制直流有刷馬達的開與關

PIC_SERVER板上的L293D,是一顆推挽式(Push-Pull)H電橋(Half H-Bridge)電子開關,它們可以送出(source)電流,也可以吸入(sink)電流,直流負載接在輸出點output與正電源Vcc之間,或是輸出點output與地線GND之間均可,其示意電路圖如圖9

9. L293D之示意電路圖

L293D之特性是一條輸入信號線控制兩個互補的開關,圖9中的兩個開關S1S2絕對不會同時導通的。實際上的動作,以L293DNE馬達驅動晶片為例,還要加上一條致能線(Enable)才能完整的描述其特性真值表。如表2,當致能線(Enable)狀態為High時,藉由輸入(Input)信號不同高低電位狀態改變,使得輸出(Output)產生不同的導通情況。例如EnableHighInputHigh時,OutputHighS1導通,負載應接在Output與地線GND之間,形成一迴路(正電源Vcc經過S1Output,經過負載回到GND)。同理如InputLow時,OutputLow,則負載應接在正電源VccOutput之間,形成一迴路(正電源Vcc經過負載,連到Output回到S2,再回到GND)。注意對於L293D僅需低壓小信號的輸入端而言,高於2.3V就算High,低於1.5V就算Low;輸出端的高電壓,當Vcc36V時,就會高於34V,非常High

2. L293D特性真值表

Enable

Input

Output輸出點的狀態

H

H

H,約為Vcc–1.8V,僅S1導通

H

L

L,約為GND+1.4V,僅S2導通

L

H/L

Z,高阻抗狀態,都不導通

PIC_SERVER板上的L293D裡面有4組半橋,如圖10,每兩組半橋對應一組EnableEnable1搭配IN1IN2Enable2搭配IN3IN4,而Enable都連接到+5V電源,電位狀態為High4組半橋分別由PIC18F4620單晶片的RC0RC1RC2、和RC54條線控制,4條輸出線(OUT1~4)分別連到接頭CN11CN124個點上,也分別接到M1AM1BM2A、和M2B4LED,以便用LED的亮度直接監看四個輸出點的平均電壓或馬達轉速。

10. L293D內部電路圖[L293D Datasheet]

例如在第2節最末提到把樂高玩具馬達的兩條線接到圖6CN12.1(GND)CN12.2(M2A),即負載接在L293D第二組半橋Output與地線GND之間,Input(PIN_RC2)=1時馬達轉動,Input(PIN_RC2)=0時馬達不轉。注意此種接線方式僅能控制馬達開關,不能控制馬達正反轉。

3.2 控制直流有刷馬達的轉速與方向

要控制直流馬達的轉速,可用前述LED的亮度控制之PWM波寬調制,可以直接採用2.3節之範例程式與接線方式,但不能控制馬達正反轉。控制馬達正反轉必須結合兩組半橋驅動器,如圖11所示,一個半橋驅動器有兩組電子開關,如S1S2或者S3S4,將直流馬達兩端接於這兩組半橋的輸出(Output),成為一個全橋驅動電路。Enable狀態都為High,當輸入Input_1HighS1導通,OUT1High)且Input_2LowS4導通,OUT2Low)時,形成一迴路(Vcc-S1-直流馬達-S4-GND),馬達正轉;同理當Input_1Low(S2導通,OUT1Low)Input_2High(S3導通,OUT2High),形成一迴路(Vcc-S3-直流馬達-S2-GND)。表3為其真值表。

11. 全橋驅動電路

3. 全橋驅動電路真值表

input_1

input_2

直流馬達負載

H

L

正轉,S1S4導通,S2S3不導通

L

H

反轉,端電壓同上但反向

H/L

H/L

快速停車

PIC_SERVER板上M1A(CN11.2)M1B(CN11.3)為一組全橋電路輸出,M2A(CN12.2)M2B(CN12.3)為另一組全橋電路輸出,可控制兩個馬達的轉速與方向。PIC_SERVER內建驅動馬達的函式如下

        motor(ch , speed)

其中ch變數代表馬達,speed表示模擬的速度,其值在-15~15間,正、負值表示不同的馬達轉動方向。其實此函數的核心也仍是set_pwm1_duty()(請參閱C:\YZ_PIC\Samples\Library_5.00\pic_SERVER\pic_SERVER_motors.c)。例如將玩具馬達兩端接在CN12.2(M2A)CN12.3(M2B),修改圖8程式之主程式main()如圖12,即可控制馬達轉速與運轉方向。

12. 使用motor(ch, speed)函數控制馬達轉速與方向

如果覺得L293D的電壓、電流不夠大,換顆UDN2998或是TA7257P[1],或是改用TECEL-D200[2]驅動器就好,功能完全相同,就是耐壓耐電流的性能以及保護功能有點差異罷了。表4為這幾款馬達驅動器特性比較表。

4. 幾款馬達驅動器特性比較表

 

ULN2003A

L293DNE

TA7257P

TECEL-D200

輸出級

達靈頓NPN開關,集極輸出

H電橋

推挽輸出

H電橋

推挽輸出

H電橋

推挽輸出

輸出點數

7

4

2

2

輸入點數

7

4

2

2

致能輸入線

0

2

0

1

最高馬達電壓(V)

50

36

8

55

最大連續電流(A)

0.5

0.6

1.5

10

最大瞬間電流(A)

NA

1.2

4.5

60

應用

直流馬達∕繼電器∕電磁閥(馬達只能單向轉動)

直流馬達∕繼電器∕電磁閥

直流馬達∕繼電器∕電磁閥

直流馬達∕繼電器∕電磁閥

4.     控制步進馬達的運轉方向與速度

直流馬達只有一組線圈兩條電線,常見的二相步進馬達有A/B兩組線圈,至少有A+A-B+、和B-4條接腳,若依照表51-2-3-4-1-2-3-4的激磁順序,則步進馬達正轉;若依1-4-3-2-1-4-3-2的順序激磁,則步進馬達反轉,每次旋轉一步進角(如1.8度)。

5. 步進馬達接腳激磁順序

 

二相步進馬達線圈

激磁步驟

A+

A-

B+

B-

1

+

-

+

-

2

+

-

-

+

3

-

+

-

+

4

-

+

+

-

使用在PIC_SERVER電路板上的L293D配合軟體程式,也可直接推步進馬達。將二相步進馬達A+A-B+、和B-4條線(使用三用電表,量測步進馬達任兩支接腳,有電阻值的兩支接腳為A+A-B+B-),分別接到M1AM1BM2A、和M2B,如圖13,並配合此接線撰寫程式,用PIC_SERVERRC0RC1RC2、和RC5依表5順序激磁這即可,程式碼如圖14(請參閱C:\YZ_PIC\Samples\Stepper\*.c裡面用於PIC_PROTO電路板的範例)。

13. 二相步進馬達與PIC_SERVER連接圖

14. 步進馬達控制程式碼

14中程式第59~65行為線圈激磁順序副程式stepper_driver(),判斷index1~4其中一種狀況時,便執行如表5的線圈激磁方式,C0=1的功能與output_high(PIN_C0)相同,都是控制該腳位呈現高電位狀態,而C0=0的功能與output_low(PIN_C0)相同,控制該腳位呈現低電位。

main()主程式裡,先使用set_tris_c()設定port C的腳位狀態,程式第71~79行為for迴圈,迴圈裡依序呼叫stepper_driver()副程式,依表51-2-3-4順序激磁。程式第7677行等待使用者按下鍵盤任何鍵時再繼續往下執行,此功能可幫助使用者觀察步進馬達步進運動狀態,也可觀察M1AM1BM2A、和M2B4LED燈的明滅順序是否依照表5所示,當驗證完畢時,可以把行數7677移除。For迴圈共執行100次,每次延遲50ms,如此便可控制步進馬達在5秒鐘內步進100步。

5.     用脈波軟體配合步進馬達專用驅動器來控制步進馬達

這一節中介紹市售步進馬達專用驅動器使用方式,並修改圖14程式碼,控制PIC_SERVER腳位產生脈波訊號,透過步進馬達專用驅動器控制步進馬達正反轉。

15EXD2015M步進馬達驅動器所提供的外型尺寸圖與接線圖。接線圖左下角有一指撥開關SW,表6為其設定說明。接線圖上方有兩組接腳,J1A連接控制器,即本文應用中的PIC_SERVERJ2A連接步進馬達,表7為其接腳說明。

15. EXD2015M外型尺寸圖與接線圖[http://www.extion.com.tw/]

6. 指撥開關SW設定說明

NO.

功能模式

OFF

ON

1

輸入信號方式

雙脈波方式

單脈波方式

2

步進角

0.9o/pulse

1.8o/pulse

3

自動電流降低

動作

不動作

4

 

 

7. 接腳說明

接頭

PIN NO.

名稱

功能說明

J1A(J1)

1

HOLD OFF-

(H)時馬達激磁OFF

2

HOLD OFF+

3

CCW-(CW/CCW -)

單脈波:旋轉方向輸入(H)時正轉
雙脈波:逆轉方向(CCW)輸入

4

CCW+(CW/CCW +)

5

CW-(PULSE -)

單脈波:脈波輸入
雙脈波:正轉方向(CW)輸入

6

CW+(PULSE +)

J2A(J2)

1

A

連接步進馬達

2

A/

3

B

4

B/

5

CA

6

CB

7

+24V

驅動電源輸入DC24~36V

8

GND

RUN旋鈕

電流設定旋鈕

步進馬達輸出電流調整

STOP旋鈕

電流設定旋鈕

步進馬達停止電流調整

16PIC_SERVER與步進馬達驅動器連接電路,不使用HOLD OFF功能,調整指撥開關為單脈波方式、0.9o/pulse、自動電流降低功能啟動。將PIC_SERVERM1A產生脈波訊號輸入至步進馬達驅動器的J1_6(CW+)M1B連接至J1_4,改變M1B的接腳電位狀態可控制步進馬達的正反轉。

16. PIC_SERVER與步進馬達驅動器連接電路

17的程式碼驅動步進馬達在1秒鐘之內正轉45度、停止2秒,再在1秒鐘之內反轉45度。圖17中程式第59~63行為步進馬達正轉副程式stepper_driver_cc(),判斷index1~2其中一種狀況時,M1A(PIN_C0)便改變其電位狀態,而M1B(PIN_C1)維持低電位狀態;程式第64~68行為步進馬達反轉副程式stepper_driver_ccw(),判斷index1~2其中一種狀況時,M1A(PIN_C0)便改變其電位狀態,而M1B(PIN_C1)維持高電位狀態。

主程式main()中先使用set_tris_c()指令設定port C腳位的輸出或輸入,第73行讓M1A(PIN_C0)M1B(PIN_C1)變成低電位狀態,程式第74~82行為for迴圈,迴圈裡依序呼叫stepper_driver_cc()副程式,同理,程式第86~94行為for迴圈,迴圈裡依序呼叫stepper_driver_ccw()副程式。第79~80行與91~92行為等待使用者按下鍵盤任一鍵時再繼續往下執行,可作為偵錯用途,觀察M1AM1BLED燈明滅以驗證程式。

17. 脈波產生程式碼

【實驗】

將玩具馬達兩端接在CN12.2(M2A)CN12.3(M2B),撰寫程式以PIC_SERVER板上的可變電阻VR1來控制馬達的轉速,以ICP按鍵控制馬達正反轉,在下週課堂上展示。