📄 bl_esc_100a_307b.asm
字号:
ret
;---------------------------------------------------
SHAFT_POSITION_TRIMMING:
mov TEMP5, #STEPPING_ON_DUTY_CHOPPING_COUNT
SHAFT_TRIM_START1:
; Stepping start with duty control as current limitter.
CHOP_DRIVE1:
call STEP_DRIVE_STATE
call START_ON_DUTY_CONTROL
djnz TEMP5, CHOP_DRIVE1
TRIM_DRIVE_OFF: mov SPIN_COUNTER, #0
; call test_pin_on
ret
;---------------------------------------------------
STEP_DRIVE_STATE: mov a, DRIVE_STATE
STEP_DRIVE_STATE1: cjne a, #1, STEP_DRIVE_STATE2
call PRE_CHARGE_STATE1_DRIVER
call STATE1_ON
ret
STEP_DRIVE_STATE2: cjne a, #2, STEP_DRIVE_STATE3
call PRE_CHARGE_STATE2_DRIVER
call STATE2_ON
ret
STEP_DRIVE_STATE3: cjne a, #3, STEP_DRIVE_STATE4
call PRE_CHARGE_STATE3_DRIVER
call STATE3_ON
ret
STEP_DRIVE_STATE4: cjne a, #4, STEP_DRIVE_STATE5
call PRE_CHARGE_STATE4_DRIVER
call STATE4_ON
ret
STEP_DRIVE_STATE5: cjne a, #5, STEP_DRIVE_STATE6
call PRE_CHARGE_STATE5_DRIVER
call STATE5_ON
ret
STEP_DRIVE_STATE6: call PRE_CHARGE_STATE6_DRIVER
call STATE6_ON
ret
;--------------------
STEP_START1: mov a, START_DRIVE_STATE
cjne a, #1, STEP_START2
call STATE1_ON
call STEP_DRIVE_CNT
call STATE2_ON
call STEP_DRIVE_CNT
call STATE3_ON
call STEP_DRIVE_CNT
call STATE4_ON
call STEP_DRIVE_CNT
call STATE5_ON
call STEP_DRIVE_CNT
call STATE6_ON
call STEP_DRIVE_CNT
jmp STEP_TO_BEMF
STEP_START2: cjne a, #2, STEP_START3
call STATE2_ON
call STEP_DRIVE_CNT
call STATE3_ON
call STEP_DRIVE_CNT
call STATE4_ON
call STEP_DRIVE_CNT
call STATE5_ON
call STEP_DRIVE_CNT
call STATE6_ON
call STEP_DRIVE_CNT
call STATE6_ON
call STEP_DRIVE_CNT
jmp STEP_TO_BEMF
STEP_START3: cjne a, #3, STEP_START4
call STATE3_ON
call STEP_DRIVE_CNT
call STATE4_ON
call STEP_DRIVE_CNT
call STATE5_ON
call STEP_DRIVE_CNT
call STATE6_ON
call STEP_DRIVE_CNT
call STATE1_ON
call STEP_DRIVE_CNT
call STATE2_ON
call STEP_DRIVE_CNT
jmp STEP_TO_BEMF
STEP_START4: cjne a, #4, STEP_START5
call STATE4_ON
call STEP_DRIVE_CNT
call STATE5_ON
call STEP_DRIVE_CNT
call STATE6_ON
call STEP_DRIVE_CNT
call STATE1_ON
call STEP_DRIVE_CNT
call STATE2_ON
call STEP_DRIVE_CNT
call STATE3_ON
call STEP_DRIVE_CNT
jmp STEP_TO_BEMF
STEP_START5: cjne a, #5, STEP_START6
call STATE5_ON
call STEP_DRIVE_CNT
call STATE6_ON
call STEP_DRIVE_CNT
call STATE1_ON
call STEP_DRIVE_CNT
call STATE2_ON
call STEP_DRIVE_CNT
call STATE3_ON
call STEP_DRIVE_CNT
call STATE4_ON
call STEP_DRIVE_CNT
jmp STEP_TO_BEMF
STEP_START6: call STATE6_ON
call STEP_DRIVE_CNT
call STATE1_ON
call STEP_DRIVE_CNT
call STATE2_ON
call STEP_DRIVE_CNT
call STATE3_ON
call STEP_DRIVE_CNT
call STATE4_ON
call STEP_DRIVE_CNT
call STATE5_ON
call STEP_DRIVE_CNT
STEP_TO_BEMF: ;call SPIN_FREE ; No reverse spin check here.
;mov SPIN_COUNTER, #0
ret
;------------
STEP_DRIVE_CNT:
mov TEMP5, STEPPING_ON_DUTY_CHOPPING_COUNTER
CHOP_ON_DUTY:
call STEP_DRIVE_STATE
call START_ON_DUTY_CONTROL
djnz TEMP5, CHOP_ON_DUTY
dec STEPPING_ON_DUTY_CHOPPING_COUNTER ; speed up for next state drive
dec STEPPING_ON_DUTY_CHOPPING_COUNTER ; as accelaration
dec STEPPING_ON_DUTY_CHOPPING_COUNTER
dec STEPPING_ON_DUTY_CHOPPING_COUNTER
ret
;------------
START_ON_DUTY_CONTROL:
ON_DUTY_TIM1: mov b, STEPPING_ON_DUTY
CLoop1: ;call WAIT_500nS
call WAIT_1uS
call WAIT_1uS
djnz b, CLoop1
;*********************************************
mov P0_IO, P0 ; IO data storage for P0
mov IO_MODE_M, P1MDOUT ; GPIO mode setting data storage
mov IO_SETTING, P1 ; IO data storage
;*********************************************
call SPIN_FREE ; takes a few uS for MOSFET OFF
call WDT_OFF
OFF_DUTY_TIM1: mov a, #START_STEPPING_DUTY_FRAME
clr c
subb a, STEPPING_ON_DUTY
mov b,a
CLoop2: call WAIT_500nS
;call WAIT_1uS
djnz b, CLoop2
;*********************************************
mov P0, P0_IO ; IO data storage for P0
mov P1, IO_SETTING ; IO data storage
mov P1MDOUT, IO_MODE_M ; GPIO mode setting data storage
;*********************************************
ret
;---------------------
BEMF_START_SPIN: mov STEP_START_FLAG, #1 ; Set STEP_START_FLAG
mov SPIN_COUNTER, #0 ; First some spins with BEMF
call WDT_OFF
BEMF_START_SPIN1: mov a, #BEMF_start_run_on_duty_time_after_stepping_drive ; BEMF start run on_duty timing
call BEMF_START_DUTY_TIMER
call SPIN_FREE
mov a, #BEMF_start_run_off_duty_time_after_stepping_drive ; BEMF start run off_duty timing
call BEMF_START_DUTY_TIMER
mov a, DRV_SEQUENCE_CHECK_ENABLE
jnz SPIN_WITH_DRV_SEQUENCE_CHECK_BEMF_SPIN
NO_DRV_SEQUENCE_CHECK_BEMF_SPIN:
inc SPIN_COUNTER
mov a, SPIN_COUNTER
clr c
subb a, #5 ; one times for first BEMF spin
jc BEMF_START_SPIN_A
SPIN_WITH_DRV_SEQUENCE_CHECK_BEMF_SPIN:
mov DRV_SEQUENCE_CHECK_ENABLE, #1 ; Reverse spin check enabled
inc SPIN_COUNTER
mov a, SPIN_COUNTER
jnz BEMF_START_SPIN_A ; 256 times spin
jmp BEMF_START0 ; start spins with BEMF with PWR control
BEMF_START_SPIN_A:
clr EA
call GET_COMP_DATA
setb EA
mov a, COMP_D
call WDT_OFF
BEMF_START_SPIN_STATE1: cjne a, #1, BEMF_START_SPIN_STATE2
call STATE1
jmp BEMF_START_SPIN1
BEMF_START_SPIN_STATE2: cjne a, #2, BEMF_START_SPIN_STATE3
call STATE2
jmp BEMF_START_SPIN1
BEMF_START_SPIN_STATE3: cjne a, #3, BEMF_START_SPIN_STATE4
call STATE3
jmp BEMF_START_SPIN1
BEMF_START_SPIN_STATE4: cjne a, #4, BEMF_START_SPIN_STATE5
call STATE4
jmp BEMF_START_SPIN1
BEMF_START_SPIN_STATE5: cjne a, #5, BEMF_START_SPIN_STATE6
call STATE5
jmp BEMF_START_SPIN1
BEMF_START_SPIN_STATE6: call STATE6
jmp BEMF_START_SPIN1
;---
BEMF_START_DUTY_TIMER: call WAIT_1uS
dec a
jnz BEMF_START_DUTY_TIMER
ret
;---------------------
BEMF_START0: mov SPIN_MODE, #1 ; set to BEMF mode
mov ON_DUTY, #SLOW_START ; BEMF slow start run duty
BEMF_START1: call START_T0 ; comparator oscillation loop reset
BEMF_RESTART: mov CONTROL_DATA_MAX, #255 ; Current Limiter initialize data
mov MISFIRE_COUNTER, #0
mov TEMP0, #0 ; times of T2 over flow counter for increasing throttle timer
SET_BEMF_TIMER:
call T2_SET ; Start T2 timer for slow BEMF control time
call SPIN_FREE ;
;---------------------
GET_BEMF:
BEMF_SPEED_CNT: mov TEMP3, CONTROL_DATA ; Get Rx input pulse
THROTTLE_OFF_CHK2: mov a, temp3 ; Get Rx input pulse to check stop
clr c
subb a, #THROTTLE_OFF ; check the throttle OFF position. Is the input pulse less than 940uS?
jc THROTTLE_OFF_CHK_TIMER2 ;
mov RX_ERROR_COUNT, #0 ; clr T2(32mS interval) repeat counter
RUN_NORMALLY0: jmp RUN_NORMALLY
;---
THROTTLE_OFF_CHK_TIMER2:
mov FIND_TIMER, #FIND_TIMER_DELAY
jnb TF2H, RUN_NORMALLY0 ; confirm the Rx noise pulse
T160mS_INTERVAL: clr TF2H
call WDT_OFF
inc RX_ERROR_COUNT
mov a, RX_ERROR_COUNT
clr c
subb a, #5 ; over 160mS throttle off signal come?
jc RUN_NORMALLY
; Checking free spining before stepping fire
CHECK_FREE_SPINING: call SPIN_FREE
call START_T0
mov b, #0
CHECK_FREE_SPIN: call WDT_OFF
call GET_COMP_DATA
mov a, COMP_D
SPIN_STATE1: cjne a, #1, SPIN_STATE2
orl b, #00000001b
jmp CHECK_ALL_SPIN_PATTERN
SPIN_STATE2: cjne a, #2, SPIN_STATE3
orl b, #00000010b
jmp CHECK_ALL_SPIN_PATTERN
SPIN_STATE3: cjne a, #3, SPIN_STATE4
orl b, #00000100b
jmp CHECK_ALL_SPIN_PATTERN
SPIN_STATE4: cjne a, #4, SPIN_STATE5
orl b, #00001000b
jmp CHECK_ALL_SPIN_PATTERN
SPIN_STATE5: cjne a, #5, SPIN_STATE6
orl b, #00010000b
jmp CHECK_ALL_SPIN_PATTERN
SPIN_STATE6: cjne a, #6, RE_START_STEPPING
orl b, #00100000b
CHECK_ALL_SPIN_PATTERN: mov a, b
clr c
subb a, #00111111b ; spin with all pattern?
jz CHECK_FREE_SPINING ; Yes.
;-------------------
THROTLE_RE_ON_CHECK: mov CONTROL_DATA_MAX, #255
mov MISFIRE_COUNTER, #0
mov a, CONTROL_DATA ; Get Rx input pulse
mov TEMP3, a
clr c
subb a, #THROTTLE_OFF ; check the throttle OFF position. Is the input pulse less than 940uS?
jnc RUN_NORMALLY_
mov a, TH0
clr c
subb a, #Slowest_Spin_Speed_Check_Time; Stiil spin a little bit to avoid reverse start spin
jc CHECK_FREE_SPIN
THROTTLE_OFF2: ; Is the input pulse still less than 940uS?
RE_START_STEPPING: mov RX_ERROR_COUNT, #0 ;
;mov CONTROL_DATA_MAX, #THROTTLE_OFF+2
jmp THROTTLE_ON_CHK ; re-start with stepping spin
RUN_NORMALLY_: mov RX_ERROR_COUNT, #0 ;
jmp BEMF_PWR_SETTING
RUN_NORMALLY:
;;****** Added for reverse spin check and retry routine is here
mov DRV_SEQUENCE_CHECK_ENABLE, #1 ; Spin drive with correct sequence
SPIN_SPEED_CHECK:
mov a, TH1
clr c ;
subb a, #10 ; spin enough for BEMF(490nS x 4 x 255 x 10= 5mS/spin)?
jc REVERSE_SPIN_CHECK1
mov a, ON_DUTY
clr c
subb a, #THROTTLE_OFF+3 ; Spin direction check work area is between THROTTLE_OFF and THROTTLE_OFF+*
jc BEMF_PWR_SETTING
mov a, ON_DUTY
clr c
subb a, #THROTTLE_OFF+10; Spin direction check work area is between THROTTLE_OFF and THROTTLE_OFF+*
jnc BEMF_PWR_SETTING
REVERSE_SPIN_CHECK1:
mov a, MISFIRE_COUNTER ; MISFIRE_COUNTER is in drive state routine
clr c
ADJ_REVERSE_SENSE:
subb a, #MISFIRE_COUNT ; Noise filter to ensure the reverse spin and avoid immidiate Stop motor
jnc REVERSE_SPIN
jmp BEMF_PWR_SETTING
REVERSE_SPIN:
;jmp REVERSE_SPIN ; TEST ONLY
;call BRAKING ; dangerous TEST
mov MISFIRE_COUNTER, #0 ; Just for timer use only
; jmp CHECK_FREE_SPIN ; Unstable BUG check ONLY
call BRK_TIM0 ; <<<<<<<<
mov MISFIRE_COUNTER, #0
call BRAKING ;
call BRK_TIM0
mov MISFIRE_COUNTER, #0
jmp STEPPING_START
;-----------
BRK_TIM0: call start_T0
BRK_TIM1: call WDT_OFF
jnb TF0, BRK_TIM1 ; 32mS loop
inc MISFIRE_COUNTER
mov a, MISFIRE_COUNTER
clr c
subb a, #5 ; loop as about 160mS ; <<<<<<<
jc BRK_TIM0
ret
;;**********
BEMF_PWR_SETTING: ; 12uS max. from OFF_TIMER end
setb TR2
cjne RX_ERROR_COUNT, #0, GET_CMP_DATA ; No duty control jmp. May be Throttle off Rx noise "<<
mov a, TEMP3 ; Get Rx input pulse
clr c
subb a, ON_DUTY ; DUTY >= Rx input pulse?
jc DEC_PWR ; Yes.
jz GET_CMP_DATA
INC_DUTY: mov a, STEP_START_FLAG ; Need small on_duty to avoid MOSFET melt just after stepping starting?
jz INC_DUTY_ON ; No.
mov a, SPIN_COUNTER ; SPIN_COUNTER is increased in state1 drive.
clr c
subb a, #10 ; Do not increase the starting power before 10 spins.
jc SET_START_POWER ; set small on_duty to avoid MOSFET melt for starting.
mov STEP_START_FLAG, #0 ; Clear STEP_START_FLAG
INC_DUTY_ON: mov a, TMR2H
clr c
subb a, #BEMF_Duty_Inc_Timing
jnc INC_ONDUTY
jmp GET_CMP_DATA
INC_ONDUTY: call START_T2
inc ON_DUTY
jmp GET_CMP_DATA
SET_START_POWER: mov ON_DUTY, #SLOW_START ; BEMF slow start run duty
mov DRV_SEQUENCE_CHECK_ENABLE, #1 ; Reverse spin check
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -