您的位置 首页 测评

根据单片机的步进电机转速操控规划详解(附程序)

基于单片机的步进电机转速控制设计详解(附程序)-步进电机的调速一般是改变输入步进电机的脉冲的频率来实现步进电机的调速,因为步进电机每给一个脉冲就转动一个固定的角度,这样就可以通过控制步进电机的一个脉冲到下一个脉冲的时间间隔来改变脉冲的频率,延时的长短来具体控制步进角来改变电机的转速,从而实现步进电机的调速,本文主要介绍基于单片机的步进电机转速控制设计详解,文章最后附上程序。

  步进电机是将电脉冲信号转变为角位移或线位移的开环操控元件。在非超载的情况下,电机的转速、中止的方位只取决于脉冲信号的频率和脉冲数,而不受负载改动的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只要周期性的差错而无累积差错等特色。使得在速度、方位等操控范畴用步进电机来操控变的十分的简略。

  步进电机的调速一般是改动输入步进电机的脉冲的频率来完成步进电机的调速,因为步进电机每给一个脉冲就滚动一个固定的视点,这样就可以经过操控步进电机的一个脉冲到下一个脉冲的时刻距离来改动脉冲的频率,延时的长短来详细操控步进角来改动电机的转速,然后完成步进电机的调速,本文首要介绍根据单片机的步进电机转速操控规划详解,文章最终附上程序。

  

  根据单片机的步进电机转速操控规划详解

  本次规划以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位显现,别离用来显现步进电机的实践转速与给定转速。

  8279与CPU的衔接框图如4-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

  键盘中止子程序如下:

  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 ;

  驱动电路子程序的规划

  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 ;回来

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/347971.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部