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

📄 bl_esc_100a_307b.asm

📁 本设计是关于无刷电机的设计源程序 只可惜是会变的 不过是很好的资料哦
💻 ASM
📖 第 1 页 / 共 5 页
字号:

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 + -