步進(jìn)電機(jī)是將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元件。在非超載的情況下,電機(jī)的轉(zhuǎn)速、停止的位置只取決于脈沖信號的頻率和脈沖數(shù),而不受負(fù)載變化的影響,即給電機(jī)加一個脈沖信號,電機(jī)則轉(zhuǎn)過一個步距角。這一線性關(guān)系的存在,加上步進(jìn)電機(jī)只有周期性的誤差而無累積誤差等特點(diǎn)。使得在速度、位置等控制領(lǐng)域用步進(jìn)電機(jī)來控制變的非常的簡單。
步進(jìn)電機(jī)的調(diào)速一般是改變輸入步進(jìn)電機(jī)的脈沖的頻率來實(shí)現(xiàn)步進(jìn)電機(jī)的調(diào)速,因?yàn)椴竭M(jìn)電機(jī)每給一個脈沖就轉(zhuǎn)動一個固定的角度,這樣就可以通過控制步進(jìn)電機(jī)的一個脈沖到下一個脈沖的時間間隔來改變脈沖的頻率,延時的長短來具體控制步進(jìn)角來改變電機(jī)的轉(zhuǎn)速,從而實(shí)現(xiàn)步進(jìn)電機(jī)的調(diào)速,本文主要介紹基于單片機(jī)的步進(jìn)電機(jī)轉(zhuǎn)速控制設(shè)計詳解,文章最后附上程序。
基于單片機(jī)的步進(jìn)電機(jī)轉(zhuǎn)速控制設(shè)計詳解
本次設(shè)計以CPU選用89C5l作為步進(jìn)電機(jī)的控制芯片.89C51的結(jié)構(gòu)簡單并可以在編程器上實(shí)現(xiàn)閃爍式的電擦寫達(dá)幾萬次以上.使用方便等優(yōu)點(diǎn),而且完全兼容MCS5l系列單片機(jī)的所有功能。AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROM—FAlsh ProgrAmmABle And ErAsABle ReAd Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機(jī)。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。
顯示電路的用8279芯片來驅(qū)動,8279芯片分別接兩排顯示器,每排為4位顯示,分別用來顯示步進(jìn)電機(jī)的實(shí)際轉(zhuǎn)速與給定轉(zhuǎn)速。
8279與CPU的連接框圖如4-11所示:
8279芯片的具體介紹如下;
1) DB0~DB7:雙向數(shù)據(jù)總線。在CPU于827數(shù) 據(jù)與命令的傳送。
2) CLK:8279的系統(tǒng)時鐘,100KHZ為最佳選擇。
3) RESET:復(fù)位輸入線,高電平有效。當(dāng) RESET 輸入端出現(xiàn)高電平時,8279被初始復(fù)位。
4) /CS:片選信號。低電平使能,使能時可將命令寫入8279或讀取8279的數(shù)據(jù)。
5) A0:用于區(qū)分信息的特性。當(dāng)A0=1時,CPU向8279寫入命令或讀取8279的狀態(tài);當(dāng)A0為0時,讀寫一數(shù)據(jù)。
6) /RD:讀取控制線。/RD=0,8279會送數(shù)據(jù)至外部總線。
7) /WR:寫入控制線。/WR=0,8279會從外部總線捕捉數(shù)據(jù)。
8) IRQ:中斷請求輸出線,高電平有效。當(dāng)FIFO RAM 緩沖器中存有鍵盤上閉合鍵的鍵碼時,IRQ線升高,向CPU請求中斷,當(dāng)CPU將緩沖器中的輸入鍵數(shù)的數(shù)據(jù)全部讀取時,中斷請求線下降為低電平。
9) L0~SL3:掃描輸出線,用于對鍵盤顯示器掃 描。可以是編碼模式(16對1)或譯碼模式(4對1)。
10) ~RL7:反饋輸入線,由內(nèi)部拉高電阻拉成高電平,也可由鍵盤上按鍵拉成低電平。
11) FT、CNTL/STB :控制鍵輸入線,由內(nèi)部拉高電 阻拉成高電平,也可由外部控制按鍵拉成低電平。
12) TB0~3、OUTA0~3:顯示段數(shù)據(jù)輸出線,可分別作為兩個半字節(jié)輸出,也可作為8位段數(shù)據(jù)輸出口,此時OUTB0為最低位, OUTA3位最高位。
13) 消隱輸出線,低電平有效。當(dāng)顯示器切換時或使用消隱命令時,將顯示消隱。
8279的初始化程序如下:
INIT:MOV DPTR,#7FFFH ;置8279命令/狀態(tài)口地址
MOV A,#0D1H ;置清顯示命令字
MOVX @DPTR,A ;送清顯示命令
WEIT:MOVX A,@DPTR ;讀狀態(tài)
JB ACC.7,WEIT ;等待清顯示RAM結(jié)束
MOV A,#34H ;置分頻系數(shù),晶振12MHz
MOVX @DPTR,A ;送分頻系數(shù)
MOV A,#00H ;置鍵盤/顯示命令
MOVX @DPTR,A ;送鍵盤/顯示命令
MOV IE,#84H ;允許8279中斷
RET
顯示子程序如下:
DIS:MOV DPTR,#7FFFH ;置8279命令/狀態(tài)口地址
MOV R0,#30H ;字段碼首地址
MOV R7,#08H ;8位顯示
MOV A,#90H ;置顯示命令字
MOVX @DPTR,A ;送顯示命令
MOV DPTR,#7FFEH ;置數(shù)據(jù)口地址
LP:MOV A,@R0 ;取顯示數(shù)據(jù)
ADD A,#6 ;加偏移量
MOVC A,@A+PC ;查表,取得數(shù)據(jù)的段碼
MOVX @DPTR,A ;送段碼顯示
INC R0 ;調(diào)整數(shù)據(jù)指針
DJNZ R7,LP ;
RET
SEG:DB 3FH,06H,5BH,4FH,66H,6DH
;字符0、1、2、3、4、5段碼
DB 7DH,07H,7EH,6FH,77H,7CH
;字符6、7、8、9、A、B段碼
DB 39H,5EH,79H,71H,73H,3EH
;字符C、d、E、F、P、U段碼
DB 76H,38H,40H,6EH,F(xiàn)FH,00H
;字符H、L、-、Y、“空”段碼
鍵盤中斷子程序如下:
KEY:PUSH PSW
PUSH DPL
PUSH DPH
PUSH ACC
PUSH B
SETB PSW.3
MOV DPTR,#7FFFH ;置狀態(tài)口地址
MOVX A,@DPTR ;讀FIFO狀態(tài)
ANL A,#0FH ;
JZ PKYR ;
MOV A,#40H ;置讀FIFO命令
MOVX @DPTR,A ;送讀FIFO命令
MOV DPTR,#7FFEH ;置數(shù)據(jù)口地址
MOVX A,@DPTR ;讀數(shù)據(jù)
LJMP KEY1 ;轉(zhuǎn)鍵值處理程序
PKYR: POP B
POP ACC
POP DPH
POP DPL
POP PSW
RETI ;
KEY1: … … ;鍵值處理程序
鍵盤程序清單:
KEY1: ACALL KS1 ; 有無鍵按下子程序
JNZ LK1 ;有鍵按下,轉(zhuǎn)去抖延時
AJMP KEY1 ;無鍵按下,繼續(xù)掃描
LK1: ACALL DELA12 ;12ms延時程序調(diào)用
ACALL KS1 ;判斷鍵是否真正按下
JNZ LK2 ;有鍵按下,轉(zhuǎn)逐列掃描
AJMP KEY1 ;無鍵按下,繼續(xù)掃描
LK2: MOV R2,#0FEH ;設(shè)置首列掃描字
MOV R4,#00H ;保存首列號
LK4: MOV DPTR,#7F01H;列掃描字送至PA口
MOV A,R2
MOVX @DPTR,A
INC DPTR ;指向PC口
INC DPTR
MOVX A,@DPTR ;讀入行狀態(tài)
JB ACC.0,LONE ;第0行無鍵按下,轉(zhuǎn)LONE
MOV A,#00H ;有鍵按下,設(shè)置行首鍵號
AJMP LKP ;轉(zhuǎn)求鍵號
LONE: JB ACC.1,LTWO ;第1行無鍵按下,轉(zhuǎn)LTWO
MOV A,#08H ;有鍵按下,設(shè)置行首鍵號
AJMP LKP ;轉(zhuǎn)求鍵號
LTWO: JB ACC.2,LTHR ;第2行無鍵按下,轉(zhuǎn)LTHR
MOV A,#10H ;有鍵按下,設(shè)置行首鍵?
AJMP LKP ;轉(zhuǎn)求鍵號
LTHR: JB ACC.3,NEXT ;第3行無鍵按下,查下一列
MOV A,#18H ;有鍵按下,設(shè)置行首鍵
LKP: ADD A,R4 ;求鍵號,鍵號=行首鍵號+列號
PUSH ACC ;保護(hù)鍵號
LK3: ACALL KS1 ;等待鍵釋放
JNZ LK3 ;鍵未釋放,繼續(xù)等待
POP ACC ;鍵釋放,鍵號送A
AJMP OVER ;鍵掃描結(jié)束
NEXT: INC R4 ;列號加1,指向下一列
MOV A,R2 ;判斷8列掃描完否
JNB ACC.7,KND ;8列掃描完,繼續(xù)
RL A ;掃描字左移一位
MOV R2,A ;送掃描字
AJMP LK4 ;轉(zhuǎn)下一列掃描
KND: AJMP KEY1
OVER: RET ;鍵掃描結(jié)束
KS1: MOV DPTR,#7F01H ;指向PA口
MOV A,#00H ;設(shè)置掃描字
MOVX @DPTR,A ;掃描字送PA口
INC DPTR ;指向PC口
INC DPTR
MOVX A,@DPTR ;讀入PC口狀態(tài)
CPL ;以高電平表示有鍵按下
ANL A,#0FH ;屏蔽高4位
RET
初始化程序如下:
INIT:MOV DPTR,#7FFFH ;置8279命令/狀態(tài)口地址
MOV A,#0D1H ;置清顯示命令字
MOVX @DPTR,A ;送清顯示命令
WEIT:MOVX A,@DPTR ;讀狀態(tài)
JB ACC.7,WEIT ;等待清顯示RAM結(jié)束
MOV A,#34H ;置分頻系數(shù),晶振12MHz
MOVX @DPTR,A ;送分頻系數(shù)
MOV A,#00H ;置鍵盤/顯示命令
MOVX @DPTR,A ;送鍵盤/顯示命令
MOV IE,#84H ;允許8279中斷
RET
顯示子程序如下:
DIS:MOV DPTR,#7FFFH ;置8279命令/狀態(tài)口地址
MOV R0,#30H ;字段碼首地址
MOV R7,#08H ;8位顯示
MOV A,#90H ;置顯示命令字
MOVX @DPTR,A ;送顯示命令
MOV DPTR,#7FFEH ;置數(shù)據(jù)口地址
LP:MOV A,@R0 ;取顯示數(shù)據(jù)
ADD A,#6 ;加偏移量
MOVC A,@A+PC ;查表,取得數(shù)據(jù)的段碼
MOVX @DPTR,A ;送段碼顯示
INC R0 ;調(diào)整數(shù)據(jù)指針
DJNZ R7,LP ;
RET
鍵盤中斷子程序如下:
KEY:PUSH PSW
PUSH DPL
PUSH DPH
PUSH ACC
PUSH B
SETB PSW.3
MOV DPTR,#7FFFH ;置狀態(tài)口地址
MOVX A,@DPTR ;讀FIFO狀態(tài)
ANL A,#0FH ;
JZ PKYR ;
MOV A,#40H ;置讀FIFO命令
MOVX @DPTR,A ;送讀FIFO命令
MOV DPTR,#7FFEH ;置數(shù)據(jù)口地址
MOVX A,@DPTR ;讀數(shù)據(jù)
LJMP KEY1 ;轉(zhuǎn)鍵值處理程序
PKYR: POP B
POP ACC
POP DPH
POP DPL
POP PSW
RETI ;
驅(qū)動電路子程序的設(shè)計
PUSH:MOV R3 , # NUM
PUSH A
PUSH PSW
LOOP: SETB P1.0
ACALL DELAY1
CLR P1.0
ACALL DELAY2
DJNZ R3,LOOP
POP PSW
POP A
RET
延時子程序的設(shè)計
MOV R2,#18H
LCALL 7FEBH
RET
ORG 7FEBH ;通用延時子程序
(07EBH & 0FEBH & 。。。)
L7FEB: PUSH 02H ;R2(復(fù)位后R2即為02H)存放時間常數(shù),進(jìn)棧保護(hù)
L7FED: PUSH 02H ; R2進(jìn)棧保護(hù)
L7FEF: PUSH 02H ; 進(jìn)棧
L7FF1: DJNZ R2,$ ;R2不為零等待
POP 02H ;出棧
DJNZ R2,L7FEF ; R2不為零轉(zhuǎn)
POP 02H ; 出棧
DJNZ R2,L7FED ; R2不為零轉(zhuǎn)
POP 02H ; 出棧
DJNZ R2,L7FEB ; R2不為零轉(zhuǎn)
RET ;子程序返回
END
圖6-4-1 主程序流程圖
主程序如下:
CON: MOV R3, # N
MOV TMOD , # 10H
MOV TL1 , # LOW
MOV TH1 , # H IGH
JNB FLAG ,LEFT
MOV R0 , RM
AJMP TIME - S
LEFT: MOV R0 , LM
TIME: SETB EA
SETB ET1
SETB TR1
步進(jìn)電機(jī)控制程序p3.2正轉(zhuǎn),p3.3反轉(zhuǎn),p3.4停止 步進(jìn)電機(jī)接p1.0p1.1p1.2p1.3
org 00h
stop: orl p1,#0ffh ; 步進(jìn)電機(jī)停止
loop:jnB p3.2,for2 ; 如果p3.2按下正轉(zhuǎn)
jnB p3.3,rev2 ; 如果p3.3按下反轉(zhuǎn)
jnB p3.4,stop1 ; 如果p3.4按下停止
jmp loop ;反復(fù)監(jiān)測鍵盤
for: mov r0,#00h ;正轉(zhuǎn)到tAB取碼指針初值
for1:mov A,r0 ;取碼
mov dptr,#tABle ;
movC A,@A+dptr
jz for ;是否到了結(jié)束碼00h
Cpl A ;把ACC反向
mov p1,A ;輸出到p1開始正轉(zhuǎn)
jnB p3.4,stop1 ; 如果p3.4按下停止
jnB p3.3,rev2 ; 如果p3.3按下反轉(zhuǎn)
CAll delAy ;轉(zhuǎn)動的速度
inC r0 ;取下一個碼
jmp for1 ;繼續(xù)正轉(zhuǎn)
rev:mov r0,#05h ;反轉(zhuǎn)到tAB取碼指針初值
rev1:mov A,r0
mov dptr,#tABle ;取碼
movC A,@A+tABle
jz rev ;是否到了結(jié)束碼00h
Cpl A ;把ACC反向
mov p1,A ;輸出到p1開始反轉(zhuǎn)
jnB p3.4,stop1 ; 如果p3.4按下停止
jnB p3.3,rev2 ; 如果p3.3按下反轉(zhuǎn)
CAll delAy ;轉(zhuǎn)動的速度
inC r0 ;取下一個碼
jmp rev1 ;繼續(xù)反轉(zhuǎn)
stop1:CAll delAy ; 按p3.4的消除抖動
jnB p3.4,$ ; p3.4放開否?
CAll delAy ;放開消除抖動
jmp stop
for2:CAll delAy ; 按p3.2的消除抖動
jnB p3.2,$ ; p3.2放開否?
CAll delAy ;放開消除抖動
jmp for
rev2:CAll delAy ; 按p3.3的消除抖動
jnB p3.3,$ ; p3.3放開否?
CAll delAy ;放開消除抖動
jmp rev
delAy:mov r1,#40 ;步進(jìn)電機(jī)的轉(zhuǎn)速20ms
d1:mov r2,#248
djnz r2,$
djnz r1,d1
ret
tABle:
dB 03h,09h,0Ch,06h ;正轉(zhuǎn)表
dB 00 ;正轉(zhuǎn)結(jié)束
dB 03h,06h,0Ch,09h ;反轉(zhuǎn)
dB 00 ;反轉(zhuǎn)結(jié)束
end
步進(jìn)電機(jī)正反快慢程序
org 00h
x1:mov r3,#48 ;一圈48步
stArt:mov r0,#00h ;正轉(zhuǎn)取碼初值
stArt1:
mov p1,#0ffh ;先停止
mov A,r0
mov dptr,#tABle
movC A,@A+dptr
jz stArt ;是否到了結(jié)束碼00?
Cpl A
mov p1,A ;輸出運(yùn)轉(zhuǎn)
CAll delAy ;調(diào)用慢速的延時轉(zhuǎn)動
inC r0 ;取碼指針加1取下一個碼
djnz r3,stArt1 ;是否走了48步?
mov r3,#48 ;是則重新設(shè)定48步
stArt2:
mov p1,#0ffh
mov r0,#05 ;逆轉(zhuǎn)的取碼初值
stArt3:mov A,r0
mov dptr,#tABle
movC A,@A+dptr
jz stArt2
Cpl A
mov p1,A
CAll delAy2
inC r0
djnz r3,stArt3
jmp x1 ; 重復(fù)開始
DELAY: ; 延時程序 (慢速)
MOV R7,#255
D1:MOV R6,#50
D2: DJNZ R6,D2
DJNZ R7,D1
RET
DELAY2: ; 延時程序 (快速)
MOV R5,#255
D3:MOV R2,#25
D4: DJNZ R2,D4
DJNZ R5,D3
RET
tABle:
dB 03h,09h,0Ch,06h ;正轉(zhuǎn)表
dB 00
dB 06h,0Ch,09h,03h ;反轉(zhuǎn)表
dB 00
end
中斷服務(wù)程序如下:
INTTO: PUSH A
PUSH PSW
MOV A , @R0
MOV P1 ,A
INC R0
MOV A , # 00H
XRL A , @R0
JNZ NEXT
MOV A , R0
CLR C
SUBB A , # 03H
MOV R0 , A
NEXT: DJNZ R3 , RETU
CLR ET1
CLR EA
RETU: POP PSW
POP A
RETI
利用軟件形成脈沖序列的程序清單:
PULSE_S: MOV R7,#NUM ;設(shè)定脈沖個數(shù)
PUSH A ;保護(hù)現(xiàn)場
PUSH PSW
LOOP: SETB P1.0 ;輸出高電平
ACALL DELAY1 ;延時
CLR P1.0 ;輸出低電平
ACALL DELAY2 ;延時
DJNZ R7,LOOP ;R7≠0,繼續(xù)輸出脈沖
POP PSW ;恢復(fù)現(xiàn)場
POP A
RET
定時中斷子程序
TIME0: CLR EA ;關(guān)中斷
INC 30H
MOV A,30H
XRL A,#50H ;判斷是否到8秒
JZ S_8 ;8秒定時到,轉(zhuǎn)至S_8
AJMP RECOUN ;未到8秒,繼續(xù)計時
S_8: SETB P3.2 ;觸發(fā)外部中斷0
NOP
CLR P3.2
NOP
RECOUN: MOV TH0,#3CH
MOV TL0,#0B0H ;設(shè)定定時器初值
SETB EA ;開中斷
RETI ;中斷返回
中斷子程序
T_CON: PUSH A ;保護(hù)現(xiàn)場
PUSH PSW
MOV R7,#N ;設(shè)定控制步數(shù)
JNB FLAG,LEFT ;判斷旋轉(zhuǎn)方向
RIGHT: MOV R0,RM ;正轉(zhuǎn)模型起始地址
AJMP ROTATE
LEFT: MOV R0,LM
ROTATE: MOV A,@R0 ;取第一拍控制模型
MOV P1,A ;輸出第一拍控制模型
ACALL DELAY1 ;延時
INC R0
MOV A,@R0 ;取第二拍控制模型
MOV P1,A ;輸出第二拍控制模型
ACALL DELAY1 ;延時
INC R0
MOV A,@R0 ;取第三拍控制模型
MOV P1,A ;輸出第三拍控制模型
ACALL DELAY1 ;延時
DJNZ R7,ROTATE ;未走完要求的步數(shù),繼續(xù)
POP PSW ;恢復(fù)現(xiàn)場
POP A
RET ;返回
評論
查看更多