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