微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于proteus的步进电机控制

基于proteus的步进电机控制

时间:11-26 来源:互联网 点击:

OV DispBuf+5,B ;最低位

MOV B,#10

div AB

MOV DispBuf+4,B

MOV DispBuf+3,A

JB StartEnd,m_Next2

CLR TR1 ;关闭电机

ORL P1,#11110000B

JMP LOOP

m_Next2:

SETB TR1 ;启动电机

AJMPLOOP ;主程序结束

;---------------------------------------

D10ms:

……

;---------延时程序,键盘处理中调用

KEYPROC:

MOVA,B;获取键值

JBACC.2,StartStop;分析键的代码,某位被按下,则该位为1

JBACC.3,KeySty

JBACC.4,UpSpd

JBACC.5,DowSpd

AJMPKEY_RET

StartStop:

SETB StartEnd;启动

AJMPKEY_RET

KeySty:

CLR StartEnd;;停止

AJMPKEY_RET

UpSpd:

INC SPEED;

MOVA,SPEED

CJNEA,#MaxSpd,K1;到了最多的次数?

DECSPEED;是则减去1,保证下次仍为该值

K1:

AJMPKEY_RET

DowSpd:

DEC SPEED

MOVA,SPEED

CJNEA,#MinSPD,KEY_RET;不等(未到最小值)返回

MOV SPEED,#MinSpd+1;是则加1,保证下次仍为该值

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依次接通,程度中用了一个变量DjCount来实现这一功能,在主程序初始化时,该变量被赋予初值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、更改程序,实现首位无效零消隐。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top