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

📄 bldc fan sensorless control.asm

📁 this is a sensorless fan motor control code .(it use the angle-ahead commutate tech.)
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	;goto main		;欠压 Reset!
	goto start_2		;AD<a3h=11.2v欠压,不动作!

AD_Ton
;**************************************** Vcc < 11.2 ***********************************


	movlw h'06'
	movwf Tu 

	movlw	h'00'
	movwf	Ton1
	movlw	h'0b5'			;a0--11v  a5---11.4v  aa--11.7v			
	movwf	Ton0 

	;比较高位
	movf Ton1,0				;大幅度的减小Ton
	subwf ADH,0				;(ADH-Ton1)减法很怪的,c=0表示发生借位
	btfss status,c			;c=1减法不发生借位,即ADH>=Ton1,则前跳一步
	goto Ton_AD0				;c=0发生借位,溢出,ADH<Ton1

	btfss status,z			;z=1,即ADH=Ton1,则前跳一步,比较低位
	goto AD_Ton0				;z=0,即ADH>Ton1

	;比较低位
	movf Ton0,0				;大幅度的减小Ton
	subwf ADL,0				;(ADL-Ton0)减法很怪的,c=0表示发生借位
	btfss status,c			;c=1减法不发生借位,即ADL>=Ton0,则前跳一步
	goto Ton_AD0				;c=0发生借位,溢出,ADL<Ton0

	btfss status,z			;z=1,即ADL=Ton0,则前跳一步,认为Ton>AD
	goto AD_Ton0				;z=0,即ADL>Ton0

Ton_AD0			;AD<b5h=12.3v
	movlw d'200'
	movwf OvCu
	goto Tu_end

AD_Ton0			;AD>b5h=12.3v

	decf Tu,1
	movlw d'200'
	movwf OvCu
;**************************************** 11.2 < Vcc < 12.3 ***********************************


	movlw	h'00'
	movwf	Ton1
	movlw	h'0d0'			;a0--11v  a5---11.4v  aa--11.7v	 b5--12.3  c4--13.3 d0--14		
	movwf	Ton0 

	;比较高位
	movf Ton1,0				;大幅度的减小Ton
	subwf ADH,0				;(ADH-Ton1)减法很怪的,c=0表示发生借位
	btfss status,c			;c=1减法不发生借位,即ADH>=Ton1,则前跳一步
	goto Ton_AD01				;c=0发生借位,溢出,ADH<Ton1

	btfss status,z			;z=1,即ADH=Ton1,则前跳一步,比较低位
	goto AD_Ton01				;z=0,即ADH>Ton1

	;比较低位
	movf Ton0,0				;大幅度的减小Ton
	subwf ADL,0				;(ADL-Ton0)减法很怪的,c=0表示发生借位
	btfss status,c			;c=1减法不发生借位,即ADL>=Ton0,则前跳一步
	goto Ton_AD01				;c=0发生借位,溢出,ADL<Ton0

	btfss status,z			;z=1,即ADL=Ton0,则前跳一步,认为Ton>AD
	goto AD_Ton01				;z=0,即ADL>Ton0

Ton_AD01				;12.3v<AD<d0h=14V				
	goto Tu_end

AD_Ton01				;AD>d0h=14V				
	decf Tu,1
	movlw d'200'
	movwf OvCu
	;goto Tu_end
	;goto main
;**************************************** 12.3 < Vcc < 14 ***********************************



	movlw	h'00'
	movwf	Ton1
	movlw	h'0f0'			;a0--11v  a5---11.4v  aa--11.7v	 b5--12.3  c4--13.3 d0--14  f0--16.1v		
	movwf	Ton0 

	;比较高位
	movf Ton1,0				;大幅度的减小Ton
	subwf ADH,0				;(ADH-Ton1)减法很怪的,c=0表示发生借位
	btfss status,c			;c=1减法不发生借位,即ADH>=Ton1,则前跳一步
	goto Ton_AD02				;c=0发生借位,溢出,ADH<Ton1

	btfss status,z			;z=1,即ADH=Ton1,则前跳一步,比较低位
	goto AD_Ton02				;z=0,即ADH>Ton1

	;比较低位
	movf Ton0,0				;大幅度的减小Ton
	subwf ADL,0				;(ADL-Ton0)减法很怪的,c=0表示发生借位
	btfss status,c			;c=1减法不发生借位,即ADL>=Ton0,则前跳一步
	goto Ton_AD02				;c=0发生借位,溢出,ADL<Ton0

	btfss status,z			;z=1,即ADL=Ton0,则前跳一步,认为Ton>AD
	goto AD_Ton02				;z=0,即ADL>Ton0

Ton_AD02				; 14v<AD<f0h=16.1v				
	goto Tu_end

AD_Ton02				;AD>f0h=16.1v			
	movlw d'255'
	movwf OvCu
	;goto Tu_end
	;goto main
;**************************************** 14 < Vcc < 16.1 ***********************************


	movlw	h'00'
	movwf	Ton1
	movlw	h'0f5'			;a0--11v  a5---11.4v  aa--11.7v	 b5--12.3  c4--13.3 d0--14  f0--16.1v  f5--16.5v		
	movwf	Ton0 

	;比较高位
	movf Ton1,0				;大幅度的减小Ton
	subwf ADH,0				;(ADH-Ton1)减法很怪的,c=0表示发生借位
	btfss status,c			;c=1减法不发生借位,即ADH>=Ton1,则前跳一步
	goto Ton_AD03				;c=0发生借位,溢出,ADH<Ton1

	btfss status,z			;z=1,即ADH=Ton1,则前跳一步,比较低位
	goto AD_Ton03				;z=0,即ADH>Ton1

	;比较低位
	movf Ton0,0				;大幅度的减小Ton
	subwf ADL,0				;(ADL-Ton0)减法很怪的,c=0表示发生借位
	btfss status,c			;c=1减法不发生借位,即ADL>=Ton0,则前跳一步
	goto Ton_AD03				;c=0发生借位,溢出,ADL<Ton0

	btfss status,z			;z=1,即ADL=Ton0,则前跳一步,认为Ton>AD
	goto AD_Ton03				;z=0,即ADL>Ton0

Ton_AD03				; 16.1v<AD<100h=17.2V				
	goto Tu_end

AD_Ton03				;AD>100h=17.2V 过压				
	goto main
;**************************************** 16.1 < Vcc < 17.2 ***********************************



Tu_end
;start_1
	clrf k
	movlw D'255'
	movwf Decrease_big			;Ton减小时的减幅设置
	movlw	h'00'				
	movwf	Ton0 
	movlw	h'03'
	movwf	Ton1
	call First_Half_I_Cycle

	incf Tu,1					;24V时取消改指令
	movlw D'250'
	movwf Decrease_big			;Ton减小时的减幅设置
	movlw	h'15'				
	movwf	Ton0 
	movlw	h'01'
	movwf	Ton1
	call Second_Half_I_Cycle

	movlw D'50'
	movwf Decrease_big			;Ton减小时的减幅设置
	
	return


start_2
;Tu_end
	clrf k
	movlw D'255'
	movwf Decrease_big			;Ton减小时的减幅设置
	movlw	h'a0'				
	movwf	Ton0 
	movlw	h'03'
	movwf	Ton1
	;call First_Half_I_Cycle
	call PWM_Ton				;T1导通Ton个PWM

	incf k,1
	incf Tu,1					;24V时取消改指令
	movlw D'250'
	movwf Decrease_big			;Ton减小时的减幅设置
	movlw	h'55'				
	movwf	Ton0 
	movlw	h'01'
	movwf	Ton1
	call Second_Half_I_Cycle

	movlw D'50'
	movwf Decrease_big			;Ton减小时的减幅设置
	movlw	h'15'				
	movwf	Ton0 
	movlw	h'01'
	movwf	Ton1

	return
;***************************end of rotor initial****************************************


;************************************上半个电流周期***********************************************
Second_Half_I_Cycle
	call PWM_Ton				;T1导通Ton个PWM
	call Vi_control_2			;电流过零信号分析
	call Ve_control_2			;反电势变化情况分析
	return                                                                                                                                                                                 
;************************************上半个电流周期***********************************************




;************************************电流过零信号分析2*********************************************
Vi_control_2
	movlw d'1'		;延时不能太长,否则续流产生的电压尖峰会因电容漏电流而减为零。
	movwf Soft_T
	call Delay

	call I_over						

	movf t_I_ZCP,0
	movwf Soft_T
	call Delay

;	movf current_B,1
;	btfss status,z
;	call delay500us		;z=0,current_B=1, current over

	return
;************************************电流过零信号分析2*********************************************



;***********************************反电势变化情况分析2********************************************
Ve_control_2
	btfsc CMCON,e			;Ve=0,前跳一步
	goto VeIs_bc			;Ve=1,继续查询,等其变0
	
	;******Ve=0,需要大幅度的减小Ton********
	movf Ton1,1
	btfss status,z 				;Ton1 =0, jump
	goto ok_Dec1				;Ton1!=0, can dec
	
	movf Ton0,0					;Ton1 =0
	subwf Decrease_big,0		;w=f-w, w=Decrease_big-Ton0
	btfsc status,c				;c=0发生借位则Decrease_big<Ton0,可进行减法,前跳一步
	goto end_sub2
ok_Dec1

	movf Decrease_big,0			;大幅度的减小Ton
	subwf Ton0,1				;减法很怪的,c=0表示发生借位
	btfsc status,c				;c=0发生借位则前跳一步
	goto end_sub2				;c=1减法不发生借位,即Ton1>=Decrease_big

	movlw d'1'
	subwf Ton1,1
	btfsc status,c				;c=0发生借位则前跳一步
	goto end_sub2				;c=1减法不发生借位,即Ton1>=Decrease_big
;	decf Ton2,1	
	goto main
				
end_sub2
	;*************Ton=Ton-Decrease_big***********
	goto Ve2_end


VeIs_bc
	
	goto VeIs_de

	movlw h'10'
	movwf steady 

Next_S
	decfsz steady,1				;steady--, if steady=0 jump!
	goto ComPareE				;if steady>0, goto ComPareE
	goto VeIs_de				;if steady=0, goto VeIs_de

ComPareE
	btfsc CMCON,e				;Ve=0,前跳一步
	goto Next_S					;Ve=1,继续查询,等其变0
	goto Ve2_end


VeIs_de
	movlw d'10'					;喂狗
	movwf k_dog
	banksel	INTCON	
	movlw	0x0a0
	movwf	INTCON				;INTCON=0000 0000 关闭所有中断响应,并关闭TMR0溢出后产生中断
								;bit7=0关闭所有中断请求,bit5=0关闭TMR0溢出中断请求。	 VCCCCCCCCCCCCCCCCCCCCCCC
	bcf		INTCON,T0IF			;TMR0中断标志位清零

	bcf status,RP0
	clrf 	TMR0

VeIs_de11
	btfsc CMCON,e				;Ve=0,前跳一步
	goto VeIs_de11				;Ve=1,继续查询,等其变0

	;movlw Increase				;可增大Ton
	movf Ton_Increase,0
	addwf Ton0,1
	btfss status,c	     		;如果status的c=1进位, 则向前跳一步。
	goto Ve2_end				;如果status的c=0没进位。

	movlw d'1'					;可增大Ton
	addwf Ton1,1
	btfss status,c	     		;如果status的c=1进位, 则向前跳一步。
	goto Ve2_end

;	incf Ton2,1					;溢出
	goto main

Ve2_end	 
	clrf k						;换相,设置k=0,代表T1T2=10,下一周期该T1导通
	clrf	INTCON				;起动定时器中断

	return
;***********************************反电势变化情况分析2********************************************




;************************************上半个电流周期***********************************************
First_Half_I_Cycle
	call PWM_Ton				;T1导通Ton个PWM
	call Vi_control				;电流过零信号分析

	call Ve_control				;反电势变化情况分析
	return                                                                                                                                                                                 
;************************************上半个电流周期***********************************************





;************************************电流过零信号分析2*********************************************
Vi_control
	movlw d'1'
	movwf Soft_T
	call Delay

	call I_over						

	movf t_I_ZCP,0
	movwf Soft_T
	call Delay

;	movf current_B,1
;	btfss status,z
;	call delay500us		;z=0,current_B=1, current over

	return
;************************************电流过零信号分析2*********************************************


;***********************************反电势变化情况分析2********************************************
Ve_control
	btfss CMCON,e			;Ve=1,前跳一步
	goto VeIs_0bc					;Ve=0,继续查询,等其变1
	
	;******Ve=0,需要大幅度的减小Ton********
	movf Ton1,1
	btfss status,z 				;Ton1 =0, jump
	goto ok_Dec					;Ton1!=0, can dec
	
	movf Ton0,0					;Ton1 =0
	subwf Decrease_big,0		;w=f-w, w=Decrease_big-Ton0
	btfsc status,c				;c=0发生借位则Decrease_big<Ton0,可进行减法,前跳一步
	goto end_sub1
ok_Dec

	movf Decrease_big,0			;大幅度的减小Ton
	subwf Ton0,1				;减法很怪的,c=0表示发生借位
	btfsc status,c				;c=0发生借位则前跳一步
	goto end_sub1				;c=1减法不发生借位,即Ton1>=Decrease_big

	movlw d'1'
	subwf Ton1,1
	btfsc status,c				;c=0发生借位则前跳一步
	goto end_sub1				;c=1减法不发生借位,即Ton1>=Decrease_big
;	decf Ton2,1
	goto main
					
end_sub1
	;*************Ton=Ton-Decrease_big***********
	goto Ve1_end


VeIs_0bc
	
	goto VeIs_0de

	movlw h'10'
	movwf steady 

Next_S1
	decfsz steady,1				;steady--, if steady=0 jump!
	goto ComPareE1				;if steady>0, goto ComPareE
	goto VeIs_0de				;if steady=0, goto VeIs_de

ComPareE1
	btfss CMCON,e				;Ve=1,前跳一步
	goto Next_S1				;Ve=0,继续查询,等其变1
	goto Ve1_end

VeIs_0de
	movlw d'10'					;喂狗
	movwf k_dog
	banksel	INTCON	
	movlw	0x0a0
	movwf	INTCON				;INTCON=0000 0000 关闭所有中断响应,并关闭TMR0溢出后产生中断
								;bit7=0关闭所有中断请求,bit5=0关闭TMR0溢出中断请求。	 VCCCCCCCCCCCCCCCCCCCCCCC
	bcf		INTCON,T0IF			;TMR0中断标志位清零

	bcf status,RP0
	clrf 	TMR0

VeIs_0de0
	btfss CMCON,e			;Ve=1,前跳一步
	goto VeIs_0de0				;Ve=0,继续查询,等其变0

	;movlw Increase				;可增大Ton
	movf Ton_Increase,0
	addwf Ton0,1
	btfss status,c	     		;如果status的c=1进位, 则向前跳一步。
	goto Ve1_end				;如果status的c=0没进位。

	movlw d'1'					;可增大Ton
	addwf Ton1,1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -