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

📄 bl_esc_100a_307b.asm

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