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

📄 pic16c72_ebike.asm

📁 这是用PIC16C72的量产的电动自行车控制器的源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;-------------------------------------------------------------------------------
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 + -