⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stepmot.asm

📁 二相步进电机驱动程序
💻 ASM
字号:
;
;		NAME: stepmot.asm
;		Version 1.0 jul 07, 2002
;		author:xjchen
;		list      p=16c73
		title "stepmot Program"
		#include <p16c73.inc>

;		__CONFIG   _RC_OSC & _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON 

;---------------------------------------
;t1 parameters
_T1_50US	EQU	04BH		;50*0.000001*OSC/4/prescale

;---------------------------------------
;pwm parameters
_PWM_T		EQU	04AH		;pwm cycle 1/20kz ,_PWM_T=(osc/4)/20kz-1
_SCALE0		EQU	0B1H		;_PWM_T*4*_PERCENT1,60%
_SCALE1		EQU	07CH		;60%*0.7

;beat parameters
_S_STEPS0	EQU 5
_S_STEPS1	EQU 0AH
_S_STEPS2	EQU 012H
_S_STEPS3	EQU 01EH
_MAX_S_STEPS	EQU 032H
_BEAT_TIME0		EQU	064H	;200HZ  ,10000/200*2
_BEAT_TIME1		EQU	028H	;500
_BEAT_TIME2		EQU	016H	;900
_BEAT_TIME3		EQU	0DH		;1500
_BEAT_TIME4		EQU	0BH		;1800
_MAX_BEAT_TIME	EQU	0AH		;2000
_REACH_DELAY	EQU	2		;2
_DIFFERENCE		EQU	8

;run angle parameters
_ANGLE0		EQU	0C8H		;SETPS,180

;---------------------------------------					
;regsiser define
			ORG		0020H
FLAG0		EQU $
			ORG $+1
B_T_COUNT	EQU $		;one beat time count
			ORG $+1
D_TIME0		EQU $		;delay time regsister 0
			ORG $+1
D_TIME1		EQU $		;delay time regsister 1
			ORG $+1
S_S_ADD		EQU $		;变速区步数充计。
			ORG $+1
S_STACK		EQU $		;status stack
			ORG $+1
W_STACK		EQU $
			ORG $+1
TEMP0		EQU $
			ORG $+1
TEMP1		EQU $
			ORG $+1
T_ANGLE		EQU $
			ORG $+2
S_ADD		EQU $
			ORG $+2		
;---------------------------------------					
;bit define
;---------------------------------------
;flag0 bit define
ORIE		EQU	0
ERR			EQU	1
D_S_STEPS	EQU	2
T_BIT		EQU 3	;temp bit 

;porta
COMMAND		EQU 0
PUSH		EQU	2
STATE		EQU 3

;portb
BEN			EQU 4
UBEN		EQU 5
AEN			EQU 6
UAEN		EQU 7

;portC
S_LED		EQU	4
W_LED		EQU	5
;**********************************************************************

		ORG     000H
		GOTO	MAIN

;
;	INTERRUPT ROUTINE
;
		ORG		004H
		MOVWF   W_STACK			;	REGISTER W STACK
		MOVF	STATUS,W
		BCF		STATUS,RP0
		MOVWF	S_STACK

		BTFSC	PIR1,TMR1IF
		GOTO	T1IP
		BCF		INTCON,T0IF
		BCF		INTCON,INTF		
		BCF		INTCON,RBIF
		CLRF	PIR1
		GOTO	T1IP300

T1IP:	BCF		PIR1,TMR1IF
		MOVLW	LOW (-(_T1_50US-0AH))
		MOVWF	TMR1L
		MOVLW	HIGH (-(_T1_50US-0AH))
		MOVWF	TMR1H

		MOVF	B_T_COUNT,W		;a beat finish ?wait
		BTFSC	STATUS,Z
		GOTO	T1IP200
		DECF	B_T_COUNT
		
T1IP200	MOVF	D_TIME0,W		;a beat finish ?wait
		BTFSC	STATUS,Z
		GOTO	T1IP300
		DECF	D_TIME0
		
T1IP300	MOVF	S_STACK,W
		MOVWF	STATUS
		SWAPF	W_STACK,F
		SWAPF	W_STACK,W
		RETFIE


;
;main program
;intial system
MAIN	CLRF	INTCON      ;INTCON REGISTER.
		CLRF	PORTB
		MOVLW   0FFH
		MOVWF	PORTA
		CLRF	STATUS
		CLRF	PIR1        ;peripheral interrupts flag.
		BSF		STATUS,RP0	;bank select bits.
		BCF		STATUS,RP1	;bank select bits.
		CLRF	OPTION_REG
		CLRF	PCON        ;POWER CONTROL
		CLRF	PIE1        ;This register contains the individual enable bit for the comparator interrupt.
		MOVLW	06H
		MOVWF	ADCON1
		MOVLW	03FH		
		MOVWF	TRISA		;porta low 6 bit input
		CLRF	TRISB		;output
		CLRF	TRISC		;close pwm output
		BCF		STATUS,RP0	;bank select bits.
		BCF		STATUS,RP1	;bank select bits.
		MOVLW	00H
		MOVWF	PORTB
		NOP
		NOP
		BCF		PORTC,W_LED	;light cpu working led
		CALL	C_STATUS	;check up status
		MOVLW	020H
		MOVWF	FSR
CMB1	CLRF	INDF
		INCF	FSR,F
		BTFSS	FSR,7      	;CLEAR
		GOTO	CMB1
		MOVLW	0A0H
		MOVWF	FSR
CMB2	CLRF	INDF
		INCF	FSR,F
		BTFSS	STATUS,Z
		GOTO	CMB2
;T1 intial
		MOVLW	LOW (-(_T1_50US+8))
		MOVWF	TMR1L
		MOVLW	HIGH (-(_T1_50US+8))
		MOVWF	TMR1H
		MOVLW	01H
		MOVWF	T1CON
		BSF		INTCON,GIE
		BSF		INTCON,PEIE
		BSF		STATUS,RP0	;bank select bits.
		BSF		PIE1,TMR1IE
		BCF		STATUS,RP0	;bank select bits.
;pwm intial
		BSF		STATUS,RP0	;bank select bits.
		MOVLW	_PWM_T
		MOVWF	PR2
		BCF		STATUS,RP0	;bank select bits.
		MOVLW	_SCALE0/4		;_PWM_T*4*_PERCENT0/064H,PWM CYCLE 占空比.
		MOVWF	CCPR1L
		MOVWF	CCPR1H
		MOVLW	04H
		MOVWF	T2CON		;prescale is 1
		

;deal event		
LOOP;	BSF		STATUS,RP0	;bank select bits.
;		MOVLW	03FH
;		MOVWF	TRISA
;		BCF		STATUS,RP0
		BTFSC	PORTA,COMMAND
		GOTO	LOOP02
		BTFSS	PORTA,COMMAND
		GOTO	LOOP03
LOOP02	CALL	C_STATUS	
		GOTO	LOOP
LOOP03	;GOTO	LOOP
		BSF		FLAG0,ORIE		;orientation +
		MOVLW	LOW _ANGLE0		;angle
		MOVWF	T_ANGLE			;target angle
		MOVLW	HIGH _ANGLE0	;angle
		MOVWF	T_ANGLE+1		;target angle
		CALL	RUN_MOTOR0		;run but no detect
		BTFSC	FLAG0,ERR		
		GOTO	ERR_DEAL
		MOVLW	0C8H			;200,20ms
		MOVWF	D_TIME0
		CALL	DELAY_TIME0		
		BTFSC	PORTA,PUSH		;low enable
		GOTO	LOOP05
		MOVLW	0AH
		MOVWF	D_TIME1
		CALL	DELAY_TIME1
LOOP05	BCF		FLAG0,ORIE		;orientation -
		MOVLW	LOW _ANGLE0		;angle
		MOVWF	T_ANGLE			;target angle
		MOVLW	HIGH _ANGLE0	;angle
		MOVWF	T_ANGLE+1		;target angle
		CALL	RUN_MOTOR0		;run and detect
		BTFSC	FLAG0,ERR		
		GOTO	ERR_DEAL

LOOP10	GOTO	LOOP
		
ERR_DEAL	GOTO	LOOP
		
;subroute

;run step motor
RUN_MOTOR0
		CLRF	S_S_ADD			;变速区步数充计。
		CLRF	PORTB
		CLRF	PORTB
		NOP
		BCF		FLAG0,D_S_STEPS	;decelerate shift flag
		BSF		PORTC,S_LED		;position led
		CLRF	S_ADD			;step add
		CLRF	S_ADD+1			;step add high 8 bit

R_M0020	MOVF	S_S_ADD,W
		ADDLW	-_MAX_S_STEPS	;shift steps add,变速区的最大步距
		BTFSC	STATUS,C
		GOTO	R_M0250			;equment
		LCALL	SPEED_TABLE
		GOTO	R_M0400		
R_M0250	MOVLW	_MAX_S_STEPS
		LCALL	SPEED_TABLE
		MOVWF	B_T_COUNT
		GOTO	R_M0500
;设定步频率.
R_M0400	MOVWF	B_T_COUNT		;one beat time count
		BTFSC	FLAG0,D_S_STEPS
		GOTO	R_M0420
		INCF	S_S_ADD
		GOTO	R_M0500
R_M0420 DECF	S_S_ADD
		LCALL	SPEED_TABLE
;判断运行到第几拍.设定运行的相数.		
R_M0500 CALL	EN_STEPST	
R_M0700	MOVF	B_T_COUNT,W		;a beat finish ?wait
		BTFSS	STATUS,Z
		GOTO	R_M0700
		
		INCF	S_ADD		;step add 1
		BTFSC	STATUS,Z
		INCF	S_ADD+1
		
		MOVF	S_ADD,W
		SUBWF	T_ANGLE,W		;T_ANGLE-S_ADD
		MOVWF	TEMP0
		BTFSS	STATUS,C
		GOTO	R_M0705
		MOVF	S_ADD+1,W
		GOTO	R_M070A
R_M0705	INCF	S_ADD+1,W
R_M070A	SUBWF	T_ANGLE+1,W
		MOVWF	TEMP1
		IORWF	TEMP0,W
		BTFSC	STATUS,Z
		GOTO	R_M0730
				
		MOVF	TEMP1,W			;在减速区域内?。
		BTFSS	STATUS,Z
		GOTO	R_M0020
		MOVF	TEMP0,W
		SUBLW	_MAX_S_STEPS
		BTFSS	STATUS,Z
		GOTO	R_M0720
		DECF	S_S_ADD			;在减速区域内。
		BSF		FLAG0,D_S_STEPS ;dec shift steps
		GOTO	R_M0020
		
R_M0720	BTFSC	FLAG0,ORIE		;反向减速区域。
		GOTO	R_M0020
		BTFSS	FLAG0,D_S_STEPS
		GOTO	R_M0020
		BTFSC	PORTA,STATE	
		GOTO	R_M0020
		GOTO	R_M0780			;检测到位
				
R_M0730 BTFSS	FLAG0,ORIE	;在零的情况(返回处理)
		GOTO	R_M0740
		CLRF	PORTB
		RETURN	
		
R_M0740	BTFSC	PORTA,STATE	
		GOTO	R_M0750
		NOP
		NOP
		BTFSC	PORTA,STATE		
		GOTO	R_M0750
		GOTO	R_M0790
		
R_M0750 MOVLW	_DIFFERENCE		;difference,差距.
		MOVWF	S_S_ADD
		MOVLW	LOW -_DIFFERENCE
		ADDWF	S_ADD
		BTFSC	STATUS,C		;C=1;W>T_S_ADDL
		INCF	S_ADD+1,W
		ADDWF	HIGH -_DIFFERENCE	
		GOTO	R_M0020
		
R_M0780	BTFSC	PORTA,STATE		;未达到零的情况(返回处理)
		GOTO	R_M0020
		NOP
		NOP
		BTFSC	PORTA,STATE		
		GOTO	R_M0020
R_M0790	CLRF	PORTB
		BCF		PORTC,S_LED	;亮到位指示灯
		MOVLW	_REACH_DELAY		;
		MOVWF	D_TIME1
		CALL	DELAY_TIME1
		RETURN		
		
;PWM1 start
PWM1_START0
		MOVLW	_SCALE0/4		;_PWM_T*4*_PERCENT0/064H,PWM CYCLE 占空比.
		MOVWF	CCPR1L
		MOVLW	_SCALE0%4*10H	;_PWM_T%4*10H*_PERCENT0/064H
		ANDLW	030H
		IORLW	0CH
		MOVWF	CCP1CON			;PWM modle and low 2 bit set.
		RETURN

;PWM2 start
PWM2_START0
		MOVLW	_SCALE0/4		;_PWM_T*4*_PERCENT0/100,PWM CYCLE 占空比.
		MOVWF	CCPR2L
		MOVLW	_SCALE0%4*10H	;_PWM_T%4*10H*_PERCENT0/100
		ANDLW	030H
		IORLW	0CH
		MOVWF	CCP2CON			;PWM modle and low 2 bit set.
		RETURN

;PWM1 start
PWM1_START1
		MOVLW	_SCALE1/4	;PWM CYCLE 占空比.
		MOVWF	CCPR1L
		MOVLW	_SCALE1%4*10H
		ANDLW	030H
		IORLW	0CH
		MOVWF	CCP1CON			;PWM modle and low 2 bit set.
		RETURN

;PWM2 start
PWM2_START1
		MOVLW	_SCALE1/4	;PWM CYCLE 占空比.
		MOVWF	CCPR2L
		MOVLW	_SCALE1%4*10H
		ANDLW	030H
		IORLW	0CH
		MOVWF	CCP2CON			;PWM modle and low 2 bit set.
		RETURN

;check status
C_STATUS	BTFSC	PORTA,STATE
		GOTO	C_S20
		BCF		PORTC,S_LED
		GOTO	C_S30
C_S20	BSF		PORTC,S_LED ;status led		
C_S30	BSF		PORTC,W_LED		;
		BTFSS	PORTA,COMMAND
		BCF		PORTC,W_LED
		RETURN

DELAY_TIME0	MOVF D_TIME0,W
		BTFSS	STATUS,Z
		GOTO 	DELAY_TIME0
		RETURN

DELAY_TIME1	MOVLW	064H
		MOVWF	D_TIME0
D_T120	MOVF 	D_TIME0,W
		BTFSC	STATUS,Z
		GOTO	D_T130
		GOTO	D_T120
D_T130	DECFSZ	D_TIME1
		GOTO	DELAY_TIME1
		RETURN

		ORG		0300H
EN_STEPST	BTFSS	FLAG0,ORIE	;enactment steps
		GOTO	EN_S600
		MOVLW	HIGH TABLE0
		MOVWF	PCLATH
		MOVF	S_ADD,W
		ANDLW	07H
		ADDWF	PCL
TABLE0	GOTO	EN_S500
		GOTO	EN_S510
		GOTO	EN_S520
		GOTO	EN_S530
		GOTO	EN_S540
		GOTO	EN_S550
		GOTO	EN_S560
		GOTO	EN_S570
EN_S500	;CLRF	PORTB
		NOP
		NOP
		BCF		PORTB,UBEN
		BSF		PORTB,AEN	;A
		GOTO	EN_S580
		
EN_S510	BSF		PORTB,BEN	;AB
		GOTO	EN_S590

EN_S520	BCF		PORTB,AEN	;B
		GOTO	EN_S580

EN_S530	BSF		PORTB,UAEN		;B/A
		GOTO	EN_S590	
		
EN_S540	BCF		PORTB,BEN		;/A
		GOTO	EN_S580
		
EN_S550	BSF		PORTB,UBEN		;/A/B
		GOTO	EN_S590
		
EN_S560	BCF		PORTB,UAEN		;/B
		GOTO	EN_S580
		
EN_S570	BSF		PORTB,AEN		;A/B
		GOTO	EN_S590
		
EN_S580	CALL	PWM1_START0
		CALL	PWM2_START0
		RETURN
EN_S590	CALL	PWM1_START1
		CALL	PWM2_START1
		RETURN

EN_S600	MOVLW	HIGH TABLE0
		MOVWF	PCLATH
		MOVF	S_ADD,W
		ANDLW	07H
		ADDWF	PCL
		GOTO	EN_S601
		GOTO	EN_S610
		GOTO	EN_S620
		GOTO	EN_S630
		GOTO	EN_S640
		GOTO	EN_S650
		GOTO	EN_S660
		GOTO	EN_S670
EN_S601	;CLRF	PORTB
		NOP
		NOP
		BCF		PORTB,BEN
		BSF		PORTB,AEN	;A
		GOTO	EN_S580
		
EN_S610	BSF		PORTB,UBEN	;A/B
		GOTO	EN_S590

EN_S620	BCF		PORTB,AEN	;/B
		GOTO	EN_S580

EN_S630	BSF		PORTB,UAEN		;/B/A
		GOTO	EN_S590	
		
EN_S640	BCF		PORTB,UBEN		;/A
		GOTO	EN_S580
		
EN_S650	BSF		PORTB,BEN		;/AB
		GOTO	EN_S590
		
EN_S660	BCF		PORTB,UAEN		;B
		GOTO	EN_S580
		
EN_S670	BSF		PORTB,AEN		;AB
		GOTO	EN_S590

		ORG		0400H
SPEED_TABLE
		MOVLW	HIGH S_TABLE
		MOVWF	PCLATH
		MOVF	S_S_ADD,W
		ADDWF	PCL
		RETLW	0C8H	;100HZ  ,10000/100*2
		RETLW	0C8H	;100HZ  ,10000/100*2
		RETLW	0C8H	;100HZ
		RETLW	0C8H	;100HZ
		RETLW	064H	;200HZ  ,10000/200*2
		RETLW	064H	;200HZ  ,10000/200*2
		RETLW	028H	;500
		RETLW	028H	;500					,07
		RETLW	028H	;
		RETLW	028H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		RETLW	014H
		END
;
;****************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -