📄 open_bldchalic.asm
字号:
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 + -