📄 pic16c72_ebike.asm
字号:
MOVWF R2 ;R2=TURNER
;这段程序好像提前了,应该在判断极性下面,如果是反极性而且是满转把,电压在0.63V以下
MOVLW 20H ;
SUBWF R2, 0 ;R2-20H=TURNER-20H
BTFSS STATUS, C ;
GOTO STOP_CRUISE ;C=0,R2-20H<0,转把电压<0.63V, GOTO STOP_CRUISE
BTFSS TURN_POL ;转把电压>=0.63V
GOTO TURN2PWM1 ;如果TURN_POL标志位=0,直接到TURN2PWM1
MOVF R2, 0 ;如果TURN_POL标志位=1
SUBLW 0D8H ;0D8H-R2(TURNER);
BTFSS STATUS, C ;
GOTO STOP_CRUISE ;TURN_POL=1,转把电压>4.2V, GOTO STOP_CRUISE
MOVWF R2 ;TURN_POL=1,如果转把电压<=4.2V
;R2=0D8H(4.2V)-TURNER
;-------------------------------------------------------------------------------
TURN2PWM1:
BTFSC CRUISE_RUN ;******如果是巡航状态,不再处理转把电压******
RETURN ;CRUISE_RUN=1,退出
MOVLW 95H ;CRUISE_RUN=0,
SUBWF R2, 0 ;
BTFSC STATUS, C ;R2-95H
GOTO TURN2PWM_HIGH ;C=1,R2-95H>=0,R2>=95H(转把电压>=2.9V)
;GOTO TURN2PWM_HIGH,直接输出0FFH给OUTSIG
;-------------------------------------------------------------------------------
MOVLW 3BH ;C=0,R2-95H<0, 转把电压<2.9V;
SUBWF R2, 1 ;R2=R2-3BH=TURNER(按正极性)-3BH
BTFSS STATUS, C ;
GOTO TURN2PWM_LOW ;C=0,R2-3BH<0, TURNER<3BH(转把电压<1.15V)
BCF STATUS, C ;转把电压>=1.15V时,
RRF R2, 0 ;W=[TURNER(按正极性)-3BH]/2
ADDLW 01H ;
MOVWF R2 ;R2=1+[TURNER(按正极性)-3BH]/2
;=[TURNER(按正极性)-39H]/2
TURN2PWM_LOOP:
BCF INTCON, GIE ;禁止中断
BTFSC INTCON, GIE ;
GOTO TURN2PWM_LOOP ;等待禁止中断完毕
MOVLW 2AH ;应该是TABLE的地址
ADDWF R2, 1 ;R2=TABLE的地址+[TURNER(按正极性)-39H]/2
MOVLW 00H ;(95H-39H)/2=2EH=46(TABLE数量)
BTFSC STATUS, C ;
ADDLW 01H ;
MOVWF PCLATH ;
MOVF R2, 0 ;############查表指令用法需要研究#########
CALL OUT_TABLE ;根据转把电压输出
MOVWF OUTSIG ;OUTSIG存放输出信号
BSF INTCON, GIE ;开总中断
TURN2PWM_NEXT:
BTFSS TURN_LOW ;
GOTO TURN2PWM_NEXT1 ;C=0,BTFSS TURN_LOW=0
BCF DRV_ERR ;
BTFSC ABS_MOTOR_STOP;
GOTO TURN2PWM_NEXT1 ;
TURN2PWM_LOOP2:
BCF INTCON, GIE ;禁止中断
BTFSC INTCON, GIE ;
GOTO TURN2PWM_LOOP2 ;查询中断是否禁止
CALL CHECK_HARDWARE ;
BSF INTCON, GIE ;允许中断
TURN2PWM_NEXT1:
BCF TURN_LOW ;低转把电压标志清零
MOVF OUTSIG, 0 ;
MOVWF VOL2PWM ;VOL2PWM=OUTSIG
BSF TURN_VALID ;置位有效转把标志
BTFSC HOLL_ERR ;
GOTO TURN2PWM_NEXT2 ;
RETURN
TURN2PWM_NEXT2: ;入口条件: HOLL_ERR=1
BCF TURN_VALID ;清零有效转把标志
CLRF VOL2PWM ;清零VOL2PWM
RETURN ;
TURN2PWM_HIGH: ;入口条件: 1)转把电压>=2.9V
MOVLW 0FFH ;
MOVWF OUTSIG ;直接输出0FFH给OUTSIG
GOTO TURN2PWM_NEXT ;
STOP_CRUISE: ;入口条件: 1)ABS刹车
; 2)转把电压(正极性)<0.63V
; 3)转把电压(反极性)>4.2V
BCF CRUISE_RUN ;清零巡航运行标志标志
TURN2PWM_LOW: ;入口条件: 转把电压<1.15V
BSF TURN_LOW ;置位低转把电压标志
BCF TURN_VALID ;清零有效转把标志
CLRF VOL2PWM ;清零VOL2PWM
BCF FULL_SHEEL ;清零FULL_SHEEL
CLRF TM524_CNT ;清零TM524_CNT
BCF HALF_SHEEL ;清零半堵转标志
RETURN
;*******************************************************************************
; 未调用的程序
;*******************************************************************************
XXXX:
BTFSS HOLL_ERR ;
RETURN ;返回
BTFSC HOLL_TYPE ;60度霍尔等于1和120度霍尔等于0
GOTO XXX1 ;HOLL_TYPE=1,60度霍尔
MOVF PORTC, 0 ;HOLL_TYPE=0,120度霍尔
ANDLW 70H ;0111,0000
BTFSC STATUS, Z
RETURN
SUBLW 70H ;霍尔值等于70H,退出
BTFSC STATUS, Z
RETURN
GOTO XXX2
XXX1: ;HOLL_TYPE=1,60度霍尔
MOVF PORTC, 0
ANDLW 70H
SUBLW 20H
BTFSC STATUS, Z ;霍尔值等于20H,退出
RETURN
MOVF PORTC, 0
ANDLW 70H
SUBLW 50H
BTFSC STATUS, Z ;霍尔值等于50H,退出
RETURN
XXX2:
BCF INTCON, GIE
BTFSC INTCON, GIE
GOTO XXX2 ;直到中断关闭
CALL CHECK_HOLL
BSF INTCON, GIE ;开中断
RETURN
;********************************************************************************
OUTPUT_EXIT:
BCF CRUISE_RUN ;清巡航运行标志
BCF TURN_VALID ;清有效转把标志
CLRF VOL2PWM
RETURN ;返回
;********************************************************************************
; 工作模式设定(霍尔类型及限流模式选择)
;当配置电压大于2.5V时,HOLL_TYPE=0,为120度霍尔
;当配置电压小于2.5V时,HOLL_TYPE=1,为60度霍尔
;当配置电压<0.63V(60度霍尔)或配置电压<3.13V(120度霍尔),I_MODE=0;
;当0.63<配置电压<1.25V(60度霍尔)或3.13V<配置电压<3.75V(120度霍尔),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;
;********************************************************************************
WORK_MODE:
BCF TURN_POL ;转把电压极性选择,本程序选TURN_POL=0(固定)
BSF BREAK_POL ;刹车电压极性选择,本程序选BREAK_POL=1(固定)
BSF HOLL_TYPE ;暂时设定为60度霍尔
CLRF SAMP_FLAG ;清所有采样标志
CLRF I_MODE ;清限流模式寄存器
MOVLW 90H ;1001,0000 Fosc/32
MOVWF ADCON0 ;通道2
CALL AD_SAMPLE
MOVWF R1 ;R1--配置电压寄存器
MOVLW 80H ;1000,0000
SUBWF R1, 0 ;R1采样到的配置电压-2.5V
BTFSS STATUS, C
GOTO WORK_MODE1
BCF HOLL_TYPE ;>2.5V,FLAG2.HOLL_TYPE=0(120度霍尔)
MOVWF R1 ;差值回存R1
WORK_MODE1: ;此时如果电压>2.5V,HOLL_TYPE=0,
;电压<=2.5V,HOLL_TYPE=1
MOVLW 20H
SUBWF R1, 0 ;0.63V-R1
BTFSS STATUS, C
GOTO WORK_MODE2 ;检测到电压<0.63V 或电压<(2.5+0.63V)时,返回
INCF I_MODE, 1 ;检测到电压>0.63V,或电压>(2.5+0.63V=3.13V)时
;I_MODE加1,即I_MODE=01H
MOVLW 40H ;1.25V
SUBWF R1, 0 ;1.25V-R1
BTFSS STATUS, C
GOTO WORK_MODE2 ;检测到电压<1.25V 或电压<(2.5+1.25V)时,返回
INCF I_MODE, 1 ;检测到电压>1.25V,或电压>(2.5+1.25V=3.75V)时
;I_MODE加1,即I_MODE=02H
MOVLW 60H ;1.88V
SUBWF R1, 0 ;1.88V-R1
BTFSS STATUS, C
GOTO WORK_MODE2 ;检测到电压<1.88V 或电压<(2.5+1.88V)时,返回
INCF I_MODE, 1 ;检测到电压>1.88V,或电压>(2.5+1.88V=4.38V)时
;I_MODE加1,即I_MODE=03H
WORK_MODE2:
RETURN
;*******************************************************************************
; 有关巡航运行程序
; CRUISE_REG起到标志位作用,当未能全部检测到有效信号,该值清零,提示可以
; 下一次检测。如果连续检测有效信号,该值置为08H,屏蔽检测信号;
; 新的检测需连续两次成功,结合PWM_VAL,翻转巡航状态。
;*******************************************************************************
ABS_CRUISE_CHK:
BTFSC ABS_CRUISE
GOTO ABS_USED ;ABS_CRUISE=1,ABS功能使用
BCF ABS_BREAK_FG ;清ABS刹车标志位
BCF ABS_BREAK_FULL ;清ABS刹车全开标志
BCF ABS_MOTOR_STOP ;清ABS电机停止标志
BTFSS CRUISE_RUN ;判断巡航运行标志
BCF STOP_PIN ;没有巡航运行标志, 关闭巡航/刹车指示灯
;-------------------------------------------------------------------------------
MOVLW 08H ;再连续8次检测巡航信号
MOVWF R2 ;R2=08,检测次数
CLRF R3 ;R3:检测有效次数
CRUISE_LOOP1:
BTFSS ABS_PIN ;检测巡航开关信号
INCF R3, 1 ;ABS_PIN=0,巡航探测有效(低电平有效)
DECFSZ R2, 1 ;
GOTO CRUISE_LOOP1 ;循环检测8次后,将巡航有效存到R3
MOVLW 08H
SUBWF R3, 0 ;R3-08H
BTFSS STATUS, Z
GOTO CRUISE_CHK3 ;Z=0,R3<08H,有效检测未到8次
;-------------------------------------------------------------------------------
MOVF R3, 0 ;Z=1,全部8次检测都有效
SUBWF CRUISE_REG, 0 ;CRUISE_REG-R3
BTFSC STATUS, Z ;(在初始化时,CRUISE_REG赋值08H)
GOTO CRUISE_CHK4 ;Z=1,CRUISE_REG=08H时,CRUISE_CNT清零
INCF CRUISE_CNT, 1 ;CRUISE_REG不等于08H时
MOVLW 02H ;
SUBWF CRUISE_CNT, 0 ;CRUISE_CNT-02H
BTFSS STATUS, C ;
RETURN ;C=0,CRUISE_CNT-02H<0,即CRUISE_CNT<02H,
;成功次数小于2次,退出
MOVF R3, 0 ;C>0,成功检测次数大于等于2次
MOVWF CRUISE_REG ;CRUISE_REG=R3
BTFSS CRUISE_RUN ;检测CRUISE_RUN标志位
GOTO CRUISE_CHK2 ;原巡航运行标志位=0,即原为非巡航运行状态
BCF CRUISE_RUN ;原巡航运行标志位=1,则取消巡航状态。
RETURN
CRUISE_CHK2: ;原巡航运行标志位=0,
MOVF PWM_VAL, 1 ;
BTFSC STATUS, Z ;判断PWM_VAL是否等于0
GOTO CRUISE_CHK3 ;Z=1,PWM_VAL=0,
BSF CRUISE_RUN ;PWM_VAL大于0,置巡航运行标志位
BSF STOP_PIN ;点亮巡航/刹车指示灯
RETURN
CRUISE_CHK3: ;成功检测未到8次/或检测到巡航,但PWM_VAL=0
CLRF CRUISE_REG ;
CRUISE_CHK4: ;CRUISE_REG=08H时,直接翻转标志
BTFSC CRUISE_RUN ;
GOTO CRUISE_CHK5 ;
CLRF CRUISE_CNT ;原巡航未运行
RETURN
CRUISE_CHK5: ;原巡航正在运行
MOVLW 00H ;
MOVWF CRUISE_CNT ;这两种用法有何区别???
RETURN
;*******************************************************************************
; 连续16次检测到ABS触发信号,ABS触发信号有效
; 累计5次以上检测到ABS触发信<=2次,视为无ABS触发信号
;*******************************************************************************
ABS_USED: ;ABS_CRUISE=1,ABS功能有效
BCF CRUISE_RUN ;
MOVLW 10H ;
MOVWF R2 ;
CLRF R3 ;
ABS_LOOP2:
BTFSS ABS_PIN ;检测ABS引脚
INCF R3, 1 ;电压低,ABS信号被触发
DECFSZ R2, 1 ;电压高
GOTO ABS_LOOP2 ;
MOVLW 10H ;
SUBWF R3, 0 ;
BTFSC STATUS, Z ;
GOTO ABS_OK2 ;Z=1,连续16次检测到ABC触发信号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -