;用单片机来控制伺服电机转动
;作者:全立波,quanlibo@126.com
Timers EQU 57H ;用查表的方法来进行脉宽控制(PWM)
ORG 0000H
AJMP START
ORG 000BH
AJMP ITL
ORG 30H
START:
MOV SP,#5FH
MOV R7,#0
MOV Timers,#0
;设置定时器工作方式1
MOV TMOD,#00000001B
;开机自动偏向(-90度),(0.5,19.5)
;记数高位
MOV DPTR,#InitTime
MOV A, Timers
MOVC A,@A+DPTR
MOV TH0,A
;记数低位
INC Timers
MOV DPTR,#InitTime
MOV A, Timers
MOVC A,@A+DPTR
MOV TL0,A
SETB P1.0
SETB EA
SETB ET0
SETB TR0
LOOP:
AJMP LOOP
;中断处理程序
ITL:
;重新设置定时时间
PUSH ACC
PUSH PSW
JNB P1.0,D_L0;如果bit=0则转移,否则顺序执行
CPL P1.0
AJMP D_L1
D_L0:
INC R7
MOV A,R7
CJNE A,#10,D_L2
MOV R7,#0
CPL P1.0
D_L1:
INC Timers
MOV A,Timers
CJNE A,#32,D_L3
MOV Timers,#0
D_L3:
MOV DPTR,#InitTime
MOV A, Timers
MOVC A,@A+DPTR
MOV TH0,A
INC Timers
MOV DPTR,#InitTime
MOV A, Timers
MOVC A,@A+DPTR
MOV TL0,A
D_L2:
POP PSW
POP ACC
RETI
;(0.5,1,1.5,2,2.5,2,1.5,1) 刚好循环一次
InitTime: DB 0FEH,33H,12H,66H,0FCH,66H,12H,66H,0FAH,99H,12H,66H,0F8H,0CCH,12H,66H,0F7H,00H,12H,66H,0F8H,0CCH,12H,66H,0FAH,99H,12H,66H,0FCH,66H,12H,66H
END
实际使用的时候负脉冲时间不要太在意,正脉冲的时间要严格控制好就行了.通过实践发现如果按照周期20ms,伺服电机会抖动的厉害.下面这段代码就是有意延长正脉冲的时间,可以通过CJNE A,#10,D_L2 更改电机的转动速度.
D_L0:
INC R7
MOV A,R7
CJNE A,#10,D_L2
MOV R7,#0
CPL P1.0
|