步進電機是機電控制中一種常用的執行機構,它的用途是將電脈沖轉化為角位移,通俗地說:當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度(及步進角)。通過控制脈沖個數即可以控制角位移量,從而達到準確定位的目的;同時通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。
T89C2051單片機驅動步進電機的電路和源碼
程序
stepper.c
stepper.hex
/*
* STEPPER.C
* sweeping stepper''s rotor cw and cww 400 steps
* Copyright (c) 1999 by W.Sirichote
*/
#include c:\mc51\8051io.h /* include i/o header file */
#include c:\mc51\8051reg.h
register unsigned char j,flag1,temp;
register unsigned int cw_n,ccw_n;
unsigned char step[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90}
#define n 400
/* flag1 mask byte
0x01 run cw()
0x02 run ccw()
*/
main()
{
flag1=0;
serinit(9600);
dISAble(); /* no need timer interrupt */
cw_n = n; /* initial step number for cw */
flag1 |=0x01; /* initial enable cw() */
while(1){
{
tick_wait(); /* wait for 10ms elapsed */
energize(); /* round-robin execution the following tasks every 10ms */
cw();
ccw();
}
}
}
cw(){
if((flag1&0x01)!=0)
{
cw_n--; /* decrement cw step number */
if (cw_n !=0)
j++; /* if not zero increment index j */
else
{flag1&=~0x01; /* dISAble cw() execution */
ccw_n = n; /* reload step number to ccw counter */
flag1 |=0x02; /* enable cww() execution */
}
}
}
ccw(){
if((flag1&0x02)!=0)
{
ccw_n--; /* decremnent ccw step number */
if (ccw_n !=0)
j--; /* if not zero decrement index j */
else
{flag1&=~0x02; /* dISAble ccw() execution */
cw_n = n; /* reload step number to cw counter */
flag1 |=0x01; /* enable cw() execution */
}
}
}
tick_wait(){ /* cputick was replaced by simpler ASM code 10ms wait */
asm" JNB TCON.5,*"; /* wait for TF0 set */
asm" CLR TCON.5"; /* clear TF0 for further set */
asm" ORL TH0,#$DC"; /* reload TH0 with $DC, TL0 = 0 */
}
energize(){
P1 = step[(j&0x07)]; /* only step 0-7 needed */
}
一、步進電機常識
常見的步進電機分三種:永磁式(PM),反應式(VR)和混合式(HB),永磁式步進一般為兩相,轉矩和體積較小,步進角一般為7.5度 或15度;反應式步進一般為三相,可實現大轉矩輸出,步進角一般為1.5度,但噪聲和振動都很大。在歐美等發達國家80年代已被淘汰;混合式步進是指混合了永磁式和反應式的優點。它又分為兩相和五相:兩相步進角一般為1.8度而五相步進角一般為 0.72度。這種步進電機的應用最為廣泛。
二、永磁式步進電機的控制
下面以電子愛好者業余制作中常用的永磁式步進電機為例,來介紹如何用單片機控制步進電機。
圖1是35BY型永磁步進電機的外形圖,圖2是該電機的接線圖,從圖中可以看出,電機共有四組線圈,四組線圈的一個端點連在一起引出,這樣一共有5根引出線。要使用步進電機轉動,只要輪流給各引出端通電即可。將COM端標識為C,只要AC、 C、BC、 C,輪流加電就能驅動步進電機運轉,加電的方式可以有多種,如果將COM端接正電源,那么只要用開關元件(如三極管),將A、 、B、 輪流接地。
下表列出了該電機的一些典型參數:
表1 35BY48S03型步機電機參數
型號 步距角 相數 電壓 電流 電阻 最大靜轉距 定位轉距 轉動慣量
35BY48S03 7.5 4 12 0.26 47 180 65 2.5
有了這些參數,不難設計出控制電路,因其工作電壓為12V,最大電流為0.26A,因此用一塊開路輸出達林頓驅動器(ULN2003)來作為驅動,通過 P1.4~P1.7來控制各線圈的接通與切斷,電路如圖3所示。開機時,P1.4~P1.7均為高電平,依次將P1.4~P1.7切換為低電平即可驅動步進電機運行,注意在切換之前將前一個輸出引腳變為高電平。如果要改變電機的轉動速度只要改變兩次接通之間的時間,而要改變電機的轉動方向,只要改變各線圈接通的順序。
圖1 35BY48S03型步進電機外形圖
圖2 35BY48S03型步進電機的接線圖
圖3 單片機控制35BY48S03型步進電機的電路原理圖
三、步進電機的驅動實例
要求:控制電路如圖3所示,開機后,電機不轉,按下啟動鍵,電機旋轉,速度為25轉/分,按下加1鍵,速度增加,按下減1鍵,速度降低,最高速度為100轉/分,最低轉帶為25轉/分,按下停止鍵,電機停轉。速度值要求在數碼管上顯示出來。
1.要求分析
按上面的分析,改變轉速,只要改變P1.0~P1.3輪流變低電平的時間即可達到要求,這個時間不應采用延時來實現,因為會影響到其他功能的實現。這里以定時的方式來實現。下面首先計算一下定時時間。
按要求,最低轉速為25轉/分,而上述步進電機的步距角為7.5,即每48個脈沖為1周,即在最低轉速時,要求為1200脈沖/分,相當于50ms/脈沖。而在最高轉速時,要求為100轉/分,即48000脈沖/分,相當于12.5ms/脈沖。可以列出下表
表1 步進電機轉速與定時器定時常數關系
速度 單步時間(us) TH1 TL1 實際定時(us)
25 50000 76 0 49996.8
26 48077 82 236 48074.18
27 46296 89 86 46292.61
28 44643 95 73 44640.155
… … … … …
100 12500 211 0 12499.2
表中不僅計算出了TH1和TL1,而且還計算出了在這個定時常數下,真實的定時時間,可以根據這個計算值來估算真實速度與理論速度的誤差值。
表中TH1和TL1是根據定時時間算出來的定時初值,這里用到的晶振是11.0592M。有了上述表格,程序就不難實現了,使用定時/計數器T1為定時器,定時時間到后切換輸出腳即可。
2.程序實現
定義DSB-1A實驗板的S1為啟動鍵,S2為停止鍵,S3為加1鍵,S4為減1鍵,程序如下:
StartEnd bit 01H ;起動及停止標志
MinSpd EQU 25 ;起始轉動速度
MaxSpd EQU 100 ;最高轉動速度
Speed DATA 23H ;流動速度計數
DjCount DATA 24H ;控制電機輸出的一個值,初始為11110 111
Hidden EQU 10H ;消隱碼
Counter DATA 57H ;顯示計數器
DISPBUF DATA 58H ;顯示緩沖區
ORG 0000H
AJMP MAIN
ORG 000BH
JMP DISP
ORG 001BH
JMP DJZD
ORG 30H
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
MOV A,#Hidden
MOV DispBuf,A
MOV DispBuf+1,A
MOV DispBuf+2,A
MOV DjCount,#11110111B
MOV SPEED,#MinSpd ;起始轉動速度送入計數器
CLR StartEnd ;停轉狀態
MOV TMOD,#00010001B ;
MOV TH0,#HIGH(65536-3000)
MOV TL0,#LOW(65536-3000)
MOV TH1,#0FFH;
MOV TL1,#0FFH
SETB TR0
SETB EA
SETB ET0
SETB ET1
LOOP: ACALL KEY ;鍵盤程序
JNB F0,m_NEXT1 ;無鍵繼續
ACALL KEYPROC ;否則調用鍵盤處理程序
m_NEXT1:
MOV A,Speed
MOV B,#10
DIV AB
MOV DispBuf+5,B ;最低位
MOV B,#10
DIV AB
MOV DispBuf+4,B
MOV DispBuf+3,A
JB StartEnd,m_Next2
CLR TR1 ;關閉電機
JMP LOOP
ORL P1,#11110000B
m_Next2:
SETB TR1 ;啟動電機
AJMP LOOP ;主程序結束
;---------------------------------------
D10ms:
……
;---------延時程序,鍵盤處理中調用
KEYPROC:
MOV A,B ;獲取鍵值
JB ACC.2,StartStop ;分析鍵的代碼,某位被按下,則該位為1
JB ACC.3,KeySty
JB ACC.4,UpSpd
JB ACC.5,DowSpd
AJMP KEY_RET
StartStop:
SETB StartEnd ;啟動
AJMP KEY_RET
KeySty:
CLR StartEnd; ;停止
AJMP KEY_RET
UpSpd:
INC SPEED;
MOV A,SPEED
CJNE A,#MaxSpd,K1 ;到了最多的次數?
DEC SPEED ;是則減去1,保證下次仍為該值
K1:
AJMP KEY_RET
DowSpd:
DEC SPEED
MOV A,SPEED
CJNE A,#MAXSPD,KEY_RET ;不等(未到最大值),返回
MOV SPEED,#MinSpd;
KEY_RET:
RET
KEY:
……獲取鍵值的程序
RET
DjZd: ;定時器T1用于電機轉速控制
PUSH ACC
PUSH PSW
MOV A,Speed
SUBB A,#MinSpd ;減基準數
MOV DPTR,#DjH
MOVC A,@A+DPTR
MOV TH1,A
MOV A,Speed
SUBB A,#MinSpd
MOV DPTR,#DjL
MOVC A,@A+DPTR
MOV TL1,A
MOV A,DjCount
CPL A
ORL P1,A
MOV A,DjCount
JNB ACC.7,d_Next1
JMP d_Next2
d_Next1:
MOV DjCount,#11110111B
d_Next2:
MOV A,DjCount
RL A
MOV DjCount,A ;回存
ANL P1,A
POP PSW
POP ACC
RETI
DjH: DB 76,82,89,95,100,106,110,115,119,123,12……
DjL: DB 0,236,86,73,212,0,214,96,163,165
……
DISP: ;顯示程序
POP PSW
POP ACC
……
RETI
BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH
DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
END
3.程序分析
本程序主要由鍵盤程序、顯示器程序、步進電機驅動程序三部份組成,主程序首先初始化各變量,將顯示器的高3位消隱,步進電機驅動的各引腳均輸出高電平,然后調用鍵盤程序,并作判斷,如果有鍵按下,則調用鍵盤處理程序,否則直接轉下一步。下一步是將當前的轉速值轉換為BCD碼,送入顯示緩沖區;接著判斷 StartEnd這個位變量,是“1”還是“0”,如果是“1”,則開啟定時器T1,否則關閉定時器T1,為防止關閉時某一相線圈長期通電,因此,在關閉定時器T1時,將P1.0~P1.3均置高。至此,主程序的工作即結束。這里為簡便起見,這里沒有做高位“0”消隱的工作,即如果速度為10轉/分,則顯示值“010”,讀者可以自行加入相關的代碼來處理這一工作。
步進電機的驅動工作是在定時器T1的中斷服務程序中實現的,由前述分析,每次的定時時間到達以后,需要將P1.0~P1.3依次接通,程度中用了一個變量DjCntr來實現這一功能,在主程序初始化時,該變量被賦予初值 11110111B,進入到定時中斷以后,將該變量取出送ACC累加器,并在累加器中進行左移,這樣,該數值就變為1110 1111,然后將該數與P1 相“與”,此時,P1.4即輸出低電平,第二次進入中斷時,先將該數取反,成為 0001 0000,然后將該數與P1相“或”,這樣,P1.4即輸出高電平,關斷了相應的線圈,然后將該數重新取出,并作左移,即 1110,1111右移成為1101 1111,將該數與P1相“與”,這樣P1.5即輸出低電平,依次類推,P1.7~P1.4即循環輸出低電平。當這一數據變為0111 1111后,需要作適當的改動,將數據重新變回 1111 0111,進行第二次循環,相關代碼,請讀者自行分析。
定時時間又是如何確定的呢?這里用的是查表的方法,首先用Excel計算得出在每一種轉速下的TH值和TL值,然后,分別放入DjH和DjL表中,在進入T1中斷程序之后,將速度值變量Speed送入累加器ACC,然后減去基數25,使其基數從 0開始計數,然后分別查表,送入TH1和TL1,實現重置定時初值的目的。
看完這一部份內容以后,請讀者自行完成以下工作:
1. 更改程序,將S1定義為“啟動/停止”,而S2定義為“方向”,按下S2,切換電機旋轉方向。
2. 更改程序,要求轉速從1到100。
3. 更改程序,實現首位無效零消隱
-----------------------------------------------3--------------------------------------------
步進電機的單片機控制
作者:李通 劉志垠
摘要:本設計采用凌陽16 位單片機SPCE061A對步進電機進行控制,通過IO口輸出的具有時序的方波作為步進電機的控制信號,信號經過芯片L298N驅動步進電機;同時,用 4X4的鍵盤來對電機的狀態進行控制,并用數碼管顯示電機的轉速,采用74LS164作為4位單個數碼管的顯示驅動,從單片機輸入信號;利用凌陽單片機的語音功能播報電機的轉速。
關鍵詞: 步進電機 單片機 數碼管
一、 方案論證與比較
1、 本設計的重點在于對步進電機的控制和驅動,設計中受控電機為四相六線制的步進電機(內阻33歐,步進1.8度,額定電壓12V)
方案一:使用多個功率放大器件驅動電機
通過使用不同的放大電路和不同參數的器件,可以達到不同的放大的要求,放大后能夠得到較大的功率。但是由于使用的是四相的步進電機,就需要對四路信號分別進行放大,由于放大電路很難做到完全一致,當電機的功率較大時運行起來會不穩定,而且電路的制作也比較復雜。
方案二:使用L298N芯片驅動電機
L298N芯片可以驅動兩個二相電機(如圖1-1),也可以驅動一個四相電機,輸出電壓最高可達50V,可以直接通過電源來調節輸出電壓;可以直接用單片機的IO口提供信號;而且電路簡單,使用比較方便。
圖1-1
通過比較,使用L298N芯片充分發揮了它的功能,能穩定地驅動步進電機,且價格不高,故選用L298N驅動電機。而使用L298N時,可以用L297來提供時序信號,可以節省單片機IO口的使用;也可以直接用單片機模擬出時序信號,由于控制并不復雜,故選用后者。
2、 數碼管顯示電路的設計
方案一:串行接法
設計中要顯示4位數字,用74LS164作為顯示驅動,其中帶鎖存,使用串行接法可以節約IO口資源,但要使用SIO,發送數據時容易控制。
方案二:并行接法
使用并行接法時要對每個數碼管用IO口單獨輸入數據,占用資源較多。
由于設計中用一塊單片機進行控制,資源有限,選擇了方案一。另外,使用鎖存也起到節約資源的作用。
二、步進電機控制原理
步進電機是數字控制電機,它將脈沖信號轉變成角位移,即給一個脈沖信號,步進電機就轉動一個角度,因此非常適合于單片機控制。步進電機可分為反應式步進電機(簡稱VR)、永磁式步進電機(簡稱PM)和混合式步進電機(簡稱HB)。
步進電機區別于其他控制電機的最大特點是,它是通過輸入脈沖信號來進行控制的,即電機的總轉動角度由輸入脈沖數決定,而電機的轉速由脈沖信號頻率決定。
步進電機的驅動電路根據控制信號工作,控制信號由單片機產生。其基本原理作用如下:
(1)控制換相順序
通電換相這一過程稱為脈沖分配。例如:三相步進電機的三拍工作方式,其各相通電順序為A-B-C-D,通電控制脈沖必須嚴格按照這一順序分別控制A,B,C,D相的通斷。
(2)控制步進電機的轉向
如果給定工作方式正序換相通電,步進電機正轉,如果按反序通電換相,則電機就反轉。
(3)控制步進電機的速度
如果給步進電機發一個控制脈沖,它就轉一步,再發一個脈沖,它會再轉一步。兩個脈沖的間隔越短,步進電機就轉得越快。調整單片機發出的脈沖頻率,就可以對步進電機進行調速。
三、理論設計
綜和以上選取的方案,總的流程如圖3-2所示。
圖3-1
1、步進電機驅動電路
通過L298N構成步進電機的驅動電路,電路圖如圖3-2所示。
通過單片機SPCE061A的IOB8~IOB13對L298N的IN1~IN4口和ENA、ENB口發送方波脈沖信號,起時序圖如圖3-3所示。
圖3-2
圖3-3
2、數碼管顯示電路的設計
數碼管的顯示驅動使用74LS164,通過SPCE061A的IOB0和IOB1口對DATA和CLK發送數據。
圖3-4
3、4x4鍵盤電路
在設計中,使用了標準的4x4鍵盤,其電路圖如圖3-5所示。單片機的A口低8位為鍵盤的接口。盡管設計要求中只需要4個鍵對步進電機的狀態進行控制,但考慮到對控制功能的擴展,我們使用了4x4的鍵盤。
圖3-5
四、程序設計
在進行程序設計的過程中,主要分為五個部分:雙機通訊、語音報數、數字顯示、步進電機驅動、鍵盤;其中雙機通訊的實現和語音報時比較有特點,將其流程簡要介紹如下,其他部分見附的程序。
1、雙機通訊
圖4-1
我們在實現雙機通訊的過程中使用了“三次握手”的方式,這是Intle網中成用的數據通訊確認協議,其流程圖如圖4-1所示。
2、語音報數
程序設計中語音報數使用的是SACM-A2000,考慮到程序比較簡單,首先使用了自動報數方式,但發現不能進行連續報數,于是使用了非自動方式,流程圖如圖4-2所示。
圖4-2
五、結果分析與總結
應該說這次課程設計還是基本達到了設計的要求,但是也存在著未能解決的問題,由于在執行語音程序時對資源的消耗比較大,在語音報數的時候會中斷步進電機驅動信號的輸出,導致電機停轉。為此,我們修改了方案,使用了兩塊單片機,通過雙機通訊來傳遞信號,遺憾的是問題仍然沒有得到解決。
這次步進電機的綜合實驗我們學到了步進電機、數碼管、4*4鍵盤、語音報數和雙機通訊的使用,更重要的是學會了程序出問題時調試的方法,并養成了Debug的習慣,學到了程序出問題后怎樣去解決的基本方法。
蘇州永節電子科技有限公司專業控制板設計,單片機開發。