📄 pic16c72_ebike.asm
字号:
MOVF R3, 0 ;
SUBLW 02H ;
BTFSC STATUS, C ;02H-R3
GOTO ABS_EXIT ;C=1,02H-R3>=0,R3<=02H
RETURN ;检测到触发信号>2,退出
;连续16次检测到ABC触发信号,ABS触发信号有效
ABS_OK2:
BSF ABS_BREAK_FG ;ABS刹车标志位
BSF STOP_PIN ;点亮巡航/刹车指示灯
CLRF ABS_NOSIG_CNT ;ABS_NOSIG_CNT=0,
RETURN
;累计5次以上检测到ABS触发信<=2次,视为无ABS触发信号
ABS_EXIT: ;检测到触发信号<=2次,
INCF ABS_NOSIG_CNT, 1 ;
MOVLW 05H ;
SUBWF ABS_NOSIG_CNT, 0 ;ABS_NOSIG_CNT-05
BTFSS STATUS, C ;
RETURN ;C=0,ABS_NOSIG_CNT-05H<0, ABS_NOSIG_CNT<05H,退出
DECF ABS_NOSIG_CNT, 1 ;C=1,ABS_NOSIG_CNT-05H>=0,ABS_NOSIG_CNT>=05H
BCF STOP_PIN ;关闭巡航/刹车指示灯
BCF INTCON, GIE ;关中断(为何此处要关一下?)
BCF ABS_BREAK_FG ;清ABS刹车标志位
BCF ABS_BREAK_FULL ;清ABS刹车全开标志
BCF ABS_MOTOR_STOP ;
BSF INTCON, GIE ;开中断
RETURN
;*******************************************************************************
;电流采样,8次平均,当前数据保存在I_BASIC
;当有20K上拉电阻时,在正常电流状况下(电压1.2V-1.8V),为ABS配置状态,ABS_CRUISE置位
;设置电流参考值REF_LOW(偏置电流值+06H)及REF_HIGH(偏置电流值+16H)
;设置ABS电流参考值ABS_LOW(偏置电流值-27H)及ABS_HIGH(偏置电流值-04H)
;电压超过1.8V(ABS)/0.24V(CRUISE)时为LM358故障,置LM358_ERR标志
;*******************************************************************************
BASIC_ISET:
MOVLW 08H
MOVWF ICOUNT ;ICOUNT=08H
CLRF IRESH
CLRF IRESL
BASIC_ISET1:
MOVLW 80H ;1000,0000
MOVWF ADCON0 ;选择通道0,采样电流 ,FOSC/32
CALL AD_SAMPLE ;AD采样程序
ADDWF IRESL, 1
BTFSC STATUS, C
INCF IRESH, 1
DECFSZ ICOUNT, 1
GOTO BASIC_ISET1 ;8次采样未完,则继续
RRF IRESH, 1
RRF IRESL, 1
RRF IRESH, 1
RRF IRESL, 1
RRF IRESH, 1
RRF IRESL, 0 ;右移3次,除8
MOVWF I_BASIC ;<<I_BASIC=偏置电流值>>
ADDLW 06H ;
MOVWF REF_LOW ;<<REF_LOW=偏置电流值+06H>>
ADDLW 10H ;
MOVWF REF_HIGH ;<<REF_HIGH=偏置电流值+16H>>
MOVLW 5CH ;5V=255(0FFH),5CH=5*92/255=1.804V=1.8V
SUBWF I_BASIC, 0 ;{采样电压-1.8V}
BTFSC STATUS, C ;C=0,电流电压<1.8V,则跳转
GOTO BASIC_ISET2 ;C=1,电流电压>1.8V,置LM358_ERR标志
MOVLW 3DH ;5V=255(0FFH),3DH=5*61/255=1.196V=1.2V
SUBWF I_BASIC, 0 ;{采样电压-1.2V}
BTFSC STATUS, C ;C=0,电流电压<1.2V,则跳转
GOTO BASIC_ISET3 ;C=1,电流电压>1.2V,置相应的标志位ABS_CRUISE=1
MOVLW 0CH ;
SUBWF I_BASIC, 0 ;{采样电压-0.24V}
BTFSC STATUS, C ;C=0,电流电压<0.24V,则返回
GOTO BASIC_ISET2 ;C=1,电流电压>0.24V,置LM358_ERR标志
RETURN
BASIC_ISET2:
BSF LM358_ERR ;LM358_ERR=1,置LM358_ERR标志
RETURN
BASIC_ISET3:
BSF ABS_CRUISE ;ABS_CRUISE=1,有10K上拉电阻,为ABS配置状态
GOTO ABS_REF_SET ;ABS参考点设置
;*******************************************************************************
; 堵转检测程序
;TM524_CNT>=04H时,FULL_SHEEL=1,CRUISE_RUN=0
;TM524_CNT>=02H时,HALF_SHEEL=1
;
;条件退出 1:非有效转把状态
; 2:有刹车标志
; 3: 有超速标志
; 4: 超过最低限流电流<08H
; 5: 速度计数器>04H
; 6: 连续累加速度计数器>=0FH
;*******************************************************************************
SHEEL_RUNNING:
CLRF TM524_CNT ;清TM524_CNT计数器
BCF HALF_SHEEL ;清半堵转标志位
CLRF SPEED_CNT ;清霍尔位置位置变化计数器
BCF OVER_SPEED ;清超速标志
CLRF HOLL_CHAG_SUM ;清HOLL_CHAG_SUM
RETURN
SHEEL_CHK: ;每16次TIME32_FG执行1次
BTFSS TURN_VALID
GOTO SHEEL_RUNNING ;非有效转把状态, 退出程序
BTFSC STOP_BYKE ;
GOTO SHEEL_RUNNING ;有刹车标志, 退出程序
BTFSC OVER_SPEED ;
GOTO SHEEL_RUNNING ;有超速标志, 退出程序
;-------------------------------------------------------------------------------
MOVLW 08H
SUBWF LOW_LIMIT_UP, 0 ;LOW_LIMIT_UP-08H
BTFSS STATUS, C
GOTO SHEEL_RUNNING ;LOW_LIMIT_UP<08H,退出程序
;-------------------------------------------------------------------------------
; 上面已经有了这个判断,####多余####
BTFSC OVER_SPEED ;
GOTO SHEEL_RUNNING ;OVER_SPEED=1,退出程序
;-------------------------------------------------------------------------------
MOVF SPEED_CNT, 0 ;读霍尔位置变化计数器
SUBLW 04H ;04H-SPEED_CNT
BTFSS STATUS, C
GOTO SHEEL_RUNNING ;SPEED_CNT>04H,退出程序(电机速度很慢)
;-------------------------------------------------------------------------------
MOVF SPEED_CNT, 0 ;C=1,04H-SPEED_CNT>=0, SPEED_CNT<=04H
CLRF SPEED_CNT ;SPEED_CNT=0;
ADDWF HOLL_CHAG_SUM, 1 ;HOLL_CHAG_SUM=SPEED_CNT+HOLL_CHAG_SUM
MOVLW 0FH
SUBWF HOLL_CHAG_SUM, 0 ;HOLL_CHAG_SUM-0FH
BTFSC STATUS, C
GOTO SHEEL_RUNNING ;C=1,HOLL_CHAG_SUM>=0FH,退出程序
MOVLW 04H ;C=0,HOLL_CHAG_SUM<0FH
SUBWF TM524_CNT, 0 ;TM524_CNT-4
BTFSC STATUS, C
GOTO SHEEL_CHK2 ;C=1, (TM524_CNT>=04H,GOTO SHEEL_CHK2)
; (堵转标志置位)
; (BCF CRUISE_RUN)
; (RETURN)(第2次堵转时间到)
MOVLW 02H ;C=0,TM524_CNT<04H
SUBWF TM524_CNT, 0 ;TM524_CNT-2
BTFSC STATUS, C
GOTO SHEEL_CHK1 ;C=1, (TM524_CNT>=02H,GOTO SHEEL_CHK1)
;BSF HALF_SHEEL 第1次堵转时间到
RETURN ;C=0, TM524_CNT<02H RETURN
SHEEL_CHK1:
BSF HALF_SHEEL ;TM524_CNT>=02H,置半堵转标志
RETURN
SHEEL_CHK2: ;TM524_CNT>=04H
BSF FULL_SHEEL ;设置全堵转标志
BCF CRUISE_RUN ;清巡航运行标志
RETURN
;*******************************************************************************
; LED指示程序
;*******************************************************************************
LED:
BTFSC BRIDGE_ERR ;是否是功率桥损坏?
GOTO LED_BRG_ERR
BTFSC LM358_ERR ;判断是否LM358损坏
GOTO LED_LM358_ERR
BTFSS PORTB, 0 ;判断是否过流(或另1路LM358损坏)
GOTO LED_LM358_ERR
BTFSC DRV_ERR ;是否是驱动损坏?
GOTO LED_DRV_ERR
BTFSC STOP_BYKE ;判断是否刹车?
GOTO LED_STOP_BYKE
BTFSC HOLL_ERR ;判断是否霍尔损坏?
GOTO LED_HOLL_ERR
BTFSC LOW_BAT ;判断是否欠压?
GOTO LED_LOW_BAT
BTFSS TURN_VALID ;判断是否非有效转把(待机)
GOTO LED_TURN_VALID ;
BSF STATUS, RP0 ;BANK1
MOVF PORTB, 0 ;读TRISB到W
BCF STATUS, RP0 ;BANK0
MOVWF R1 ;R1=TRISB
BTFSC R1, 1 ;判断RB1是否输出口?
GOTO LED_ON ;C=1,RB1=1,为输入口
LED_OFF:
BCF LED_PIN ;指示灯灭
CLRF LED_SET_NO ;清LED闪烁设置次数
CLRF LED_DELAY ;清LED_DELAY
RETURN
LED_ON:
BTFSC PORTB, 1 ;RB1=0,打开LED
GOTO LED_OFF ;RB=1,关闭LED
BSF LED_PIN ;指示灯亮
CLRF LED_SET_NO ;清LED闪烁设置次数
CLRF LED_DELAY ;
RETURN
;*******************************************************************************
; LED显示时间:LED_SET_NO存放LED闪烁时间
; 灯闪次数定义(电机转动时灯不闪)
;
; 1次=非有效转把(待机) 5次=上次不正常
; 2次=刹车 6次=无霍尔
; 3次=LM358检测电压不正常 7次=过流(驱动坏)
; 4次=下桥不正常 8次=欠压
;*******************************************************************************
LED_DRV_ERR:
MOVLW 0EH ;
MOVWF LED_SET_NO
GOTO LED_RUN ;LED_SET_NO=14 (7次,驱动坏)
LED_HOLL_ERR:
MOVLW 0CH
MOVWF LED_SET_NO
GOTO LED_RUN ;LED_SET_NO=12 (6次,霍尔坏)
LED_BRG_ERR:
BTFSC BRG_ERR_TYPE ;上桥故障等于0,下桥故障等于1
GOTO LED_BRG_ERR2
MOVLW 0AH
MOVWF LED_SET_NO ;LED_SET_NO=10 (5次,上桥坏)
GOTO LED_RUN
LED_BRG_ERR2:
MOVLW 08H
MOVWF LED_SET_NO ;LED_SET_NO=08 (4次,下桥坏)
GOTO LED_RUN ;
LED_LM358_ERR:
MOVLW 06H
MOVWF LED_SET_NO ;LED_SET_NO=06 (3次,LM358故障)
GOTO LED_RUN
LED_STOP_BYKE:
MOVLW 04H
MOVWF LED_SET_NO
GOTO LED_RUN ;LED_SET_NO=04 (2次,刹车)
LED_TURN_VALID:
MOVLW 02H
MOVWF LED_SET_NO
GOTO LED_RUN ;LED_SET_NO=02 (1次,有效转把)
LED_LOW_BAT:
MOVLW 10H
MOVWF LED_SET_NO ;LED_SET_NO=16 (8次,欠压)
;-------------------------------------------------------------------------------
LED_RUN: ;闪烁时间:亮32.768*6=197毫秒,灭197毫秒
MOVF LED_SET_NO, 0 ;停10*32.768=328毫秒.
SUBWF LED_WORK_NO, 0 ;LED_WORK_NO-LED_SET_NO
BTFSC STATUS, C ;
GOTO LED5 ;C=1, LED_SET_NO<=LED_WORK_NO
;-------------------------------------------------------------------------------
;C=0, LED_SET_NO>LED_WORK_NO
;如果LED_DELAY=0,LED_PIN翻转
MOVF LED_DELAY, 1 ;C=0,LED_SET_NO>LED_WORK_NO
BTFSS STATUS, Z ;
GOTO LED3 ;
BTFSS LED_PIN ;
GOTO LED2 ;
BCF LED_PIN ;LED=0
GOTO LED3
LED2: ;
BSF LED_PIN ;LED=1
;-------------------------------------------------------------------------------
LED3: ;LED_DELAY递增至06H后归零,每6次执行翻转1次
INCF LED_DELAY, 1 ;
MOVF LED_DELAY, 0 ;
SUBLW 06H ;06H-LED_DELAY
BTFSC STATUS, C ;
GOTO LED4 ;C=1,06H-LED_DELAY>=0, LED_DELAY<=06H,返回
INCF LED_WORK_NO, 1 ;LED工作次数加1
CLRF LED_DELAY ;
LED4:
RETURN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -