;定义各驱动端口
AXZ BIT P3.7 ;P3.7为A线圈接电源正极控制端
;按照本电路的接法,当P3.7为低电位时(P3.7=0),驱动A线圈的三极管TIP42导通,A线圈接到电源正极
;当P3.7为高电位时(P3.7=1),驱动A线圈的三极管TIP42截止
;
AXF BIT P1.0 ;P1.0为A线圈接电源负极极控制端
;当P1.0为低电位时(P1.0=0),驱动A线圈的三极管TIP41导通,A线圈接到电源负极
;
BXZ BIT P1.1 ;P1.1为B线圈接电源正极控制端
;当P1.1为低电位时(P1.1=0),驱动B线圈的三极管TIP42导通,B线圈接到电源正极
;
BXF BIT P1.6 ;P1.6为B线圈接电源负极控制端
;当P1.6为低电位时(P1.6=0),驱动B线圈的三极管TIP41导通,B线圈接到电源负极
;
CXZ BIT P1.5 ;P1.5为C线圈接电源正极控制端
;当P1.5为低电位时(P1.5=0),驱动C线圈的三极管TIP42导通,C线圈接到电源正极
;
CXF BIT P1.7 ;P1.7为C线圈接电源负极极控制端
;当P1.7为低电位时(P1.7=0),驱动C线圈的三极管TIP41导通,C线圈接到电源负极
;
;定义各探测端口
ADUAN BIT P1.2 ;P1.2为A线圈感应电动势检测端
BDUAN BIT P1.3 ;P1.3为B线圈感应电动势检测端
CDUAN BIT P1.4 ;P1.4为C线圈感应电动势检测端
;定义各按键端口
ZZHUAN BIT P3.5 ;P3.5为正转控制端口
FZHUAN BIT P3.4 ;P3.4为反转控制端口
STOP BIT P3.3 ;P3.3为停转控制端口
;以上端口可以根据实际情况自行设置
;********
;
ORG 0
JMP START
;
ORG 0BH
JMP SUBTIMER0
;********
;初始化程序
START:
MOV SP,#65H
MOV TMOD,#1
MOV IE,#10000010B
MOV P1,#0FFH
MOV P3,#0FFH
MOV R6,#0
MOV R7,#0
;********
;按键检测程序
KONGZHI:
SETB AXZ
SETB AXF
SETB BXZ
SETB BXF
SETB CXZ
SETB CXF
;以上指令作用是将各驱动端口拉到高电位,即不驱动各推动管,让所有线圈断电
JNB ZZHUAN,ZZHUAN0 ;如果“正转”按钮被按下,则跳至正转部分程序
JNB FZHUAN,FZQD00 ;如果“反转”按钮被按下,则跳至反转部分程序
JMP KONGZHI ;如果上述按钮未按下,则返回并重新检测
;********
;下面两条指令起跳板作用。
;JNB指令的跳转范围是前、后128个地址,
;如果超过这个范围,可以先跳到一个较近的地址,
;再由这个地址跳到最终的目的地址。
FZQD00:
JMP FZHUAN0
;********
;正转程序
;正转程序的第一相序
ZZHUAN0:
SETB CXZ
SETB AXF
;以上两条指令的作用是让上一相序的通电的线圈断电
CLR TR0 ;取消上一相序中还未产生的定时中断。为什么用到定时器中断呢?下面再解释
JNB STOP,KONGZHI ;如果“停止”按钮被按下,则返回按键检测程序,电机停止转动
CLR AXZ ;将A线圈接到电源的正极
CLR BXF ;将B线圈接到电源的负极
;给A、B线圈通电,电流方向:从A流到B。到这里本相序才真正开始
MOV TL0,R6 ;将R6寄存器的数值传给TL0寄存器
MOV TH0,R7 ;将R7寄存器的数值传给TH0寄存器
;上面两条指令实际上决定了产生定时中断的时间长短
SETB TR0 ;启动定时器0中断
;采用定时中断的主要目的是为了以后进行调速作准备
;假如再检测到换相之前就让原来的线圈断电,那么电机的转速就要比换相前线圈一直通电要慢。
;而且通电时间越短,转速就越慢。
;因此,适当改变线圈在换相前通电时间的长短,就可以改变电机的转速,这就是无刷调速的原理。
;在定时中断子程序中,关闭了所有的驱动,也就是给所有的线圈都断了电。
;这样,我们只要适当改变R6、R7的数值就可以改变这一相序中线圈在达到换相位置前通电时间的长短,从而达到调速的目的。
;如果想让电机达到最大转速,只要让线圈在换相前一直通电就行了,
;即定时中断的时间大于线圈从通电到换相所需时间就行了。
;比如说我们可以把定时中断的时间设为定时器的最长定时时间,即R6=0,R7=0。
;在本程序开始时,就把R6和R7设为0,后面一直没有改变,因此电机转动稳定后就是最高转速。
;另外,在电机启动时,由于转速很低,也应该把R6和R7设为0。
;如果在换相后,还没产生定时中断,应该取消定时中断,以免对电机正常转动产生影响,
;因此,在每一相序开始时,都应该取消上一相序中还未产生的定时中断。
CALL DELAY ;调用延时子程序
;DELAY是一个时间很短的延时子程序。
;为什么要延时呢?
;因为线圈在刚通电时,电流从无到有,变化非常大,
;这样会在不通电的线圈,也就是检测感应电动势过零信号用于换相控制的线圈,产生较强的感应电动势,
;这样就会产生错误的换相信号,使电机停传。
;前面的第4、5条指令刚给线圈通电,虽然隔了3条指令,但时间还是太短,
;因此要延时一段时间才能进入下面的检测换相信号的指令。
;但延时的时间也不能太长,不能都过了换相位置了延时还没完,
;因此延时时间比较短。
;
;从以下位置一直到正转程序的第二相序前的几条指令是检测换相信号用的。
;利用感应电动势检测无刷电机换相位置原理:
;举例来说,例如:当A线圈和B线圈通电时,最多能让转子转到一个特定位置,
;在这个位置有一个特点:C线圈中的感应电动势为0,
;转过这个位置后,C线圈中感应电动势跟没转过之前相反。
;如果我们检测到C线圈中的感应电动势方向发生变化,就说明应该换相了。
;利用电压比较器我们可以检测出线圈感应电动势的正或负。
;按照本电路的接法,当线圈中感应电动势为正时输出高电平,感应电动势为负时输出低电平。
;如果比较器输出原来是高电平,那么当它变为低电平时,就应该换相了;
;或者比较器输出原来是低电平,那么当它变为高电平时,就应该换相了。
JB CDUAN,ZZHUAN02 ;如果C线圈的感应电动势为正,则跳转至ZZHUAN02等待感应电动势变为负
ZZHUAN01:
JB CDUAN,ZZHUAN1 ;否则等待C线圈感应电动势变为正就跳到下一相序。
JMP ZZHUAN01 ;感应电动势没有变为正,则跳回上一条指令,继续检测。
ZZHUAN02:
JNB CDUAN,ZZHUAN1 ;等待C线圈感应电动势变为负就跳到下一相序。
JMP ZZHUAN02 ;感应电动势没有变为负,则跳回上一条指令,继续检测。
;第二、第三相序的原理跟第一相序原理相同,只是通电线圈不同而已,这里就不做解释了。
;正转程序的第二相序
ZZHUAN1:
SETB AXZ
SETB BXF
CLR TR0
JNB STOP,KONGZHI
CLR BXZ
CLR CXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
CALL DELAY
JB ADUAN,ZZHUAN12
ZZHUAN11:
JB ADUAN,ZZHUAN2
JMP ZZHUAN11
ZZHUAN12:
JNB ADUAN,ZZHUAN2
JMP ZZHUAN12
;正转程序的第三相序
ZZHUAN2:
SETB BXZ
SETB CXF
JNB STOP,JMPKONGZHI
CLR TR0
CLR CXZ
CLR AXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
CALL DELAY
JB BDUAN,ZZHUAN22
ZZHUAN21:
JB BDUAN,ZZHUANEND
JMP ZZHUAN21
ZZHUAN22:
JNB BDUAN,ZZHUANEND
JMP ZZHUAN22
ZZHUANEND:
JMP ZZHUAN0
;正转程序结束
;********
;下面两条指令也是起跳板作用
JMPKONGZHI:
JMP KONGZHI
;********
;延时子程序
DELAY:
MOV R2,#100
DJNZ R2,$
RET
;********
;反转程序
;反转的原理跟正转的相似,只是相序不同而已,这里也不详细介绍了。
;反转程序的第一相序
FZHUAN0:
SETB BXZ
SETB AXF
CLR TR0
JNB STOP,JMPKONGZHI
CLR AXZ
CLR CXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
FZHUAN00:
CALL DELAY
JB BDUAN,FZHUAN02
FZHUAN01:
JB BDUAN,FZHUAN1
JMP FZHUAN01
FZHUAN02:
JNB BDUAN,FZHUAN1
JMP FZHUAN02
;反转程序的第二相序
FZHUAN1:
SETB AXZ
SETB CXF
CLR TR0
JNB STOP,JMPKONGZHI
CLR CXZ
CLR BXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
CALL DELAY
JB ADUAN,FZHUAN12
FZHUAN11:
JB ADUAN,FZHUAN2
JMP FZHUAN11
FZHUAN12:
JNB ADUAN,FZHUAN2
JMP FZHUAN12
;反转程序的第三相序
FZHUAN2:
SETB CXZ
SETB BXF
CLR TR0
JNB STOP,JMPKONGZHI1
CLR BXZ
CLR AXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
CALL DELAY
JB CDUAN,FZHUAN22
FZHUAN21:
JB CDUAN,FZHUAN0
JMP FZHUAN21
FZHUAN22:
JNB CDUAN,FZHUAN0
JMP FZHUAN22
;********
;
JMPKONGZHI1:
JMP KONGZHI
;********
;定时器中断子程序
SUBTIMER0:
CLR TR0 ;取消定时中断
SETB AXZ
SETB AXF
SETB BXZ
SETB BXF
SETB CXZ
SETB CXF
;上面6条指令的作用是给所有线圈断电
MOV R2,#100
DJNZ R2,$
;上面2条指令起延时作用,
;线圈断电时,同样也会在别的线圈中产生感应电动势,
;所以也要延时再返回。
RETI
;
END |