📄 bldc fan sensorless control.asm
字号:
;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 + -