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

📄 open_bldchalic.asm

📁 This program controls a BLDC motor in closed loop using PIC18Fxx31 devices. Hardware used is PICDE
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	clrf	PDC1L
	clrf	PDC2L
	clrf	PDC3L

	call	UPDATE_SEQUENCE	;The sequence is updated even when the motor is not running
	RETURN					;The rotor may have moved by hand



;******************************************************************
INIT_PERPHERALS

;ADC initialization
;ADC is initialized to read 
;The Potentiometer connected to AN1
;Motor current Phase R or DC bus current connected to AN0
;Motor current Phase Y connected to AN6
;Motor current Phase B or Heatsink hermisotr connected to AN7

	movlw	0x07			
	movwf	TRISE			;RE0/1/2 are inputs
	movlw	b'00010101'		;ADC set in multiple channel sequential mode2(SEQM2)
	movwf	ADCON0
	movlw	b'00010000'		;FIFO buffer enabled
	movwf	ADCON1
	movlw	b'00110010'		;Left justified result,12 TAD acquisition time, ADC clock = FOsc/32
	movwf	ADCON2
	movlw	b'10000000'		;Interrupt generated when 4th word is written to bufeer
	movwf	ADCON3
	movlw	b'01000100' 	;AN0,AN1,AN6,AN7 are selected for conversion  
	movwf	ADCHS
	movlw	b'11000011'		;AN0,AN1,AN6,AN7 are selected as analog inputs  
	movwf	ANSEL0
	movlw	b'00000000'		;All other inputs set to digital
	movwf	ANSEL1
;-----------------------------------------------------------------
;PCPWM initalization
;PCPWM outputs initialized in independent mode. PWM<0:5> are enabled
	
	movlw	b'00000000'			;PWM timer is in free running mode(Edge aligned) with Fosc/4 input clock  
	movwf	PTCON0
	
	movlw	LOW(PTPER_VALUE)	; 20KHz = 0xFA		;20KHz of PWM frequency			
	movwf	PTPERL				;16KHz = 0x137
								;12KHz = 0x1A0	
	movlw	HIGH(PTPER_VALUE)
	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'			;No dead time inserted		
	movwf	DTCON
	
	movlw	b'00000000'			;PWM<0:5> PWM Duty cycle on overide 
	movwf	OVDCOND
	
	movlw	b'00000000'			; All PWMs = 0 on init
	movwf	OVDCONS
	
	movlw	b'10110011'			;FaultA = Over current,cycle by cycle mode  
	movwf	FLTCONFIG			;FaultbB = Over voltage,cycle by cycle mode
	
	movlw	0x00				;Special event not used
	movwf	SEVTCMPL
	movlw	0x00
	movwf	SEVTCMPH

	clrf	PDC0L				;Clear all PWM duty cycle registers
	clrf	PDC1L	
	clrf	PDC2L	
	clrf	PDC3L	
	clrf	PDC0H	
	clrf	PDC1H	
	clrf	PDC2H	
	clrf	PDC3H	

	movlw	b'10000000'			;PWM timer ON
	movwf	PTCON1
;-----------------------------------------------------------------
;Initializing the motion feedback module to read Hall sensors using InputCapture 
;HallA/B/C @ IC1/IC2/IC3
	bsf		TRISA,2				;IC1/2/3 inputs
	bsf		TRISA,3
	bsf		TRISA,4
	movlw	b'00011001'			;Timer5 ON with prescale 1:8
	movwf	T5CON
	movlw	b'01001000'			;Cap1/2/3-capture every input state change
	movwf	CAP1CON
	movlw	b'01001000'			;Cap1/2/3-capture every input state change
	movwf	CAP2CON
	movlw	b'01001000'			;Cap1/2/3-capture every input state change
	movwf	CAP3CON
	movlw	b'00000000'			;Digital filters disabled
	movwf	DFLTCON
	movlw	b'00000000'			;Disable QEI
	movwf	QEICON

;-----------------------------------------------------------------
;init PORTC
;PortC<0> LED4 : Output
;PortC<1> FaultA(Overcurrent): Input
;PortC<2> FaultB(Overcurrent): Input
;PortC<6> TX: Output
;PortC<7> RX: Input

	movlw	b'10111110'			;PortC<0> LED4 used for LEDs,FaultA and FaultB
	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	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		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
;This routine may be called from Stop to run or while reversing the direction
;*******************************************************************************
RUN_MOTOR_AGAIN
;Re-initialize all variables and flags
	bsf		FLAGS1,RUN_STOP	
;-----------------------------------------------------------------
	clrf	SPEED_REFH
	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		PIE3,PTIE		;PWM interrupt
	clrf	FLAGS

	movlw	b'10110011'		;Re initialize FaultA and FaultB in cycle by cycle mode 
	movwf	FLTCONFIG
	bcf		FLT_FLAGS,OCUR		;Clear Fault indicator bits
	bcf		FLT_FLAGS,OVOLT
	bcf		FLT_FLAGS,OTEMP

	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		

;******************************************************************

	END

⌨️ 快捷键说明

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