📄 pic16c72_ebike.asm
字号:
;-------------------------------------------------------------------------------
LED5: ;LED工作次数加1>=设定的次数,进入间隔期
BCF LED_PIN ;LED=0
INCF LED_DELAY, 1 ;
MOVF LED_DELAY, 0 ;
SUBLW 0AH ;停10*32.687=328+197=525毫秒
BTFSC STATUS, C ;0AH-LED_DELAY
GOTO LED4 ;C=1,0AH-LED_DELAY>=0, LED_DELAY<=0AH,返回
CLRF LED_DELAY ;到10次后,清零延时计数器LED_DELAY
CLRF LED_WORK_NO ;清零已经完成次数计数器
RETURN
;*******************************************************************************
; 检测电池电压
;采样电压为实际电压的7.65%, 0FF对应电压65.1V
;LOW_LIMIT_UP<=0BH条件下,累计15(0FH)(BAT_LOW_CNT计数)次电压低于40.1V,视为低电压
;LOW_LIMIT_UP>0BH条件下,累计48(30H)(BAT_LOW_CNT计数)次电压低于40.1V,视为低电压
;累计61(3DH)(BAT_HIGH_CNT计数)次检测电压高于40.85V,视为高电压
;电压在40.1V-40.85之间,不做低电压计数,也不作高压处理
;高压输出:清BAT_LOW_CNT,关闭欠压LED输出,清欠压标志
;欠压输出:清BAT_LOW_CNT,清BAT_HIGH_CNT,点亮欠压LED输出,置欠压标志
;-------------------------------------------------------------------------------
;电压<38.2V,降压系数BAT_DOWN=1EH
;电压在38.2V-43.6V之间,降压系数BAT_DOWN=1.5倍(43.6-输入电压)
;电压<43.6V,降压系数BAT_DOWN=00H
;*******************************************************************************
BATTART_CHK:
MOVF VOLTAGE, 0 ;VOLTAGE为电池电压采样值
SUBLW 0ABH ;AB对应电压:43.6V
BTFSC STATUS, C ;
GOTO MID_VOLTAGE ;C=1,ABH-VOLTAGE>=0,即VOLTAGE<=ABH,
;电压小于43.6V
CLRF BAT_DOWN ;C=0,电压大于43.6V
HIGH_VOLTAGE:
INCF BAT_HIGH_CNT, 1 ;过压计数器
;(注:在程序初始化时,BAT_HIGH_CNT赋值5BH)
BTFSC STATUS, Z ;
DECF BAT_HIGH_CNT, 1 ;BAT_HIGH_CNT从小到大,直到BAT_HIGH_CNT=0FFH
MOVF BAT_HIGH_CNT, 0 ;
SUBLW 3DH ;3DH-BAT_HIGH_CNT
BTFSS STATUS, C ;
GOTO HIGH_VOLTAGE1 ;C=0,3DH-BAT_HIGH_CNT<0,即BAT_HIGH_CNT>3DH
RETURN ;C=1,BAT_HIGH_CNT<=3DH,退出
;--------------------------------------------------------------------------------
; 电压正常输出
HIGH_VOLTAGE1:
DECF BAT_HIGH_CNT, 1 ;
CLRF BAT_LOW_CNT ;只要电压正常,就清BAT_LOW_CNT
BCF LOWBAT_PIN ;关闭欠压LED输出
BCF LOW_BAT ;清低压标志
RETURN
;--------------------------------------------------------------------------------
BAT_LOW_NEXT:
INCF BAT_LOW_CNT, 1 ;欠压计数器加1
MOVF LOW_LIMIT_UP, 0 ;
SUBLW 0BH ;0BH-LOW_LIMIT_UP
BTFSC STATUS, C ;
GOTO BAT_LOW_NEXT1 ;C=1,LOW_LIMIT_UP<=0BH.
;-------------------------------------------------------------------------------
; 当超过最低限流电流大于0BH(约16A)时,累计检测到次数>30H(48),按低压处理
MOVLW 30H ;C=0,LOW_LIMIT_UP>0BH,30H对应电压为12.5V
SUBWF BAT_LOW_CNT, 0 ;BAT_LOW_CNT-30H
BTFSC STATUS, C ;
GOTO LOW_VOLTAGE ;C=1,BAT_LOW_CNT-30H>=0,即BAT_LOW_CNT>=30H
RETURN ;C=0,BAT_LOW_CNT-30H<0,即BAT_LOW_CNT<30H,退出
;-------------------------------------------------------------------------------
; 当超过最低限流电流小于0BH(约16A)时,累计检测到次数>0FH(15),按低压处理
BAT_LOW_NEXT1: ;LOW_LIMIT_UP<=0BH时
MOVLW 0FH ;
SUBWF BAT_LOW_CNT, 0 ;BAT_LOW_CNT-0FH
BTFSC STATUS, C ;
GOTO LOW_VOLTAGE ;C=1,即BAT_LOW_CNT>=0FH(大于16次)
RETURN ;C=0,BAT_LOW_CNT-0FH<0,即BAT_LOW_CNT<0FH,退出
;-------------------------------------------------------------------------------
; 按低压处理
LOW_VOLTAGE: ;即BAT_LOW_CNT>=48(LOW_LIMIT_UP>0BH时)
;或 BAT_LOW_CNT>=15(LOW_LIMIT_UP<=0BH时)
CLRF BAT_HIGH_CNT ;
CLRF BAT_LOW_CNT ;
BSF LOWBAT_PIN ;点亮欠压指示灯
BSF LOW_BAT ;置位欠压标志
RETURN
;-------------------------------------------------------------------------------
MID_VOLTAGE: ;电压小于43.6V
MOVWF BAT_DOWN ;差额(欠压)部分存入BAT_DOWN
SUBLW 15H ;15H-BAT_DOWN(15H:5.4V,相当于38.2V)
BTFSC STATUS, C ;(此时W=输入电压-38.2V)
GOTO MID_VOLTAGE1 ;C=1,15H>=BAT_DOWN,即BAT_DOWN<=15H,
;电压>=38.2V
;-------------------------------------------------------------------------------
MOVLW 1EH ;C=0,电压<38.2V
MOVWF BAT_DOWN ;BAT_DOWN=1EH(相当于电压为36V)
GOTO BAT_CHK_END ;设置降压系数固定为1EH
;-------------------------------------------------------------------------------
; 设置降压系数为原欠压的1.5倍
MID_VOLTAGE1:
BCF STATUS, C ;电压>=38.2V
RRF BAT_DOWN, 0 ;
ADDWF BAT_DOWN, 1 ;BAT_DOWN是原来的1.5倍
;-------------------------------------------------------------------------------
BAT_CHK_END:
MOVF VOLTAGE, 0 ;
SUBLW 9DH ;9DH对应电压为40.1V
BTFSC STATUS, C ;
GOTO BAT_LOW_NEXT ;C=1,9D-VOLTAGE>=0,即VOLTAGE<=9DH
;-------------------------------------------------------------------------------
; 电压>40.1V, 如果原无欠压标志,退出
BTFSS LOW_BAT ;C=0,9D-VOLTAGE<0,即VOLTAGE>9DH
RETURN ;LOW_BAT=0,电压大于43.6V,退出
;-------------------------------------------------------------------------------
; 如果原有欠压标志,电压在40.85V以下,不作高压,也不作欠压处理
; 大于40.85V按高压处理
ADDLW 03H ;此时电压值为40.1V-43.6V之间
;(03H对应电压0.77V)
BTFSS STATUS, C ;原W=9D+3-VOLTAGE=0A0-VOLTAGE,
GOTO HIGH_VOLTAGE ;C=0,电压高于40.85V,按高电压处理再来
RETURN ;电压低于40.85V,退出。
;*******************************************************************************
; 根据电池电压,设定最大工作电流
;每单位电池电压变化为:0.2553V
;每单位采样电流变化为:1.459A
;10H的1.5倍=21H,对应电流变化为48A
;低于设定标准,按EF_LOW最低参考电流
;根据R2和BAT_DOWN,确定当前最大工作电流
;*******************************************************************************
WORK_ISET:
MOVF BAT_DOWN, 0 ;
;电压在38.2V-43.6V之间,BAT_DOWN=1.5倍(43.6-输入电压),小于38.2V,BAT_DOWN=1EH
;电压高于43.6V,BAT_DOWN=0
SUBWF R2, 0 ;R2-BAT_DOWN
BTFSS STATUS, C ;
GOTO WORK_ISET1 ;C=0, R2-BAT_DOWN<0, R2<BAT_DOWN
MOVWF R3 ;C=1, R2-BAT_DOWN>=0, R3=R2-BAT_DOWN>=0
SUBWF REF_LOW, 0 ;
BTFSC STATUS, C ;是否大于最低参考电流?
GOTO WORK_ISET1 ;C=1,REF_LOW-R3>=0,R3<=REF_LOW
MOVF R3, 0 ;
MOVWF LIMIT_I ;LIMIT_I=R3=R2-BAT_DOWN(当前限流值)
RETURN
;-------------------------------------------------------------------------------
; 如果计算后限流电流小于最低参考电流,按最低参考电流
WORK_ISET1: ;R2<BAT_DOWN,或R3<=REF_LOW,按最低参考电流
MOVF REF_LOW, 0 ;
MOVWF LIMIT_I ;LIMIT_I=REF_LOW
RETURN
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;*******************************************************************************
; 根据霍尔角度选择开关的电压,设定最大限定电流
;配置巡航状态:
; 半堵转标志=1: R2=28H
; I_MODE=0: PWM_VAL< 58H: R2=33H
; PWM_VAL>=58H: R2=33H-(PWM_VAL-58H)/4
; I_MODE=1: PWM_VAL< 74H: R2=33H
; PWM_VAL>=74H: R2=33H-(PWM_VAL-74H)/4
; I_MODE=2(3): PWM_VAL<=8CH: R2=33H
; PWM_VAL>=8CH: R2=33H-(PWM_VAL-8CH)/8
;-------------------------------------------------------------------------------
;配置ABS状态:
; 半堵转标志=1: R2=I_BASIC+28H
; I_MODE=0: PWM_VAL< 58H: R2=I_BASIC+33H
; PWM_VAL>=58H: R2=I_BASIC+33H-(PWM_VAL-58H)/4
; I_MODE=1: PWM_VAL< 74H: R2=I_BASIC+33H
; PWM_VAL>=74H: R2=I_BASIC+33H-(PWM_VAL-74H)/4
; I_MODE=2(3): PWM_VAL<=8CH: R2=I_BASIC+33H
; PWM_VAL>=8CH: R2=I_BASIC+33H-(PWM_VAL-8CH)/8
;*******************************************************************************
MAX_ISET:
BTFSC ABS_CRUISE ;
GOTO MAXI_ABS1 ;ABS_CRUISE=1,ABS有效
;-------------------------------------------------------------------------------
MAXI_CRUISE1:
BTFSC HALF_SHEEL ;配置为巡航状态
GOTO MAXI_CRUISE5 ;此时ABS_CRUISE=0,HALF_SHEEL=1,
MOVLW 58H ;此时,HALF_SHEEL=0
BTFSC I_MODE, 0 ;当电压<0.63V(60度霍尔)
;或电压<3.13V(120度霍尔),I_MODE=0;
MOVLW 74H ;I_MODE不等于0,PWM_VAL=74H
SUBWF PWM_VAL, 0 ;I_MODE=0,W=PWM_VAL-58H,
;I_MODE>0,W=PWM_VAL-74H,
BTFSC STATUS, C ;PWM_VAL-58(74)H
GOTO MAXI_CRUISE3 ;C=1,PWM_VAL-58H(74H)>=0,PWM_VAL>=58H(74H)
MAXI_CRUISE2:
MOVLW 33H ;PWM_VAL<58H(74H)时
MOVWF R2 ;R2=33H
RETURN
;-------------------------------------------------------------------------------
MAXI_CRUISE3: ;PWM_VAL>=58H(74)时
MOVWF R3 ;R3=PWM_VAL-58H
BCF STATUS, C ;
RRF R3, 1 ;R3=(PWM_VAL-58H)/2
BCF STATUS, C ;
RRF R3, 0 ;W=(PWM_VAL-58H)/4
BTFSS I_MODE, 1 ;
;当1.25V<电压<1.88V(60度霍尔)或3.75V<电压<4.38V(120度霍尔),I_MODE=2;
;当电压>1.88V(60度霍尔)或电压>4.38V(120度霍尔),I_MODE=3;
;BTFSS I_MODE, 1 即判断电压是否大于1.25V,或是否大于3.75V
GOTO MAXI_CRUISE4 ;电压小于1.25V(3.75V)
;-------------------------------------------------------------------------------
ADDLW 0F9H ;电压大于1.25V(3.75V)
BTFSS STATUS, C ;W=0F9H+(PWM_VAL-74H)/4=0DCH+(PWM_VAL/4)
GOTO MAXI_CRUISE2 ;C=0,0F9H+(PWM_VAL-74H)/4<=0FFH,
;相当于PWM_VAL<=8CH
MOVWF R3 ;C=1,PWM_VAL>8CH时,R3=(PWM_VAL/4)-23H
BCF STATUS, C ;
RRF R3, 0 ;W=R3/2=0.5*[(PWM_VAL/4)-23H]
;-------------------------------------------------------------------------------
MAXI_CRUISE4: ;电压小于1.25V(3.75V)
SUBLW 33H ;
MOVWF R2 ;R2=33H-W
RETURN ;
;-------------------------------------------------------------------------------
MAXI_CRUISE5:
MOVLW 28H ;HALF_SHEEL=1
MOVWF R2 ;R2=28H
RETURN
;*******************************************************************************
; 配置为ABS状态,程序同巡航,结果加上I_BASIC
MAXI_ABS1:
BTFSC HALF_SHEEL ;
GOTO MAXI_ABS3 ;半堵转状态,R2=I_BASIC+28H
MOVLW 58H ;
BTFSC I_MODE, 0 ;
MOVLW 74H ;
SUBWF PWM_VAL, 0 ;
BTFSC STATUS, C ;
GOTO MAXI_ABS4 ;
MAXI_ABS2:
MOVLW 33H ;
MOVWF R3 ;
GOTO MAXI_ABS6 ;
;-------------------------------------------------------------------------------
MAXI_ABS3:
MOVLW 28H ;
MOVWF R3 ;
GOTO MAXI_ABS6 ;
MAXI_ABS4:
MOVWF R3 ;
BCF STATUS, C ;
RRF R3, 1 ;
BCF STATUS, C ;
RRF R3, 0 ;
BTFSS I_MODE, 1 ;
GOTO MAXI_ABS5 ;
ADDLW 0F9H ;
BTFSS STATUS, C ;
GOTO MAXI_ABS2 ;
MOVWF R3 ;
BCF STATUS, C ;
RRF R3, 0 ;
MAXI_ABS5:
SUBLW 33H ;
MAXI_ABS6:
ADDWF I_BASIC, 0 ;
MOVWF R2 ;
RETURN
;*******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -