步进电机如何控制电机的正反转

步进电机如何控制电机的正反转,第1张

只要控制在四相绕组上输入脉冲的顺序,就可以控制电机的正转/反转。(控制延时就能控制转速。)

步进电机有四相绕组A、B、C、D,当一绕组通电时在电动机内部形成N-S极,产生磁场,当通电的相发生变化,磁场发生旋转,在磁场的作用下,转子将转动,若步进电机按双四拍的方式来工作。

在A、B、C、D四相绕组上输入脉冲的顺序为AB→BC→CD→DA→AB,步进电机沿顺时针方向转动,即正转;若在A、B、C、D四相绕组上依次输入脉冲AB→DA→CD→BC→AB;步进电机将沿逆时针方向旋转,即反转。

扩展资料:

步进电机有步距角(涉及到相数)、静转矩、及电流三大要素组成。一旦三大要素确定,步进电机的型号便确定下来了。

1、步距角的选择

电机的步距角取决于负载精度的要求,将负载的最小分辨率(当量)换算到电机轴上,每个当量电机应走多少角度(包括减速)。电机的步距角应等于或小于此角度。市场上步进电机的步距角一般有0.36度/0.72度(五相电机)、0.9度/1.8度(二、四相电机)、1.5度/3度 (三相电机)等。

2、静力矩的选择

步进电机的动态力矩一下子很难确定,我们往往先确定电机的静力矩。静力矩选择的依据是电机工作的负载,而负载可分为惯性负载和摩擦负载二种。单一的惯性负载和单一的摩擦负载是不存在的。直接起动时(一般由低速)时二种负载均要考虑,加速起动时主要考虑惯性负载,恒速运行进只要考虑摩擦负载。一般情况下,静力矩应为摩擦负载的2-3倍内好,静力矩一旦选定,电机的机座及长度便能确定下来(几何尺寸)。

3、电流的选择

静力矩一样的电机,由于电流参数不同,其运行特性差别很大,可依据矩频特性曲线图,判断电机的电流。

参考资料来源:百度百科-步进电机

控制步进电机正反转的实际应用程序

/*这是一个控制步进电机正反转的实际应用程序*/

/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/

/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/

/*信号端,p20,p21,p22,p23与X25045.html">X25045看门狗存储器相连*/

/*k7,k8键是设定步进电机转动速度参数的加减键*/

/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/

/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/

/*k11是步进运行键,按一下,步进电机动一下*/

/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/

/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/

START:do

$INCLUDE(REG51.DCL)

DECLARE (addrl,n,I,j,ok,ds) byte/*定义变量*/

declare l(5) byte

declare (dat,data) byte at (30h)

declare delay word

DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/

41h,1fh,01h,09h,00h)

declare si literally ''p21'',sck literally ''p20''/*X25045囗线定义*/

declare so literally ''p22'',cs literally ''p23''

dog:procedure/* 初始化看门狗X25045.html">X25045 */

cs=1

call time(1)

cs=0

call time(1)

cs=1

end dog

run:procedure/*步进电机运行脉冲输出程序*/

if ok=1 then

call dog

do

p14=0

call time(1)

p14=1

call time(1)

end

end run

DISPLAY:PROCEDURE(L0,L10)/*显示子程序*/

DECLARE (L0,L10) BYTE/*定义显示二位*/

n=L10

n=aco(n)/*十位数BCD码译成段码*/

sbuf=n/*十位数送164显示*/

do while ti=0/*等待发送结束*/

call dog/*看门狗定时器复位*/

end

n=L0

n=aco(n)

sbuf=n/*个位数送164显示*/

do while ti=0

call dog

end

end DISPLAY

outbyt: procedure(da)/*向看门狗存储器写入一字节*/

declare (i,da) byte

j=da/*将要写入的字节赋给临时变量J */

do i=0 to 7/*左移8位,送到口线si */

sck=0

j=scl(j,1)

si=cy

sck=1/*每移一位数据,跟一个时钟信号*/

end

end outbyt

inbyt: procedure/* 从看门狗存储器读出一字节 */

declare (i,di) byte

j=0

do i=0 to 7

sck=1

sck=0

cy=so

j=scl(j,1)/*从看门狗存储器读出一字节送入临时变量j*/

end

dat=j

end inbyt

wrenable: procedure/* 置看门狗写使能*/

sck=0

cs=0

/* write enable command */

call outbyt(06h)/* X25045.html">X25045 写使能指令06h */

cs=1

sck=0

end wrenable

wrdisable: procedure/* 置看门狗写禁止 */

sck=0

cs=0

/* write disable command */

call outbyt(04h)

sck=0

cs=1

end wrdisable

wrregister: procedure/* 写状态寄存器 */

sck=0

cs=0

dat=01h/* write register command */

call outbyt(dat)

/* 00h——1.4S, 20h——200MS, 10h——600MS, 30h——disable Wdog */

call outbyt(00h)/* 设定看门狗定时时间 */

sck=0

cs=1

call time(200)/* wait to complete writting cycle */

end wrregister

rdregister:procedure/* 读看门狗状态寄存器 */

sck=0

cs=0

/* register read command */

call outbyt(05h)

call inbyt/* status register read in <DAT>*/

sck=0

cs=1

end rdregister

wbyte:procedure/* 看门狗存储器字节写入子程序 */

declare comm byte

sck=0

cs=0

comm=02h/* 写指令 02h */

call outbyt(comm)

call outbyt(addrl)

call outbyt(dat)/* send one byte data to X25043 */

cs=1

sck=0

call time(150)

end wbyte

rbyte:procedure/*看门狗存储器字节读出子程序 */

declare comm byte

sck=0

cs=0

comm=03h/* read command */

call outbyt(comm)

call outbyt(addrl)

call inbyt/* read one byte to <DAT>*/

sck=0

cs=1

end rbyte

incdata: procedure/* 参数修改——"加"键处理子程序 */

if p10=0 then /* 如果K7键按下*/

do

do while p10=0/* 等待键松开有效 */

call dog/* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/

end

data=data 1/* 设定值 1 */

if data>99 then data=1/* 规定设定值的上限*/

L(1)=data MOD 10/*将设定值的十位数拆出来送给十位数显示变量L(1) */

L(2)=data/10/*将设定值的个位数拆出来送给个位数显示变量L(2) */

call DISPLAY(L(1),L(2))/* 将改变后的设定值送164显示出来*/

call time(200)/* 延时 */

call dog

call time(200)

call dog

call wrenable/* 置存储器写使能 */

addrl=00h/* 置存储器地址 */

dat=l(1)

call wbyte/* 将变量L(1)的值写入存储器00h位置 */

call wrenable

addrl=01h

dat=l(2)

call wbyte/* 将变量L(2)的值写入存储器01h位置 */

end

end incdata

decdata: PROCEDURE/* 参数修改——-"减"键处理子程序- */

IF p11=0 THEN /* k8 键处理子程序 */

do

do while p11=0

call dog

end

DATA=DATA-1/* 设定值-1 */

if data=0 then data=99

L(1)=data MOD 10

L(2)=data/10

call DISPLAY(l(1),l(2))

call dog

call time(200)

call dog

call time(200)

call dog

call wrenable

addrl=00h

dat=l(1)

call wbyte

call wrenable

addrl=01h

dat=l(2)

call wbyte

end

END decdata

starton: PROCEDURE/* start */

declare sd byte

if p12=0 THEN /* K9键处理子程序 */

do

do while p12=0

call dog

end

if p17=0 then ok=0/* 如果p17 口线上有信号输入,则运行标志置0 (停止运行)*/

p13=1/* 置步进电机正向运转 */

call time(200)

call dog

do while ok=1/* 当运行标志为1时,执行速度延时 *** 作 */

do sd= 0 to data/* 根据设定值 data的数值延时来确定步进电机运行时的脉冲给定速度*/

call dog

end

end

END starton

step: PROCEDURE/* step */

declare sd byte

p13=1/* 置步进电机正向运转 */

call time(200)

call dog

IF p33=0 THEN /* k11键处理子程序 */

do

if p17=0 then ok=0/* 如果p17上有信号输入,则停止运行*/

do while p33=0

do sd= 0 to data/* 调用延时,调整步进电机的运行速度 */

call dog

call time(2)

end

call run

call dog

end

end

ok=0

END step

BACK: PROCEDURE/* 反向运行处理子程序 */

declare sd byte

IF p34=0 THEN

do

do while p34=0

call dog

end

if p15=0 then ok=0/* 反向运行时,如果遇到p15上有信号输入,则停止步进电机运行 */

p13=0/* 置步进电机反向运行 */

call time(200)

call dog

do while ok=1

do sd=0 to data/*根据设定值调节步进电机的运行速度 */

call dog

call time(2)

end

call run

if (p15=0 or p32=0 ) then ok=0/* p15 或 p32 口线任意一个有信号输入,停止运行 */

end

end

END BACK

MAIN$PROGRAM: /* 初始化主程序 */

ea=0/* 关中断 */

SCON=00h/*置串口方式0 ,串行数据输出模式*/

PCON=00h

tmod=11h

et0=1

enable/* 开中断 (ea=1) */

SCK=0cs=1/* 定义存储器口线初始状态 */

call wrenable

call wrregister/* 看门狗存储器 初始化 */

call wrenable

call dog

p2=0ffh/* 初始化各个口线的状态 */

p1=0ffhok=0

p14=1p32=1p33=1p34=1

p13=1

ADDRL=00h/* 上电复位后从存储器中读出设定的速度值 */

CALL rbyte

l(1)=dat

addrl=01h

call rbyte

l(2)=dat

DATA=L(1) L(2)*10/*将读出的值合并成十进制,存入变量data中 */

/* 以下是主循环程序 */

LOOP:

IF p10=0 THEN CALL incdata/* 检测各个按键是否有按下 */

IF p11=0 THEN CALL decdata

if p12=0 then

do

ok=1

call starton

end

if p34=0 then

do

ok=1

call BACK

end

if p33=0 then

do

ok=1

call step

end

call dog

CALL DISPLAY(L(1),L(2))/* 将设定值送164显示 */

call dog

CALL TIME(100)

call dog

GOTO LOOP

END START

用DS1302+单片机比较简单 DS1302程序(51汇编)

推荐

1.每次上电,必须把秒寄存器高位(第7位)设置为0,时钟才能走时。

2.如果需要写入数据和时钟日历信息,必须把“写保护”寄存器设置成为0

内存数据定义

BitCnt data 3Ch 数据位计数器

ByteCnt data 3Dh 数据字节计数器

Command data 3Eh 命令字节地址

RcvDat DATA 40H 接收数据缓冲区

XmtDat DATA 50H 发送数据缓冲区

端口位定义

IO_DATA bit P1.6 数据传送总线

SCLK bit P1.5时钟控制总线

RST bit P1.7 复位总线

RS BIT P3.5

RW BIT P3.6

EN BIT P3.7

ORG 0000H

ORG 0013H

LCALL JKS

AJMP KS

**************************** main program

ORG0030H

KS: CLR RST

MOV SP,#2AH

----LCD初始化----

CLR EN 使能端为0,液晶执行命令

INIT_LCD:

MOV A,#38H 双列显示,字形5*7点阵

ACALL WCOM

ACALL DELAY1

MOV A,#38H 双列显示,字形5*7点阵

ACALL WCOM

ACALL DELAY1

MOV A,#38H 双列显示,字形5*7点阵

ACALL WCOM

ACALL DELAY1

MOV A,#0CH 开显示,关光标

ACALL WCOM

ACALL DELAY1

MOV A,#01H 清除 LCD 显示屏

ACALL WCOM

ACALL DELAY1

MOV A,#06H 地址加1

ACALL WCOM

ACALL DELAY1

------------------------------------初始化1302-------------------------

SET1302:

LCALL Write_Enable写允许

LCALL Osc_Disable

LCALL Write_Multiplebyte初始化1302,将我们要设定的数据写入

LCALL Read_Multiplebyte将我们设定的数据读出来

LCALL Osc_Enable

START:

ACALL LCD

LCALL Read_Multiplebyte

AJMP START

---------------------LCD显示-------------------------

LCD:

MOV A,#11001000B

LCALL WCOM

MOV A,#0显示时间

MOV A,42H

LCALL SSH2

MOV A,#00111010B

LCALL WDATA

MOV A,41H

LCALL SSH2

MOV A,#00111010B

LCALL WDATA

MOV A,40H

LCALL SSH2

MOV A,#11000000B

LCALL WCOM

MOV A,#0显示日期字符

MOV A,46H

LCALL SSH2

MOV A,#00101101B

LCALL WDATA

MOV A,44H

LCALL SSH2

MOV A,#00101101B

LCALL WDATA

MOV A,43H

LCALL SSH2

RET

SSH2:

MOV B,#16

DIV AB

MOV 58H,B

MOV 59H,A

MOV A,59H

MOV DPTR,#TAB

MOVC A,@A+DPTR

ACALL WDATA

MOV A,58H

MOV DPTR,#TAB

MOVC A,@A+DPTR

ACALL WDATA

RET

-----------------------------------------------------

写指令、数据使能子程序

-----------------------------------------------------

WCOM: 写指令使能

ACALL DELAY0

MOV P0,A

CLR RS

CLR RW

CLR EN

CLR EN

CLR EN

SETB EN

RET

WDATA: 写数据使能

ACALL DELAY0

MOV P0,A

SETB RS RS=H,RW=L,D0-D7=数据,E=高脉冲

CLR RW

CLR EN

CLR EN

CLR EN

SETB EN

RET

****判忙音****

DELAY0:

MOV P0,#0FFH

CLR RS

SETB RW

CLR EN

NOP

SETB EN

JB P0.7,DELAY0

RET

TAB:DB 00110000B,00110001B,00110010B,00110011B

DB 00110100B,00110101B,00110110B,00110111B

DB 00111000B,00111001B

********************************************************************************************

发送数据程序

名称:Send_Byte

描述:发送ByteCnt 个字节给被控器DS1302

命令字节地址在Command 中

所发送数据的字节数在ByteCnt 中发送的数据在XmtDat 缓冲区中

********************************************************************************************

Send_Byte:

CLR RST 复位引脚为低电平所有数据传送终止

NOP

CLR SCLK清时钟总线

NOP

SETB RST 复位引脚为高电平逻辑控制有效

NOP

MOV A,Command准备发送命令字节

MOV BitCnt,#08h 传送位数为8

S_Byte0:

RRC A 将最低位传送给进位位C

MOV IO_DATA,C 位传送至数据总线

NOP

SETB SCLK 时钟上升沿发送数据有效

NOP

CLR SCLK 清时钟总线

DJNZ BitCnt,S_Byte0 位传送未完毕则继续

NOP

S_Byte1: 准备发送数据

MOV A,@R0 传送数据过程与传送命令相同

MOV BitCnt,#08h

S_Byte2:

RRC A

MOV IO_DATA,C

NOP

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,S_Byte2

INC R0 发送数据的内存地址加1

DJNZ ByteCnt,S_Byte1 字节传送未完毕则继续

NOP

CLR RST 逻辑 *** 作完毕清RST

RET

***************************************************************************************

接收数据程序

名称:Receive_Byte

描述:从被控器DS1302 接收ByteCnt 个字节数据

命令字节地址在Command 中

所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中

***********************************************************************************

Receive_Byte:

CLR RST 复位引脚为低电平所有数据传送终止

NOP

CLR SCLK 清时钟总线

NOP

SETB RST 复位引脚为高电平逻辑控制有效

MOV A,Command 准备发送命令字节

MOV BitCnt,#08h 传送位数为8

R_Byte0:

RRC A 将最低位传送给进位位C

MOV IO_DATA,C 位传送至数据总线

NOP

SETB SCLK 时钟上升沿发送数据有效

NOP

CLR SCLK 清时钟总线

DJNZ BitCnt,R_Byte0 位传送未完毕则继续

NOP

R_Byte1: 准备接收数据

CLR A 清类加器

CLR C 清进位位C

MOV BitCnt,#08h 接收位数为8

R_Byte2:

NOP

MOV C,IO_DATA 数据总线上的数据传送给C

RRC A 从最低位接收数据

SETB SCLK 时钟总线置高

NOP

CLR SCLK 时钟下降沿接收数据有效

DJNZ BitCnt,R_Byte2 位接收未完毕则继续

MOV @R1,A 接收到的完整数据字节放入接收内存缓冲区

INC R1 接收数据的内存地址加1

DJNZ ByteCnt,R_Byte1 字节接收未完毕则继续

NOP

CLR RST 逻辑 *** 作完毕清RST

RET

--写保护寄存器 *** 作------------------------------------------

Write_Enable:

MOV Command,#8Eh 命令字节为8E

MOV ByteCnt,#1 单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#00h 数据内容为0 写入允许

ACALL Send_Byte 调用写入数据子程序

RET

当写保护寄存器的最高位为1 时禁止数据写入寄存器---------------

Write_Disable:

MOV Command,#8Eh 命令字节为8E

MOV ByteCnt,#1 单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#80h 数据内容为80h 禁止写入

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处

当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始---------

Osc_Enable:

MOV Command,#80h 命令字节为80

MOV ByteCnt,#1 单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#00h 数据内容为0 振荡器工作允许

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处

当把秒寄存器的第7 位时钟停止位设置为1 时时钟振荡器停止HT1380 进入低功耗方式---------------

Osc_Disable:

MOV Command,#80h 命令字节为80

MOV ByteCnt,#1 单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#80h 数据内容为80h 振荡器停止

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处

写入00 年6 月21 日星期三13 时59 分59---------------------

Write_Multiplebyte:

MOV Command,#0BEh 命令字节为BEh

MOV ByteCnt,#8 多字节写入模式此模块为8 个

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#59h 秒单元内容为59h

MOV XmtDat+1,#59h 分单元内容为59h

MOV XmtDat+2,#13h 时单元内容为13h

MOV XmtDat+3,#21h 日期单元内容为21h

MOV XmtDat+4,#06h 月单元内容为06h

MOV XmtDat+5,#03h 星期单元内容为03h

MOV XmtDat+6,#0 年单元内容为00h

MOV XmtDat+7,#0 写保护单元内容为00h

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处

读出寄存器0-7 的内容程序设置如下

Read_Multiplebyte:

MOV Command,#0BFh 命令字节为BFh

MOV ByteCnt,#8 多字节读出模式此模块为8 个

MOV R1,#RcvDat 数据地址覆给R1

ACALL Receive_Byte调用读出数据子程序

RET返回调用本子程序处

DELAY1: 延时10MS

MOV 21H,#75

D2:MOV 22H,#100

DJNZ 22H,$

DJNZ 21H,D2

RET

=============================================================================================

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11484712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存