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

📄 clsd_bldchalhal.asm

📁 This program controls a BLDC motor in closed loop using PIC18Fxx31 devices. Hardware used is PICDE
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	movwf	TRISC
	bsf		PORTC,0
;-----------------------------------------------------------------
;init PORTD
;LED1,LED2,LED3 are connected to PORTD<0:2>
	movlw	0xD0
	movwf	TRISD
	bsf		PORTD,0
	bsf		PORTD,1
	bsf		PORTD,2

;-----------------------------------------------------------------
;The sequence table is enetered for two different types of motors.
;If Bodine-Electric motor is used, the Hall sensors are @ 60 deg phase shift to each other
;The secone sequence takes Hall sensor inputs at 120 degrees phase shift 
LOAD_SEQUENCE_TABLE

 ifdef	HALL_60_DEGREE	
;Forward sequence
	movlw	POSITION2
	movwf	POSITION_TABLE_FWD
	movlw	POSITION3
	movwf	POSITION_TABLE_FWD+1
	movlw	DUMMY_POSITION
	movwf	POSITION_TABLE_FWD+2
	movlw	POSITION4
	movwf	POSITION_TABLE_FWD+3
	movlw	POSITION1
	movwf	POSITION_TABLE_FWD+4
	movlw	DUMMY_POSITION
	movwf	POSITION_TABLE_FWD+5
	movlw	POSITION6
	movwf	POSITION_TABLE_FWD+6
	movlw	POSITION5
	movwf	POSITION_TABLE_FWD+7
;Reverse sequence
	movlw	POSITION5
	movwf	POSITION_TABLE_REV	
	movlw	POSITION6
	movwf	POSITION_TABLE_REV+1
	movlw	DUMMY_POSITION
	movwf	POSITION_TABLE_REV+2
	movlw	POSITION1
	movwf	POSITION_TABLE_REV+3
	movlw	POSITION4
	movwf	POSITION_TABLE_REV+4
	movlw	DUMMY_POSITION
	movwf	POSITION_TABLE_REV+5
	movlw	POSITION3
	movwf	POSITION_TABLE_REV+6
	movlw	POSITION2
	movwf	POSITION_TABLE_REV+7
 endif
 ifdef	HALL_120_DEGREE	
;Forward sequence
	movlw	DUMMY_POSITION
	movwf	POSITION_TABLE_FWD
	movlw	POSITION2
	movwf	POSITION_TABLE_FWD+1
	movlw	POSITION6
	movwf	POSITION_TABLE_FWD+2
	movlw	POSITION1
	movwf	POSITION_TABLE_FWD+3
	movlw	POSITION4
	movwf	POSITION_TABLE_FWD+4
	movlw	POSITION3
	movwf	POSITION_TABLE_FWD+5
	movlw	POSITION5
	movwf	POSITION_TABLE_FWD+6
	movlw	DUMMY_POSITION
	movwf	POSITION_TABLE_FWD+7
;Reverse sequence
	movlw	DUMMY_POSITION
	movwf	POSITION_TABLE_REV
	movlw	POSITION5	
	movwf	POSITION_TABLE_REV+1
	movlw	POSITION3	
	movwf	POSITION_TABLE_REV+2
	movlw	POSITION4	
	movwf	POSITION_TABLE_REV+3
	movlw	POSITION1	
	movwf	POSITION_TABLE_REV+4
	movlw	POSITION6	
	movwf	POSITION_TABLE_REV+5
	movlw	POSITION2	
	movwf	POSITION_TABLE_REV+6
	movlw	DUMMY_POSITION
	movwf	POSITION_TABLE_REV+7
 endif 
;-----------------------------------------------------------------
	clrf	SPEED_REFH
	clrf	VELOCITY_READH
	clrf	VELOCITY_READL
	clrf	SPEED_REF_RPMH		
	clrf	SPEED_REF_RPML		
	clrf	SPEED_FEEDBACKH		
	clrf	SPEED_FEEDBACKL		
	clrf	SPEED_ERRORH	
	clrf	SPEED_ERRORL		
	clrf	ERROR_PWMH			
	clrf	ERROR_PWML			
	clrf	CURRENT_UH	
	clrf	CURRENT_UL	
	clrf	CURRENT_VH	
	clrf	CURRENT_VL	
	clrf	HEATSINK_TEMPH		
	clrf	HEATSINK_TEMPL		
;-----------------------------------------------------------------
;Enable required interrupt

	bsf	PIE1,ADIE		;AD Converter over Interrupt enable
	bsf	PIE3,IC1IE		;Input Capture1 interrupt enabled
	bsf	PIE3,IC2QEIE	;Input Capture2 interrupt enabled
	bsf	PIE3,IC3DRIE	;Input Capture3 interrupt enabled
	bsf	PIE3,PTIE		;PWM interrupt enebled

	movlw	0x093		;Power ON reset status bit/Brownout reset status bit
	movwf	RCON		;and Instruction flag bits are set
						
	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		;Key debounce time checked
	return
	bsf		FLAGS1,DEBOUNCE
	movlw	DEBOUNCE_COUNT
	movwf	DEBOUNCE_COUNTER
	return
;*******************************************************************************
;This routine takes action for the keys pressed
;If SW1(RUN/STOP) Key is pressed, the state toggles between RUN and STOP
;If SW2(FWD/REV) Key is pressed, the state toggles between FORWARD and REVERSE
PROCESS_KEY_PRESSED
	btfss	FLAGS1,KEY_PRESSED			;Is there a key press waiting?
	return
	btfss	FLAGS1,KEY_RS				;Is it RUN/STOP?
	goto	CHECK_FWD_REV
	btfss	FLAGS1,RUN_STOP				;Yes,Was the previous state a Stop?
	goto	STOP_MOTOR_NOW
	call	RUN_MOTOR_AGAIN				;Yes, Then RUN the motor 
	bcf		FLAGS1,KEY_PRESSED			;Clear the Flag
	bcf		FLAGS1,KEY_RS
	bsf		LED_PORT,RUN_STOP_LED		;Turn on LED to indicate motor running	
	return

STOP_MOTOR_NOW							
	call	STOP_MOTOR					;Was the previous state a RUN?, Then stop the motor
	bcf		FLAGS1,KEY_PRESSED
	bcf		FLAGS1,KEY_RS
	bcf		LED_PORT,RUN_STOP_LED		;Clear Flags and indicate motor stopped on LED
	return


CHECK_FWD_REV
	btfss	FLAGS1,KEY_FR				;Is the Key pressed = FWD/REV?
	return

	btg		LED_PORT,FWD_REV_LED		;Yes,
	bcf		LED_PORT,RUN_STOP_LED	
	call	STOP_MOTOR					;Stop the motor before reversing
	call	DELAY
	call	RUN_MOTOR_AGAIN				;Run the motor in Reverse direction
	bcf		FLAGS1,KEY_PRESSED			;Clear Flags
	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		;Disable all used interrupts 
	bcf		PIE3,IC1IE		
	bcf		PIE3,IC3DRIE	
	bcf		PIE3,IC2QEIE	
	bcf		PIE1,TMR1IE		
	bcf		PIE3,PTIE		

	clrf	OVDCOND			;Clear the over ride
	clrf	PDC0H			;Clear all PWM duty cycles
	clrf	PDC1H
	clrf	PDC2H	
	clrf	PDC3H	
	clrf	PDC0L	
	clrf	PDC1L
	clrf	PDC2L
	clrf	PDC3L
	bcf		FLAGS,CALC_PWM	;Clear the FLAG indicating the pending PWM calculation 
	clrf	SPEED_REFH		;Clear SPEED_REF 

	return
;*******************************************************************************
;This routine starts motor from previous stop with motor parameters initialized
;*******************************************************************************
RUN_MOTOR_AGAIN
;Re-initialize all variables and flags
	bsf		FLAGS1,RUN_STOP	
;-----------------------------------------------------------------
	clrf	SPEED_REFH
	clrf	VELOCITY_READH
	clrf	VELOCITY_READL
	clrf	SPEED_REF_RPMH		
	clrf	SPEED_REF_RPML		
	clrf	SPEED_FEEDBACKH		
	clrf	SPEED_FEEDBACKL		
	clrf	SPEED_ERRORH	
	clrf	SPEED_ERRORL		
	clrf	ERROR_PWMH			
	clrf	ERROR_PWML			
	clrf	CURRENT_UH	
	clrf	CURRENT_UL	
	clrf	CURRENT_VH	
	clrf	CURRENT_VL	
	clrf	HEATSINK_TEMPH		
	clrf	HEATSINK_TEMPL		
;-----------------------------------------------------------------
;Enable all used interrupt
	bsf		PIE1,ADIE
	bsf		PIE3,IC1IE		
	bsf		PIE3,IC3DRIE	
	bsf		PIE3,IC2QEIE	;
	bsf		PIE1,TMR1IE		
	bsf		PIE3,PTIE		
	clrf	FLAGS

	movlw	b'10110011'	;Faults on 
	movwf	FLTCONFIG
	clrf	FLT_FLAGS		;Clear Fault indicator bits

	call	UPDATE_SEQUENCE

	return

;------------------------------------------
;This routine is used only when the part comes out of a hard reset.
;The ADC in initialized to read the potentiometer continuously 
;and display the level on 4 LEDs(25% each)

FIRST_ADC_INIT
	movlw	0x03	
	movwf	TRISE	
	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		TRISD,0
	bcf		TRISD,1
	bcf		TRISD,2
	return
	
LED_ON_OFF
	bcf		LED1
	bcf		LED2
	bcf		LED3
	bcf		LED4
	movlw	0X40
	cpfsgt	ADRESH	
	return
	bsf		LED4
	movlw	0x70
	cpfsgt	ADRESH
	return
	bsf		LED3
	movlw	0XA0
	cpfsgt	ADRESH	
	return
	bsf		LED2
	movlw	0XE0
	cpfsgt	ADRESH	
	return
	bsf		LED1
	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		

;*******************************************************************************
;AGR1H:ARG1L/ARG2H:ARG2L

DIVISION_16BY16
	clrf	RESH
	clrf	RESL
REPEAT_SUBTRACTION
	movf	ARG2L,W
	bnz		NO_DIVID_BY_0
	movf	ARG2L,W
	bnz		NO_DIVID_BY_0
	return
NO_DIVID_BY_0
	bsf		STATUS,C
	movf	ARG2L,W
	subwfb	ARG1L,F
	btfsc	STATUS,C
	bra		SUB_MSBYTE
	decf	ARG1H,F
	movlw	0xFF
	subwf	ARG1H,W
	bnz		SUB_MSBYTE
	return
SUB_MSBYTE
	movf	ARG2H,W
	subwf	ARG1H,F
	btfss	STATUS,C
	return
	infsnz	RESL,F
	incf	RESH,F
	bra		REPEAT_SUBTRACTION

;-----------------------------------------------------------
#define MAX_ERRORH 0x0F
#define MAX_ERRORL 0xA0

CHECK_ERROR_CAP
	movlw	MAX_ERRORH
	subwf	ERROR_PWMH,W
	btfss	STATUS,C				;Is PWM error vlaue>=Max_value
	return		;No,less
	btfss	STATUS,Z				;Is PWM = Max_value?
	bra		SEAL_ERROR_LIMIT	;No greater
	movlw	MAX_ERRORL
	subwf	ERROR_PWML,W
	btfss	STATUS,C				;Is PWM vlaueL>=Max_valueL
	return		;No,less
SEAL_ERROR_LIMIT
	movlw	MAX_ERRORH
	movwf	ERROR_PWMH
	movlw	MAX_ERRORL
	movwf	ERROR_PWML
	return

;******************************************************************
ADJUST_PID_OUT
	movff	pid_out0,ERROR_PWMH
	swapf	ERROR_PWMH,W
	andlw	0xF0
	movwf	ERROR_PWMH
	movff	pid_out1,ERROR_PWML
	swapf	ERROR_PWML,W
	andlw	0x0F
	iorwf	ERROR_PWMH,F
	
	movff	pid_out1,ERROR_PWML
	swapf	ERROR_PWML,W
	andlw	0xF0
	movwf	ERROR_PWML
	movff	pid_out2,WREG
	swapf	WREG,W
	andlw	0x0F
	iorwf	ERROR_PWML,F
	return
	
;******************************************************************

	END

⌨️ 快捷键说明

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