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

📄 snsles2431.asm

📁 汇编语言开发的BLDC驱动程序。 基于PIC18F1330单片机。
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	movlw	b'00000010'
	movwf	CAP1CON                         ;every rising edge ,time base not reset
	movlw	b'00000000'                     
	movwf	CAP2CON                         ;off
	movlw	b'00000000'
	movwf	CAP3CON                         ;off
	movlw	b'00111010'
	movwf	DFLTCON                         ; ic1 ic2 ic3 digital fillter 1:4
	movlw	b'00000000'	;Disable QEI
	movwf	QEICON

;-----------------------------------------------------------------
;init PORTC
	movlw	b'00000111'
	movwf	TRISC

;-----------------------------------------------------------------
;init Timer1
	movlw	b'10000001'
	movwf	T1CON
	movlw	0xC3		;0xC350 = 10mSec@20MHz
	movwf	TMR1H
	movlw	0xFF
	movwf	TMR1L
;-----------------------------------------------------------------
;-----------------------------------------------------------------
	clrf	SPEED_REFH
	clrf	CURRENT_UH	
	clrf	CURRENT_UL	
	clrf	FLAGS_SRLS
;-----------------------------------------------------------------
INITIALIZE_SERIAL_PORT

;	movlw	0x81		;Baudrate = 9600
;	movwf	SPBRG
;	
;	movlw	0x24		;8-bit transmission;Enable Transmission;	
;	movwf	TXSTA		;Asynchronous mode with High speed transmission
	
;	movlw	0x90		;Enable the serial port
;	movwf	RCSTA		;with 8-bit continuous reception

;	bcf	TRISC,6
;	bsf	TRISC,7

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

;init interrupts
	bsf	PIE1,ADIE	;AD Converter over Interrupt enable
	bsf	PIE3,PTIE		;PWM interrupt
	bsf	PIE1,TMR1IE

	movlw	0x093		;Power ON reset status bit/Brownout reset status bit
	movwf	RCON		;and Instruction flag bits are set
				;Priority level on Interrupots enabled

	RETURN
	

;*******************************************************************************
;This routine checks for the keys status. 2 keys are checked, Run/Stop and 
;Forward(FWD)/Reverse(REV)  
;*******************************************************************************
KEY_CHECK
	btfsc	KEY_PORT,RUN_STOP_KEY			;Is key pressed "RUN/STOP"?
	goto	CHECK_FWD_REV_KEY
    bsf		FLAGS1,KEY_PRESSED      ;;;;;;;;;;;;
	btfsc	FLAGS1,DEBOUNCE
	return
	call	KEY_DEBOUNCE
	btfss	FLAGS1,DEBOUNCE
	return
	bsf		FLAGS1,KEY_RS
    goto    SET_KEYS              ;;;;;;;;;;;;;;;;
	return
	
CHECK_FWD_REV_KEY
    bsf		FLAGS1,KEY_PRESSED    ;;;;;;;;;;;;;;;;;;;;;;
	btfsc	KEY_PORT,FWD_REV_KEY			;Is key pressed "RUN/STOP"?
	goto	SET_KEYS
	btfsc	FLAGS1,DEBOUNCE
	return
	call	KEY_DEBOUNCE
	btfss	FLAGS1,DEBOUNCE
	return
	bsf		FLAGS1,KEY_FR
	return

SET_KEYS
	btfss	FLAGS1,DEBOUNCE

	return
	bcf		FLAGS1,DEBOUNCE
	bsf		FLAGS1,KEY_PRESSED	
	btfss	FLAGS1,KEY_RS
	bra		ITS_FWD_REV	
	btg		FLAGS1,RUN_STOP
	return
ITS_FWD_REV	
	btg		FLAGS1,FWD_REV
	return


;*******************************************************************************
KEY_DEBOUNCE
	decfsz	DEBOUNCE_COUNTER,F
	return
	bsf		FLAGS1,DEBOUNCE
	movlw	DEBOUNCE_COUNT
	movwf	DEBOUNCE_COUNTER
	return
;*******************************************************************************
PROCESS_KEY_PRESSED
	btfss	FLAGS1,KEY_PRESSED
	return
	btfss	FLAGS1,KEY_RS
	goto	CHECK_FWD_REV
	btfss	FLAGS1,RUN_STOP	
	goto	STOP_MOTOR_NOW
	call	RUN_MOTOR_AGAIN
	bcf		FLAGS1,KEY_PRESSED
	bcf		FLAGS1,KEY_RS

	bsf		LED_PORT,RUN_STOP_LED	
	return

STOP_MOTOR_NOW
	call	STOP_MOTOR		;STOP motor
	bcf		FLAGS1,KEY_PRESSED
	bcf		FLAGS1,KEY_RS
	bcf		LED_PORT,RUN_STOP_LED	
	return

CHECK_FWD_REV
	btfss	FLAGS1,KEY_FR
	return

	btg		LED_PORT,FWD_REV_LED	

	bcf		LED_PORT,RUN_STOP_LED	
	call	STOP_MOTOR

	call	DELAY

	call	RUN_MOTOR_AGAIN
	bcf		FLAGS1,KEY_PRESSED
	bcf		FLAGS1,KEY_FR
	bsf		LED_PORT,RUN_STOP_LED	
	return

;*******************************************************************************
;This routine stops the motor by driving the PWMs to 0% duty cycle.
;*******************************************************************************
STOP_MOTOR

    movlw   0x00
    movwf   CX
    movwf   CX1
    movwf   CX2
    movwf   CX3
    movwf   CX4
	bcf		PIE1,ADIE
	bcf		PIE3,IC1IE		;Velocity capture
	bcf		PIE3,IC3DRIE	;Diection change
	bcf		PIE3,IC2QEIE	;QEI interrupt
	bcf		PIE3,PTIE		;PWM interrupt
	bcf		PIE1,TMR1IE

	clrf	OVDCOND		;STOP motor
	clrf	PDC0H
	clrf	PDC1H
	clrf	PDC2H	
	clrf	PDC3H	
	clrf	PDC0L	
	clrf	PDC1L
	clrf	PDC2L
	clrf	PDC3L
	bcf		FLAGS,CALC_PWM
	clrf	SPEED_REFH
	return
;*******************************************************************************
;This routine starts motor from previous stop with motor parameters initialized
;*******************************************************************************
RUN_MOTOR_AGAIN
    movlw   0x00
    movwf   CX
    movwf   CX1
    movwf   CX2
    movwf   CX3
    movwf   CX4
	bsf		FLAGS1,RUN_STOP	
;	bcf		FLAGS,FLAG_FAULT
;-----------------------------------------------------------------
	clrf	SPEED_REFH
	clrf	CURRENT_UH	
	clrf	CURRENT_UL	

;-----------------------------------------------------------------
	bsf		PIE1,ADIE
	bsf		PIE3,IC1IE		;Velocity capture
	bsf		PIE1,TMR1IE		;enable T1 interrupt
	bsf		PIE3,PTIE		;PWM interrupt

	clrf	FLAGS

	movlw	b'10000000'	;Faults on 
	movwf	FLTCONFIG
	bcf		FLT_FLAGS,OCUR
	bcf		FLT_FLAGS,OVOLT
	bcf		FLT_FLAGS,OTEMP

	clrf	FLAGS_SRLS
	clrf	OVDCOND_TEMP

	movlw	0xF0
	movwf	COUNT_OPEN_LOOPH
	movwf	COUNT_OPEN_LOOPL
	return


;---------------------------------
TOGGLE_LEDS

	incfsz	COUNTER_SP,F
	return
	incfsz	COUNTER_SP1,F
	return
	btg		LED1
	btg		LED2
	btg		LED3

	return
;------------------------------------------
FIRST_ADC_INIT
   
	movlw	b'00100111'
	movwf	ADCON0
	movlw	b'00000000'
	movwf	ADCON1
	movlw	b'00110010'
	movwf	ADCON2
	movlw	b'00000000'
	movwf	ADCON3
	movlw	b'00000000' 
	movwf	ADCHS
	movlw	b'00000010'	
	movwf	ANSEL0
	movlw	b'00000000'
	movwf	ANSEL1

	bcf		TRISC,0
	bcf		TRISC,2
	bcf		TRISC,3
	return
	
LED_BLINK
	bcf		LED1
	bcf		LED2
	bcf		LED3

	movlw	0X40
	cpfsgt	ADRESH	
	return
    bcf     TRISC,5
	bsf		LED1
	movlw	0x80
	cpfsgt	ADRESH
	return
    bcf     TRISC,6
	bsf		LED2
	movlw	0XD0
	cpfsgt	ADRESH	
	return
    bcf     TRISC,7
	bsf		LED3
	return

;*******************************************************************************
SET_SEQUENCE_COUNT
	call	OPEN_LOOP_PWM

	btfss	FLAGS1,FWD_REV
	bra		RUN_REVERSE

	movlw	0x5					;Check for the last value on the table
	cpfslt	TABLE_OFFSET
	bra		CLEAR_OFFSET
	incf	TABLE_OFFSET,F		;Increment offset1
	bra		LOAD_SEQUENCE_COUNT
CLEAR_OFFSET
	clrf	TABLE_OFFSET
	bra		LOAD_SEQUENCE_COUNT
RUN_REVERSE
	decf	TABLE_OFFSET,F		;Increment offset1
	btfsc	STATUS,C
	bra		LOAD_SEQUENCE_COUNT
LOAD_OFFSET
	movlw	0x5	
	movwf	TABLE_OFFSET

LOAD_SEQUENCE_COUNT
	movf	TABLE_OFFSET,W
	btfss	STATUS,Z
	bra		NEXT_TEST1
    movlw   b'00000010'
    movwf   OVDCONS
    movlw   b'00010000'
	movwf	OVDCOND
	btg		LED1
	return
NEXT_TEST1
	movf	TABLE_OFFSET,W
	sublw	0x01
	btfss	STATUS,Z
	bra		NEXT_TEST2
    movlw   b'00001000'
    movwf   OVDCONS
    movlw   b'00010000'
	movwf	OVDCOND
	btg		LED1
	return
NEXT_TEST2
	movf	TABLE_OFFSET,W 
	sublw	0x02
	btfss	STATUS,Z
	bra		NEXT_TEST3
    movlw   b'00001000'
    movwf   OVDCONS
    movlw   b'00000001'
	movwf	OVDCOND
	btg		LED1
	return
NEXT_TEST3
	movf	TABLE_OFFSET,W
	sublw	0x03
	btfss	STATUS,Z
	bra		NEXT_TEST4
    movlw   b'00100000'
    movwf   OVDCONS
    movlw   b'00000001'
	movwf	OVDCOND
	btg		LED1
	return
NEXT_TEST4
	movf	TABLE_OFFSET,W
	sublw	0x04
	btfss	STATUS,Z
	bra		NEXT_TEST5
    movlw   b'00100000'
    movwf   OVDCONS
    movlw   b'00000100'
	movwf	OVDCOND
	btg		LED1
	return
NEXT_TEST5
	movf	TABLE_OFFSET,W
	sublw	0x05
	btfss	STATUS,Z
	return
    movlw   b'00000010'
    movwf   OVDCONS
    movlw   b'00000100'
	movwf	OVDCOND
	btg		LED1
	return

;*******************************************************************************
;This routine sets PWM duty cycles for open loop while starting the motor from stand still
OPEN_LOOP_PWM
  movlw   0x07
  cpfsgt  CX4
  bra     AAA
  movlw   0x9f
  movwf	  PDC_TEMPL
  movlw	  0x00	
  movwf	  PDC_TEMPH
  bra     BBBBB
AAA
  movlw   0x05
  cpfsgt  CX4
  bra     AAAA
  movlw   0xbf
  movwf	  PDC_TEMPL
  movlw	  0x00	
  movwf	  PDC_TEMPH
  bra     BBBBB

AAAA  
  movlw   0x03
  cpfsgt  CX4
  bra     AAAAA
  movlw   0xdf
  movwf	  PDC_TEMPL
  movlw	  0x00	
  movwf	  PDC_TEMPH
  bra     BBBBB
AAAAA
    movlw   0x1f
	movwf	PDC_TEMPL
	movlw	0x01	
	movwf	PDC_TEMPH
   
BBBBB
	bsf		PWMCON1,UDIS	;Disable the PWM buffer update

	movf	PDC_TEMPH,W
	movwf	PDC0H
	movwf	PDC1H
	movwf	PDC2H	
	movwf	PDC3H	

	movf	PDC_TEMPL,W
	movwf	PDC0L	
	movwf	PDC1L
	movwf	PDC2L
	movwf	PDC3L

	bcf		PWMCON1,UDIS	;Disable the PWM buffer update

	RETURN






;*******************************************************************************
;This routine sends data to PC. Displayed on Hyper terminal

SEND_DATA_TO_PC


	bcf		FLAGS_SRLS,PC_COM
	movlw	0xA	;new line
	call	SEND_BYTE_FROM_WREG
	movlw	0xD	;carriage return
	call	SEND_BYTE_FROM_WREG

	movf	OVDCOND_TEMP,W	
	addlw	0x41
	call	SEND_BYTE_FROM_WREG
	movf	BEMF_ZC,W	
	addlw	0x41
	call	SEND_BYTE_FROM_WREG

	return

;---------------------------------------------------------
DISPLAY_DIGITS
	movf	DISPLAY_TEMP1,W
	andlw	0xF0
	swapf	WREG,W
	addlw	0x30	
	call	CHECK_39
	call	SEND_BYTE_FROM_WREG
	movf	DISPLAY_TEMP1,W
	andlw	0x0F
	addlw	0x30	
	call	CHECK_39
	call	SEND_BYTE_FROM_WREG
	RETURN
;------------------------------
CHECK_39
	movwf	DISPLAY_TEMP2
	movlw	0x39
	cpfsgt	DISPLAY_TEMP2
	bra		LESS_39
	movf	DISPLAY_TEMP2,W
	addlw	0x7
	return
LESS_39
	movf	DISPLAY_TEMP2,W
	return
;------------------------------
SEND_BYTE_FROM_WREG
	btfss	PIR1,TXIF
	goto	SEND_BYTE_FROM_WREG
	movwf	TXREG
	return

;*******************************************************************************
;Delay routine.
;*******************************************************************************
Delay_300ms
  
	movlw	0xff
	movwf	T
DEC1	
	movlw	0xff
	movwf	J
DEC2
	decfsz	J,F
	goto	DEC2
	decfsz	T,F
	goto	DEC1
	return		




DELAY

	movlw	DELAY_COUNT1
	movwf	COUNTER
dec_count	
	movlw	DELAY_COUNT2
	movwf	COUNTER1
dec_count1
	decfsz	COUNTER1,F
	goto	dec_count1
	decfsz	COUNTER,F
	goto	dec_count
	clrf	COUNTER
	clrf	COUNTER1
	return		
	END

⌨️ 快捷键说明

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