📄 bl_esc_100a_307b.asm
字号:
READY_SOUND:
SOUND_2 equ 1
;*******************************************
SND_ON_DUTY2 equ 100
;mov b, #pack
mov b, #3
;*******************************************
GO_SOUND_LOOP:
mov TEMP3, #SOUND_2
mov TEMP5, #SND_ON_DUTY2
call SOUNDER
call NO_SOUND_TIM
djnz b, GO_SOUND_LOOP
;;****** Vdd check TEST ONLY
mov R1, #0
LOOP0: djnz R1, LOOP0
V_TEST: call ALL_H
;call CHECK_TOP_CELL_VOLTAGE
call SPIN_FREE
call WDT_OFF
; jmp LOOP0
BRAKE_TIMER_INT:
mov BRAKING_TIMER, #0 ; BRAKING_TIMER is used for brake timer counter with TF2H over flow
;-----------------
THROTTLE_ON_CHK: jnb TF2H, RX_IN_CHK
call SPIN_FREE
call WDT_OFF
INC_T2_REPEAT_CNT: clr TF2H
BRAKE_TIMER_COUNT_TRIG: inc R7
cjne R7, #10, FIND_BUZZER_TIMER_CNT_TRIG ; 32msec x10= 320mS sec.
;BRAKE_TIMER_COUNT_TRIG: mov a, BRAKING_TIMER
; inc a
; mov BRAKING_TIMER, a
; clr c
; subb a, #10
; jnz FIND_BUZZER_TIMER_CNT_TRIG ; 32msec x10= 320mS sec.
mov BRAKING_TIMER, #0
dec BRAKING_TIMER
BRAKE_ON_CHK: mov a, TEMP7
anl a, #00000010b
jz FIND_BUZZER_TIMER_CNT_TRIG ; Brake function Off mode
call BRAKING
FIND_BUZZER_TIMER_CNT_TRIG:
inc TEMP0
cjne TEMP0, #0, RX_IN_CHK ; 32mS x 255 = 8.16 sec.
dec FIND_TIMER ; 8.16 x 22 = 3 min.
mov a, FIND_TIMER
jnz RX_IN_CHK ;
mov FIND_TIMER, #FIND_TIMER_DELAY ;
jmp FIND_BUZZER_ON
RX_IN_CHK: setb EA
call SPIN_FREE
call WDT_OFF
mov CONTROL_DATA_MAX, #255
mov MISFIRE_COUNTER, #0
mov a, CONTROL_DATA ; Get Rx input pulse
clr c
subb a, #THROTTLE_OFF ; wait for throttle OFF position
jc THROTTLE_ON_CHK ; the input pulse more than 940uS
jmp THROTTLE_OFF_CHK1 ; Yes.
;---------------
SOUNDER: ;clr EA
SOUNDER1: mov TEMP0, #010h
SOUNDING: call S_WDT_OFF
call STATE1_ON
call SOUND_DRIVE_CNT
call SPIN_FREE
call STATE2_ON
call SOUND_DRIVE_CNT
call SPIN_FREE
call STATE3_ON
call SOUND_DRIVE_CNT
call SPIN_FREE
call STATE4_ON
call SOUND_DRIVE_CNT
call SPIN_FREE
call STATE5_ON
call SOUND_DRIVE_CNT
call SPIN_FREE
call STATE6_ON
call SOUND_DRIVE_CNT
call SPIN_FREE
djnz TEMP0, SOUNDING
mov TEMP0, #010h
djnz TEMP3, SOUNDING
;setb EA
ret
;----------------
THROTTLE_ON_CHK_A:
jmp THROTTLE_ON_CHK ;long jmp help
;----------------
SOUND_DRIVE_CNT:
SND_ON_TIM:
mov ON_DUTY, TEMP5
SND_ON_LOOP:
nop
djnz ON_DUTY, SND_ON_LOOP
ALL_3ST:
call SPIN_FREE
;*********************************************
call S_WDT_OFF
SND_OFF_TIM:
mov ON_DUTY, TEMP5 ; 1:10 as 10% power for sound
SND_OFF_LOOP:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
djnz ON_DUTY, SND_OFF_LOOP
ret
;------------------
NO_SOUND_TIM:
call SPIN_FREE
mov TEMP3, #0
mov TEMP5, #20
NO_SOUND1:
call WAIT_10uS
call S_WDT_OFF
djnz TEMP3, NO_SOUND1
djnz TEMP5, NO_SOUND1
ret
;------------------
FIND_BUZZER_ON:
mov R1, #230
BUZZER: mov TEMP3, #1 ; (Sound frame time)
mov TEMP5, R1 ; Sound pitch
call SOUNDER1
call SPIN_FREE
THROTTLE_ON_CHK_B:
mov a, CONTROL_DATA ; Get Rx input pulse
clr c
subb a, #THROTTLE_OFF ; check the throttle OFF position
jnc READY_SOUND_1
dec R1
cjne R1, #100, BUZZER ; highest frequency.
COOLING_MOTOR: mov R1, #128 ; 4sec off sound to avoid motor heat-up
CMTR1: mov R2, #0
CMTR2: mov R3, #0
CMTR3: mov a, CONTROL_DATA ; Get Rx input pulse
clr c
subb a, #THROTTLE_OFF ; check the throttle OFF position
jnc READY_SOUND_1
call S_WDT_OFF
djnz R3, CMTR3
djnz R2, CMTR2
djnz R1, CMTR1
jmp FIND_BUZZER_ON
;------------------
READY_SOUND_1: call SPIN_FREE
;jmp READY_SOUND ; long branch help
jmp RX_IN_CHK ; Spin immediately. '06/02/06
;--------------
STEPPING_START:
;--------------
THROTTLE_OFF_CHK1:
mov DRV_SEQUENCE_CHECK_ENABLE, #0 ; enable drive sequence check for starting sequence by this flag
;mov DRV_TIM, #SAMPLING_TIMING ; set default sampling timing
mov STEPPING_ON_DUTY_CHOPPING_COUNTER, #STEPPING_ON_DUTY_CHOPPING_COUNT
mov STEPPING_ON_DUTY, #START_CURRENT_ON_DUTY
mov a, CONTROL_DATA ; Get Rx input pulse
mov TEMP3, a
clr c
subb a, #THROTTLE_OFF ; check the throttle OFF position
jc THROTTLE_ON_CHK_A ; the input pulse less than 940uS
;---------------
MOTOR_START: call BRAKING ; For high site drive power
call WAIT_10uS
SPIN_START: call GET_START_SHAFT_POSITION1
SPIN_START1: mov PREV_DRV_STATE, START_DRIVE_STATE
call GET_NEXT_DRIVE_STATE ; for reverse spin check as well
mov NEXT_DRV_STATE, START_DRIVE_STATE
call GET_NEXT_DRIVE_STATE ; 2 Step move for sure
mov NEXT_NEXT_DRV_STATE, START_DRIVE_STATE
mov START_DRIVE_STATE, PREV_DRV_STATE
call SHAFT_POSITION_TRIMMING ; Spin motor with one stepping
;call BRAKING
mov b, #250 ; spin responce timer
WAIT_SPIN_RESPONCE1: call WAIT_1uS
call WDT_OFF
djnz b, WAIT_SPIN_RESPONCE1
THROTTLE_OFF_CHK0: mov a, CONTROL_DATA ; Get Rx input pulse
clr c
subb a, #THROTTLE_OFF ; wait for throttle OFF position
jc STEPPING_START ; the input pulse more than 940uS
SPIN_START_CHECK1: ;call test_pin_on
call GET_START_SHAFT_POSITION1 ; START_DRIVE_STATE = Now state+1
;call GET_COMP_DATA
;mov a, COMP_D
mov a, START_DRIVE_STATE
clr c
REVERSE_SPIN_CHECK: subb a, NEXT_DRV_STATE ; Reverse spin check is here
jz START_STEPPING_DRIVE2; one step spin with turned on_duty
;jz NEXT_SPIN_START
jmp COULD_NOT_START_SPIN
;-----
START_STEPPING_DRIVE2: ;Make sure two steps spin stepping drive
mov START_DRIVE_STATE, NEXT_DRV_STATE
call SHAFT_POSITION_TRIMMING ; Spin motor with next one stepping
;call BRAKING
mov b, #250 ; spin responce timer
WAIT_SPIN_RESPONCE2: call WAIT_1uS
call WDT_OFF
djnz b, WAIT_SPIN_RESPONCE2
SPIN_START_CHECK2: call GET_START_SHAFT_POSITION1 ; START_DRIVE_STATE = Now state+1
mov a, START_DRIVE_STATE
clr c
SPIN_CHECK2: subb a, NEXT_NEXT_DRV_STATE ; Reverse spin check is here
jz START_STEPPING_DRIVE; two step spin with turned on_duty
jmp COULD_NOT_START_SPIN
;-----------------------
COULD_NOT_START_SPIN:
INC_STEPPING_START_ON_DUTY:
call BRAKING ; For high site drive power
call WAIT_10uS
mov a, STEPPING_ON_DUTY
add a, #INC_START_CURRENT_ON_DUTY_STEP ; inc as on_duty+5
clr c
subb a, #START_STEPPING_DUTY_FRAME/4 ; <<<<<<<<< 25% limit power duty for start
jc ADD_MORE_START_PWR
jmp CAN_NOT_SPIN_START
ADD_MORE_START_PWR: mov a, STEPPING_ON_DUTY
add a, #INC_START_CURRENT_ON_DUTY_STEP ; inc as on_duty
mov STEPPING_ON_DUTY, a
TRY_WITH_MORE_START_POWER:
jmp SPIN_START
;-----------
CAN_NOT_SPIN_START:
jmp START_STEPPING_DRIVE ; force Start
; mov STEPPING_ON_DUTY, #START_CURRENT_ON_DUTY
;GET_REVERSE_DRIVE_STATE:
; mov a, START_DRIVE_STATE
; clr c
; subb a, #2 ;
; jz SET_DRIVE_STATE_6 ; START_DRIVE_STATE=2
; jc SET_DRIVE_STATE_5 ; START_DRIVE_STATE=1
;SET_REVERSE_STATE:
; mov START_DRIVE_STATE, a
; jmp SPIN_START1
;SET_DRIVE_STATE_6:
; mov a, #6
; mov START_DRIVE_STATE, a
; jmp SPIN_START1
;SET_DRIVE_STATE_5:
; mov a, #5
; mov START_DRIVE_STATE, a
; jmp SPIN_START1
;-------
START_STEPPING_DRIVE: call STEP_START1
mov STEP_START_FLAG, #1 ; Set STEP_START_FLAG
jmp BEMF_START_SPIN
;---------------
GET_START_SHAFT_POSITION:
STEP_START_BARKING: call BRAKING
mov b, #10 ; Make sure the Shaft stop to get next step start state
SHAFT_BRAKE_B: mov a, #0
SHAFT_BRAKE_A: dec a
call WDT_OFF
call WAIT_10uS
jnz SHAFT_BRAKE_A
djnz b, SHAFT_BRAKE_B
GET_START_SHAFT_POSITION1:
DG4: call STATE1_ON ; U=1, V=0, W=3ST
call MEASURE_INDUCTIVE_KICK_LENGTH
DG1: call STATE4_ON ; U=0, V=1, W=3ST
call MEASURE_INDUCTIVE_KICK_LENGTH
DG5: call STATE2_ON ; U=1, V=3ST, W=0
call MEASURE_INDUCTIVE_KICK_LENGTH
DG2: call STATE5_ON ; U=0, V=3ST, W=1
call MEASURE_INDUCTIVE_KICK_LENGTH
DG6: call STATE3_ON ; U=3ST, V=1, W=0
call MEASURE_INDUCTIVE_KICK_LENGTH
DG3: call STATE6_ON ; U=3ST, V=0, W=1
call MEASURE_INDUCTIVE_KICK_LENGTH
jmp STEP_START
;--------------------------
MEASURE_INDUCTIVE_KICK_LENGTH:
clr EA
mov IDA0L, #00000000b ; 10mV sense as 0.1V on @10mili ohm MOSFET and divided to 1:10
mov IDA0H, #00000001b
SAMPLE_ON_DUTY: mov b, #20 ; Less than 10uS, Could not measure the inductive kick.
SAMPLE_ON_Loop: call WAIT_1uS
djnz b, SAMPLE_ON_Loop
call SPIN_FREE
mov a, DRIVE_STATE
;-------
SAMPLE_KICK1: cjne a, #1, SAMPLE_KICK2 ; U=1, V=0, W=3ST
jmp S_KICK12
SAMPLE_KICK2: cjne a, #2, SAMPLE_KICK3 ; U=1, V=3ST, W=0
; U=1 -> U=GND-0.7V(3ST) -> U=V=W
S_KICK12: mov CPT0MX, #00000000b ; CP in-: P0.1(D/A), CP in+: P0.0(U) with UP slope
BEFORE_KICK:
KICK_COUNTER_HL: call START_T2
call WAIT_1uS ; Comparator responce
COUNT_KICK_LH: mov a, CPT0CN ; Get Comparator result
anl a, #01000000b ; Get CP0OUT bit
jz COUNT_KICK_LH ; checking the negative edge of inductive kick.
clr TR2 ; Stop Timer2
setb EA
jmp GET_START_POSITION
;-------
SAMPLE_KICK3: cjne a, #3, SAMPLE_KICK4 ; U=3ST, V=1, W=0
jmp S_KICK34
SAMPLE_KICK4: cjne a, #4, SAMPLE_KICK5 ; U=0, V=1, W=3ST
; V=1 -> V=GND-0.7V(3ST) -> U=V=W
S_KICK34: mov CPT0MX, #00000001b ; CP in-: P0.1(D/A), CP in+: P0.2(V) with UP slope
jmp BEFORE_KICK
;-------
SAMPLE_KICK5: ; W=1 at stae 5 and 6
; W=1 -> W=GND-0.7V(3ST) -> U=V=W
S_KICK56: mov CPT0MX, #00000010b ; CP in-: P0.1(D/A), CP in+: P0.4(W) with UP slope
jmp BEFORE_KICK
;-------
GET_START_POSITION: call WDT_OFF
mov a, TMR2L ; compare the previous inductive kick timing length
clr c
subb a, TEMP_L
mov a, TMR2H
subb a, TEMP_H
jnc SAMPLE_OFF_DUTY ; Get minimum timing for starting
mov TEMP_H, TMR2H ; Store the minimum inductive kick length "H" as start position
mov TEMP_L, TMR2L ; Store the minimum inductive kick length "L"
mov START_DRIVE_STATE, DRIVE_STATE ; Get start drive pattern
SAMPLE_OFF_DUTY: call BRAKING ;
mov TEMP5, #20
SAMPLE_OFF_DUTY_LOOP: call WDT_OFF
mov b, #10 ; <<<<<<
OFF_Loop3: call WAIT_1uS
djnz b, OFF_Loop3
djnz TEMP5, SAMPLE_OFF_DUTY_LOOP
ret
;--------
STEP_START: mov SPIN_COUNTER, #20 ; Off Timer
WAIT_TO_START:
call SAMPLE_OFF_DUTY
djnz SPIN_COUNTER, WAIT_TO_START
mov TEMP_L, 0ffh ; Re-Store the minimum inductive kick length "L" for next start
mov TEMP_H, 0ffh ; Re-Store the minimum inductive kick length "H" for next start
GET_NEXT_DRIVE_STATE:
mov a, START_DRIVE_STATE
mov DRV_SEQUENCE_CHECK_ENABLE, #0 ; also, diable sequence check by this flag
inc a ; Next start drive Phase
clr c
subb a, #7 ; If START6, Then step start1
jz STEP_START1_
add a, #7
mov START_DRIVE_STATE, a
ret
STEP_START1_:
mov a, #1
mov START_DRIVE_STATE, a
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -