深圳德科智控是一家專注步進電機驅動器非標定制的生產廠家!
當前位置:步進電機 > 技術中心 >

單片機步進電機控制程序【詳解】

單片機步進電機控制程序大家都很關心,也有涉及到很多步進控制專業知識,德科智控步進電機整理了相關資料,供大家參考:

  基于單片機的步進電機轉速控制設計詳解

  本次設計以CPU選用89C5l作為步進電機的控制芯片.89C51的結構簡單并可以在編程器上實現閃爍式的電擦寫達幾萬次以上.使用方便等優點,而且完全兼容MCS5l系列單片機的所有功能。AT89C51是一種帶4K字節閃爍可編程可擦除只讀存儲器(FPEROM—FAlsh ProgrAmmABle And ErAsABle ReAd Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。

  顯示電路的用8279芯片來驅動,8279芯片分別接兩排顯示器,每排為4位顯示,分別用來顯示步進電機的實際轉速與給定轉速。

  正轉控制電機-相勵磁法

  單片機的I/O口驅動電流較小,一般無法直接驅動步進電機,圖9-10采用ULN2003作為步進電機的驅動芯片,ULN2003工作電壓高,工作電流大,灌電流可達500mA,并且能夠在關狀態時承受50V的電壓,輸出還可以在高負載電流并行運行。只需按表9-2(c)的8個步序向P1口發送數據,通過ULN2003的驅動,即可實現步進電機按1-2相勵磁法正轉運行。

步進電機正轉控制

 

  步進電機如何進行正反轉控制:

  利用接在單片機P3.7口的開關對步進電機的正反轉進行控制,當開關閉合時,步進電機正轉運行,當開關斷開時,步進電機反轉運行。此處采用1相勵磁法。步進電機正反轉控制電路如圖9-11所示。

  步進電機正反轉控制電路圖

步進電機正反轉控制圖
 

  步進電機是將電脈沖信號轉變為角位移或線位移的開環控制元件。在非超載的情況下,電機的轉速、停止的位置只取決于脈沖信號的頻率和脈沖數,而不受負載變化的影響,即給電機加一個脈沖信號,電機則轉過一個步距角。這一線性關系的存在,加上步進電機只有周期性的誤差而無累積誤差等特點。使得在速度、位置等控制領域用步進電機來控制變的非常的簡單。

  步進電機的調速一般是改變輸入步進電機的脈沖的頻率來實現步進電機的調速,因為步進電機每給一個脈沖就轉動一個固定的角度,這樣就可以通過控制步進電機的一個脈沖到下一個脈沖的時間間隔來改變脈沖的頻率,延時的長短來具體控制步進角來改變電機的轉速,從而實現步進電機的調速,

 

  8279芯片的具體介紹如下:

  1) DB0~DB7:雙向數據總線。在CPU于827數 據與命令的傳送。

  2) CLK:8279的系統時鐘,100KHZ為最佳選擇。

  3) RESET:復位輸入線,高電平有效。當 RESET 輸入端出現高電平時,8279被初始復位。

  4) /CS:片選信號。低電平使能,使能時可將命令寫入8279或讀取8279的數據。

  5) A0:用于區分信息的特性。當A0=1時,CPU向8279寫入命令或讀取8279的狀態;當A0為0時,讀寫一數據。

  6) /RD:讀取控制線。/RD=0.8279會送數據至外部總線。

  7) /WR:寫入控制線。/WR=0.8279會從外部總線捕捉數據。

  8) IRQ:中斷請求輸出線,高電平有效。當FIFO RAM 緩沖器中存有鍵盤上閉合鍵的鍵碼時,IRQ線升高,向CPU請求中斷,當CPU將緩沖器中的輸入鍵數的數據全部讀取時,中斷請求線下降為低電平。

  9) L0~SL3:掃描輸出線,用于對鍵盤顯示器掃 描。可以是編碼模式(16對1)或譯碼模式(4對1)。

  10) ~RL7:反饋輸入線,由內部拉高電阻拉成高電平,也可由鍵盤上按鍵拉成低電平。

  11) FT、CNTL/STB :控制鍵輸入線,由內部拉高電 阻拉成高電平,也可由外部控制按鍵拉成低電平。

  12) TB0~3、OUTA0~3:顯示段數據輸出線,可分別作為兩個半字節輸出,也可作為8位段數據輸出口,此時OUTB0為最低位, OUTA3位最高位。

  13) 消隱輸出線,低電平有效。當顯示器切換時或使用消隱命令時,將顯示消隱。
 

  單片機的步進電機轉速控制程序

  8279的初始化程序如下:

  INIT:MOV DPTR,#7FFFH ;置8279命令/狀態口地址

  MOV A,#0D1H ;置清顯示命令字

  MOVX @DPTR,A ;送清顯示命令

  WEIT:MOVX A,@DPTR ;讀狀態

  JB ACC.7.WEIT ;等待清顯示RAM結束

  MOV A,#34H ;置分頻系數,晶振12MHz

  MOVX @DPTR,A ;送分頻系數

  MOV A,#00H ;置鍵盤/顯示命令

  MOVX @DPTR,A ;送鍵盤/顯示命令

  MOV IE,#84H ;允許8279中斷

  RET
 

  顯示子程序如下:

  DIS:MOV DPTR,#7FFFH ;置8279命令/狀態口地址

  MOV R0.#30H ;字段碼首地址

  MOV R7.#08H ;8位顯示

  MOV A,#90H ;置顯示命令字

  MOVX @DPTR,A ;送顯示命令

  MOV DPTR,#7FFEH ;置數據口地址

  LP:MOV A,@R0 ;取顯示數據

  ADD A,#6 ;加偏移量

  MOVC A,@A+PC ;查表,取得數據的段碼

  MOVX @DPTR,A ;送段碼顯示

  INC R0 ;調整數據指針

  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,FFH,00H

  ;字符H、L、-、Y、“空”段碼
 

  鍵盤中斷子程序如下:

  KEY:PUSH PSW

  PUSH DPL

  PUSH DPH

  PUSH ACC

  PUSH B

  SETB PSW.3

  MOV DPTR,#7FFFH ;置狀態口地址

  MOVX A,@DPTR ;讀FIFO狀態

  ANL A,#0FH ;

  JZ PKYR ;

  MOV A,#40H ;置讀FIFO命令

  MOVX @DPTR,A ;送讀FIFO命令

  MOV DPTR,#7FFEH ;置數據口地址

  MOVX A,@DPTR ;讀數據

  LJMP KEY1 ;轉鍵值處理程序

  PKYR: POP B

  POP ACC

  POP DPH

  POP DPL

  POP PSW

  RETI ;

  KEY1: … … ;鍵值處理程序
 

  鍵盤程序清單:

  KEY1: ACALL KS1 ; 有無鍵按下子程序

  JNZ LK1 ;有鍵按下,轉去抖延時

  AJMP KEY1 ;無鍵按下,繼續掃描

  LK1: ACALL DELA12 ;12ms延時程序調用

  ACALL KS1 ;判斷鍵是否真正按下

  JNZ LK2 ;有鍵按下,轉逐列掃描

  AJMP KEY1 ;無鍵按下,繼續掃描

  LK2: MOV R2.#0FEH ;設置首列掃描字

  MOV R4.#00H ;保存首列號

  LK4: MOV DPTR,#7F01H;列掃描字送至PA口

  MOV A,R2

  MOVX @DPTR,A

  INC DPTR ;指向PC口

  INC DPTR

  MOVX A,@DPTR ;讀入行狀態

  JB ACC.0.LONE ;第0行無鍵按下,轉LONE

  MOV A,#00H ;有鍵按下,設置行首鍵號

  AJMP LKP ;轉求鍵號

  LONE: JB ACC.1.LTWO ;第1行無鍵按下,轉LTWO

  MOV A,#08H ;有鍵按下,設置行首鍵號

  AJMP LKP ;轉求鍵號

  LTWO: JB ACC.2.LTHR ;第2行無鍵按下,轉LTHR

  MOV A,#10H ;有鍵按下,設置行首鍵?

  AJMP LKP ;轉求鍵號

  LTHR: JB ACC.3.NEXT ;第3行無鍵按下,查下一列

  MOV A,#18H ;有鍵按下,設置行首鍵

  LKP: ADD A,R4 ;求鍵號,鍵號=行首鍵號+列號

  PUSH ACC ;保護鍵號

  LK3: ACALL KS1 ;等待鍵釋放

  JNZ LK3 ;鍵未釋放,繼續等待

  POP ACC ;鍵釋放,鍵號送A

  AJMP OVER ;鍵掃描結束

  NEXT: INC R4 ;列號加1.指向下一列

  MOV A,R2 ;判斷8列掃描完否

  JNB ACC.7.KND ;8列掃描完,繼續

  RL A ;掃描字左移一位

  MOV R2.A ;送掃描字

  AJMP LK4 ;轉下一列掃描

  KND: AJMP KEY1

  OVER: RET ;鍵掃描結束

  KS1: MOV DPTR,#7F01H ;指向PA口

  MOV A,#00H ;設置掃描字

  MOVX @DPTR,A ;掃描字送PA口

  INC DPTR ;指向PC口

  INC DPTR

  MOVX A,@DPTR ;讀入PC口狀態

  CPL ;以高電平表示有鍵按下

  ANL A,#0FH ;屏蔽高4位

  RET
 

  初始化程序如下:

  INIT:MOV DPTR,#7FFFH ;置8279命令/狀態口地址

  MOV A,#0D1H ;置清顯示命令字

  MOVX @DPTR,A ;送清顯示命令

  WEIT:MOVX A,@DPTR ;讀狀態

  JB ACC.7.WEIT ;等待清顯示RAM結束

  MOV A,#34H ;置分頻系數,晶振12MHz

  MOVX @DPTR,A ;送分頻系數

  MOV A,#00H ;置鍵盤/顯示命令

  MOVX @DPTR,A ;送鍵盤/顯示命令

  MOV IE,#84H ;允許8279中斷

  RET
 

  顯示子程序如下:

  DIS:MOV DPTR,#7FFFH ;置8279命令/狀態口地址

  MOV R0.#30H ;字段碼首地址

  MOV R7.#08H ;8位顯示

  MOV A,#90H ;置顯示命令字

  MOVX @DPTR,A ;送顯示命令

  MOV DPTR,#7FFEH ;置數據口地址

  LP:MOV A,@R0 ;取顯示數據

  ADD A,#6 ;加偏移量

  MOVC A,@A+PC ;查表,取得數據的段碼

  MOVX @DPTR,A ;送段碼顯示

  INC R0 ;調整數據指針

  DJNZ R7.LP ;

  RET
 

  驅動電路子程序的設計

  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

  延時子程序的設計

  MOV R2.#18H

  LCALL 7FEBH

  RET

  ORG 7FEBH ;通用延時子程序

  (07EBH & 0FEBH & 。。。)

  L7FEB: PUSH 02H ;R2(復位后R2即為02H)存放時間常數,進棧保護

  L7FED: PUSH 02H ; R2進棧保護

  L7FEF: PUSH 02H ; 進棧

  L7FF1: DJNZ R2.$ ;R2不為零等待

  POP 02H ;出棧

  DJNZ R2.L7FEF ; R2不為零轉

  POP 02H ; 出棧

  DJNZ R2.L7FED ; R2不為零轉

  POP 02H ; 出棧

  DJNZ R2.L7FEB ; R2不為零轉

  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

  步進電機控制程序p3.2正轉,p3.3反轉,p3.4停止 步進電機接p1.0p1.1p1.2p1.3

  org 00h

  stop: orl p1.#0ffh ; 步進電機停止

  loop:jnB p3.2.for2 ; 如果p3.2按下正轉

  jnB p3.3.rev2 ; 如果p3.3按下反轉

  jnB p3.4.stop1 ; 如果p3.4按下停止

  jmp loop ;反復監測鍵盤

  for: mov r0.#00h ;正轉到tAB取碼指針初值

  for1:mov A,r0 ;取碼

  mov dptr,#tABle ;

  movC A,@A+dptr

  jz for ;是否到了結束碼00h

  Cpl A ;把ACC反向

  mov p1.A ;輸出到p1開始正轉

  jnB p3.4.stop1 ; 如果p3.4按下停止

  jnB p3.3.rev2 ; 如果p3.3按下反轉

  CAll delAy ;轉動的速度

  inC r0 ;取下一個碼

  jmp for1 ;繼續正轉

  rev:mov r0.#05h ;反轉到tAB取碼指針初值

  rev1:mov A,r0

  mov dptr,#tABle ;取碼

  movC A,@A+tABle

  jz rev ;是否到了結束碼00h

  Cpl A ;把ACC反向

  mov p1.A ;輸出到p1開始反轉

  jnB p3.4.stop1 ; 如果p3.4按下停止

  jnB p3.3.rev2 ; 如果p3.3按下反轉

  CAll delAy ;轉動的速度

  inC r0 ;取下一個碼

  jmp rev1 ;繼續反轉

  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 ;步進電機的轉速20ms

  d1:mov r2.#248

  djnz r2.$

  djnz r1.d1

  ret

  tABle:

  dB 03h,09h,0Ch,06h ;正轉表

  dB 00 ;正轉結束

  dB 03h,06h,0Ch,09h ;反轉

  dB 00 ;反轉結束

  end
 

  步進電機正反快慢程序

  org 00h

  x1:mov r3.#48 ;一圈48步

  stArt:mov r0.#00h ;正轉取碼初值

  stArt1:

  mov p1.#0ffh ;先停止

  mov A,r0

  mov dptr,#tABle

  movC A,@A+dptr

  jz stArt ;是否到了結束碼00?

  Cpl A

  mov p1.A ;輸出運轉

  CAll delAy ;調用慢速的延時轉動

  inC r0 ;取碼指針加1取下一個碼

  djnz r3.stArt1 ;是否走了48步?

  mov r3.#48 ;是則重新設定48步

  stArt2:

  mov p1.#0ffh

  mov r0.#05 ;逆轉的取碼初值

  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 ; 重復開始

  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 ;正轉表

  dB 00

  dB 06h,0Ch,09h,03h ;反轉表

  dB 00

  end
 

  中斷服務程序如下:

  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 ;設定脈沖個數

  PUSH A ;保護現場

  PUSH PSW

  LOOP: SETB P1.0 ;輸出高電平

  ACALL DELAY1 ;延時

  CLR P1.0 ;輸出低電平

  ACALL DELAY2 ;延時

  DJNZ R7.LOOP ;R7≠0.繼續輸出脈沖

  POP PSW ;恢復現場

  POP A

  RET
 

  定時中斷子程序

  TIME0: CLR EA ;關中斷

  INC 30H

  MOV A,30H

  XRL A,#50H ;判斷是否到8秒

  JZ S_8 ;8秒定時到,轉至S_8

  AJMP RECOUN ;未到8秒,繼續計時

  S_8: SETB P3.2 ;觸發外部中斷0

  NOP

  CLR P3.2

  NOP

  RECOUN: MOV TH0.#3CH

  MOV TL0.#0B0H ;設定定時器初值

  SETB EA ;開中斷

  RETI ;中斷返回

  中斷子程序

  T_CON: PUSH A ;保護現場

  PUSH PSW

  MOV R7.#N ;設定控制步數

  JNB FLAG,LEFT ;判斷旋轉方向

  RIGHT: MOV R0.RM ;正轉模型起始地址

  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 ;未走完要求的步數,繼續

  POP PSW ;恢復現場

  POP A

  RET ;返回
 

單片機控制程序具體請咨詢德科智控步進電機工程師,以上對步進電機單片機程序介紹僅供參考;

別人還關注了:

以上就是關于單片機步進電機控制程序【詳解】全部內容;

版權保護: 本文由 德科智控 原創,轉載請保留鏈接:http://szdelco.com/jszx/jszx_121.html

上一篇:「步進驅動器」細分怎么看?步進電機選型幾大【誤區】【需注意】
下一篇:步進電機更低成本替代伺服電機

相關閱讀

客戶評價

  • 來自深圳龍崗某印刷設備廠家
  • 印刷機械上用步進電機多,與德科一直合作
  • 來自東莞某機械手設備廠
  • 德科智控驅動器精密穩定,價格優惠,推薦使用
  • 來自深圳光明某機械廠家
  • 德科智控的步進電機精度高,一直合作,離我們工廠很近,很方便
  • 來自廣州uv打印機廠家的反饋
  • 定制的步進驅動器,控制精準穩定,廠家在深圳光明
toutoulu