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

📄 snsles2431.asm.bak

📁 汇编语言开发的BLDC驱动程序。 基于PIC18F1330单片机。
💻 BAK
📖 第 1 页 / 共 2 页
字号:
;******************************************************************
FAULTA_PROCESS
	bsf		LED1
	bsf		LED2
	bsf		LED3

	bsf		FLAGS,FLAG_FAULT
	call	STOP_MOTOR
	bcf		FLTCONFIG,FLTAS
	bcf		FLT_FLAGS,OCUR
	bcf		FLAGS1,KEY_PRESSED
	bcf		FLAGS1,KEY_RS
	bcf		FLAGS1,RUN_STOP	
	return	

;******************************************************************
;Peripherals are initialized in this routine
;ADC,PWM, IC, ports and interrupts etc are initialized

INIT_PERPHERALS

;Initialize ADC 

	movlw	b'00010001'                 ;single shot 1a 2b
	movwf	ADCON0
	movlw	b'00010000'                 ;buffer0 avdd avss for ref fifo
	movwf	ADCON1
	movlw	b'00110010'                 ;left justifed 12TAD acquisition Fosc/32
	movwf	ADCON2
	movlw	b'10000000'                 ;interrupt on 4th ad results to fifo no trigger
	movwf	ADCON3
	movlw	b'00000000'                 ;select an0-an3
	movwf	ADCHS
	movlw	b'00000011'	                ;only use an0 an1, others are digital io
	movwf	ANSEL0
	movlw	b'00000000'
	movwf	ANSEL1

;-----------------------------------------------------------------
;Initialize PWM
	
	movlw	b'00000000'
	movwf	PTCON0                      ;timer base is free run 1:1 pre/postscaler (Fcy)
	
	movlw	0x37	                    ;20KHz = 0xFA		;20KHz of PWM frequency	 Fcy=5MHz		
	movwf	PTPERL	                    ;16KHz = 0x137
					                    ;12KHz = 0x1A0	
	movlw	0x01
	movwf	PTPERH
	
	movlw	b'01001111'	                ;PWM0-5 enabled in independent mode
	movwf	PWMCON0                     
	                                    
	movlw	b'00000001'	                ;Output overides synched wrt PWM timebase
	movwf	PWMCON1                     
	                                    
	movlw	b'00000000'	                ;
	movwf	DTCON                       
	                                    
	movlw	b'00000000'	                ;PWM0-5 PWM Duty cycle on overide 
	movwf	OVDCOND                     
	                                    
	movlw	b'00000000'	                ; All PWMs = 0 on init
	movwf	OVDCONS                     
	                                    
	movlw	b'10110011'	                ;Faults on 
	movlw	b'10000000'	                ;Faults on 
	movwf	FLTCONFIG
	
	movlw	0x00
	movwf	SEVTCMPL
	movlw	0x00
	movwf	SEVTCMPH

	clrf	PDC0L	
	clrf	PDC1L	
	clrf	PDC2L	
	clrf	PDC3L	
	clrf	PDC0H	
	clrf	PDC1H	
	clrf	PDC2H	
	clrf	PDC3H	

	movlw	b'10000000'		;PWM timer ON
	movwf	PTCON1
;-----------------------------------------------------------------
;init Hall @ IC1/IC2/IC3, Timer5
	bsf		TRISA,2
	bsf		TRISA,3
	bsf		TRISA,4
	movlw	b'00000001'	;1:1
	movwf	T5CON
	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'10110010'
	movwf	TRISC

;-----------------------------------------------------------------
;init Timer1
	movlw	b'10000001'
	movwf	T1CON
	movlw	0xC3		;0xC350 = 10mSec@20MHz
	movwf	TMR1H
	movlw	0xFF
	movwf	TMR1L
;-----------------------------------------------------------------
LOAD_SEQUENCE_TABLE
 
;Forward sequence
	movlw	POSITION01
	movwf	POSITION_TABLE_FWD
	movlw	POSITION61
	movwf	POSITION_TABLE_FWD+1
	movlw	POSITION51
	movwf	POSITION_TABLE_FWD+2
	movlw	POSITION41
	movwf	POSITION_TABLE_FWD+3
	movlw	POSITION31
	movwf	POSITION_TABLE_FWD+4
	movlw	POSITION21
	movwf	POSITION_TABLE_FWD+5
	movlw	POSITION11
	movwf	POSITION_TABLE_FWD+6
	movlw	POSITION71
	movwf	POSITION_TABLE_FWD+7
;Reverse sequence
	movlw	POSITION71
	movwf	POSITION_TABLE_REV
	movlw	POSITION21
	movwf	POSITION_TABLE_REV+1
	movlw	POSITION41
	movwf	POSITION_TABLE_REV+2
	movlw	POSITION61
	movwf	POSITION_TABLE_REV+3
	movlw	POSITION11
	movwf	POSITION_TABLE_REV+4
	movlw	POSITION31
	movwf	POSITION_TABLE_REV+5
	movlw	POSITION51
	movwf	POSITION_TABLE_REV+6
	movlw	POSITION01
	movwf	POSITION_TABLE_REV+7
;-----------------------------------------------------------------
	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
	btfsc	FLAGS1,DEBOUNCE
	return
	call	KEY_DEBOUNCE
	btfss	FLAGS1,DEBOUNCE
	return
	bsf		FLAGS1,KEY_RS
	return
	
CHECK_FWD_REV_KEY
	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
	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
	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
	bsf		LED1
	movlw	0x80
	cpfsgt	ADRESH
	return
	bsf		LED2
	movlw	0XD0
	cpfsgt	ADRESH	
	return
	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	POSITION1
	movwf	OVDCOND
	movwf	OVDCOND_TEMP
	btg		LED1
	return
NEXT_TEST1
	movf	TABLE_OFFSET,W
	sublw	0x1
	btfss	STATUS,Z
	bra		NEXT_TEST2
	movlw	POSITION3
	movwf	OVDCOND
	movwf	OVDCOND_TEMP
	btg		LED1
	return
NEXT_TEST2
	movf	TABLE_OFFSET,W
	sublw	0x2
	btfss	STATUS,Z
	bra		NEXT_TEST3
	movlw	POSITION2
	movwf	OVDCOND
	movwf	OVDCOND_TEMP
	btg		LED1
	return
NEXT_TEST3
	movf	TABLE_OFFSET,W
	sublw	0x3
	btfss	STATUS,Z
	bra		NEXT_TEST4
	movlw	POSITION6
	movwf	OVDCOND
	movwf	OVDCOND_TEMP
	btg		LED1
	return
NEXT_TEST4
	movf	TABLE_OFFSET,W
	sublw	0x4
	btfss	STATUS,Z
	bra		NEXT_TEST5
	movlw	POSITION4
	movwf	OVDCOND
	movwf	OVDCOND_TEMP
	btg		LED1
	return
NEXT_TEST5
	movf	TABLE_OFFSET,W
	sublw	0x5
	btfss	STATUS,Z
	return
	movlw	POSITION5
	movwf	OVDCOND
	movwf	OVDCOND_TEMP
	btg		LED1
	return

;*******************************************************************************
;This routine sets PWM duty cycles for open loop while starting the motor from stand still
OPEN_LOOP_PWM

	movlw	0x64
	cpfslt	SPEED_REFH	
	bra		AAAAA
	clrf	PDC_TEMPL	
	clrf	PDC_TEMPH
	bra		BBBBB	
AAAAA
	movlw	0xA5	
	movwf	PDC_TEMPL
	movlw	0x03	
	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
	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 + -