📄 pic16c72_ebike.asm
字号:
; ABS参考点设置
;*******************************************************************************
ABS_REF_SET:
MOVLW 2DH ;(REF_LOW=06H+偏置电压值)
SUBWF REF_LOW, 0 ;
MOVWF ABS_LOW ;ABS_LOW=REF_LOW-2DH=偏置电压值-27H
MOVLW 10H
SUBWF REF_LOW, 0 ;
MOVWF ABS_HIGH ;ABS_HIGH=偏置电压值值-04H
RETURN
;*******************************************************************************
; 关闭MOS管/关闭ABS辅助/置位CLOSE_DRV
;*******************************************************************************
CLOSE_MOSFET: ;关闭MOS管
MOVF PORTB, 0
ANDLW 03H ;0000,0011
MOVWF PORTB ;关闭MOS管
ABS_BREAK_OFF ;宏指令,关闭ABS刹车
BSF CLOSE_DRV ;置位CLOSE_DRV标志
RETURN
;*******************************************************************************
; 硬件检测采样电流
;采样电压存于W及R3
;当电流大于REF_HIGH(32.32A)时,BRIDGE_ERR标志置1
;*******************************************************************************
I_HARDWARE_CHK: ;硬件检测采样电流
MOVLW 80H ;0通道,采样电流
MOVWF ADCON0
BSF SAMP_I ;置SAMP_I标志;
CALL HARDWARE_AD ;PWM AD采样,结果存于W,
;同时关闭MOS管/关闭ABS辅助/置位CLOSE_DRV
MOVWF R3 ;R3=采样电压(每单位1.4591A)
SUBWF REF_HIGH, 0 ;REF_HIGH=(0.431V+采样电压值)
BTFSS STATUS, C ;每A电流产生2×6.6666=13.3333mV电压,
;431mV/13.333mV=32.32A
BSF BRIDGE_ERR ;C=0,采样电压大于REF_HIGH,置BRIDGE_ERR标志
RETURN
;*******************************************************************************
;检测MOS管好坏
;检测霍尔值,如果错误,关闭MOS管,关闭PWM
;*******************************************************************************
CHECK_HARDWARE: ;检测功率管及霍尔
CLRF CCP1CON ;关闭CCP控制部件
CALL CLOSE_MOSFET ;关闭MOS管/关闭ABS辅助/置位CLOSE_DRV
MOVF PORTB, 0
IORLW 0E0H ;1110,0000
MOVWF PORTB ;开启MOS管的下桥
CALL I_HARDWARE_CHK ;硬件检测采样电流
;采样电压存于W及R3
;采样电压大于REF_HIGH,置BRIDGE_ERR标志
BTFSS BRIDGE_ERR ;
GOTO BRIDGE_UP_OK ;BRIDGE_ERR=0,电流小于REF_HIGH
;-------------------------------------------------------------------------------
; 上桥过流
MOVF REF_HIGH, 0 ;BRIDGE_ERR=1,电流大于REF_HIGH,上桥有问题
SUBWF R3, 0 ;R3为采样电流值,R3-REF_HIGH回存W
SUBLW 05H ;05H-W回存W,5H对应电流7.35A
BTFSS STATUS, C
GOTO CHECK_OVER ;C=0,W>5H,此时电流大于(32.35+7.35)39.7A;
;已经置位BRIDGE_ERR
BCF BRIDGE_ERR ;C=1 W<5H,即电流小于(32.35+7.35)39.7A时,
;上桥过流小于5H,清零BRIDGE_ERR
;-------------------------------------------------------------------------------
; 再次检测上桥
MOVF PORTB, 0
IORLW 0E0H ;1110,0000
MOVWF PORTB ;开启MOS管的下桥
CALL I_HARDWARE_CHK ;硬件检测采样电流
BTFSS BRIDGE_ERR
GOTO BRIDGE_UP_OK ;BRIDGE_ERR=0;上桥正常
;-------------------------------------------------------------------------------
BTFSC STATUS, C ;此时为何要检测C,似乎多此一举?
;C=0,采样电压大于REF_HIGH,置BRIDGE_ERR标志?
GOTO CHECK_OVER ;C=1,返回,已经置位BRIDGE_ERR
;-------------------------------------------------------------------------------
; 上桥正常,检测下桥
BRIDGE_UP_OK: ;电流小于REF_HIGH,上桥正常
MOVF PORTB, 0 ;读RB口
IORLW 1CH ;00011100
MOVWF PORTB ;关闭下桥,开启上桥
BSF PWM_PIN ;PWM管脚=1
CALL I_HARDWARE_CHK ;硬件检测采样电流
BCF PWM_PIN ;PWM管脚=0,需要PWM_PIN同时操作
BTFSC BRIDGE_ERR
GOTO BRIDGE_DOWN_ERR ;BRIDGE_ERR=1,下桥有故障
;-------------------------------------------------------------------------------
; 下桥正常
MOVF PORTB, 0 ;下桥正常,BRIDGE_ERR=0
IORLW 0E0H ;1110,0000
MOVWF PORTB ;关闭下桥,再次开启上桥
CALL I_HARDWARE_CHK ;硬件检测采样电流
BTFSC BRIDGE_ERR ;
GOTO CHECK_OVER ;上桥有故障,BRIDGE_ERR=1返回
;-------------------------------------------------------------------------------
; 上下桥都正常
CLRF CCPR1L ;上下桥都没有问题了,BRIDGE_ERR=0
MOVLW 0FH ;0000,FFFF
MOVWF CCP1CON ;设置CCP1,启动PWM方式
GOTO CHECK_HOLL ;开始检测霍尔
BRIDGE_DOWN_ERR:
BSF BRG_ERR_TYPE ;置下桥故障(BRG_ERR_TYPE=1)标志
;利用了初始化时BRIDGE=0,由于是一次性使用
;所以BRG_ERR_TYPE可以预先不清零
CHECK_OVER:
RETURN
;*******************************************************************************
CHECK_HOLL:
CLRF R5 ;检测霍尔次数计数器
CHK_HOLL_START:
INCF R5, 1 ;
CALL HD_HOLL_READ ;调用硬件检测读霍尔程序
MOVF HD_HOLL_VAL, 0 ;HD_HOLL_VAL为硬件检测读霍尔的确定值
MOVWF HOLL_OLD ;将结果存到HOLL_OLD
BSF HD_HOLL_CHK ;置位HD_HOLL_CHK标志
BCF HOLL_ERR ;清HOLL_ERR标志
BTFSC HOLL_TYPE ;区分60度还是120度
GOTO HOLL_DG60 ;60度霍尔
;-------------------------------------------------------------------------------
; 120度霍尔
MOVLW 10H ;120度霍尔
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION6 ;HOLL_OLD=10H
MOVLW 30H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION1 ;HOLL_OLD=30H
MOVLW 20H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION2 ;HOLL_OLD=20H
MOVLW 60H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION3 ;HOLL_OLD=60H
MOVLW 40H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION4 ;HOLL_OLD=40H
MOVLW 50H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION5 ;HOLL_OLD=50H
;-------------------------------------------------------------------------------
; 如果结果非以上6种状况(霍尔出错)
HOLL_CHK_ERR: ;
BCF HD_HOLL_CHK ;清HD_HOLL_CHK标志
MOVF R5, 0 ;
SUBLW 04H ;
BTFSC STATUS, C ;
GOTO CHK_HOLL_START ;重复4次检测
BSF HOLL_ERR ;如果还是错误,置位HOLL_ERR,表示霍尔错误
CALL CLOSE_MOSFET ;关闭MOS管/关闭ABS辅助/置位CLOSE_DRV
CLRF PWM_VAL ;PWM值清0
GOTO STOP_PWM ;执行“停止PWM信号输出/关闭辅助输出”程序
;同时退出硬件检测程序
;*******************************************************************************
HOLL_DG60: ;60度霍尔
MOVLW 30H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION6 ;HOLL_OLD=30H
MOVLW 10H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION1 ;HOLL_OLD=10H
MOVLW 00H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION2 ;HOLL_OLD=00H
MOVLW 40H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION3 ;HOLL_OLD=40H
MOVLW 60H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION4 ;HOLL_OLD=60H
MOVLW 70H ;
SUBWF HOLL_OLD, 0 ;
BTFSC STATUS, Z ;
GOTO HOLL_POSITION5 ;HOLL_OLD=70H
GOTO HOLL_CHK_ERR ;如果结果非以上6种状况
;*******************************************************************************
;(参阅《电动机的单片机控制》P233表9-4
HOLL_POSITION1: ;HOLL_OLD=30H
MOVLW 30H ;(120度)
BTFSC HOLL_TYPE ;
MOVLW 10H ;(60度)
MOVWF HOLL_TABLE ;
MOVLW 28H ;001-010,00(RB3/RB5)即V3/V2通,表中第3行
MOVWF DRV_TABLE ;DRV_TABLE=28H
GOTO HOLL_CHK_OVER ;
HOLL_POSITION2: ;HOLL_OLD=20H
MOVLW 20H ;(120度)
BTFSC HOLL_TYPE ;
MOVLW 00H ;(60度)
MOVWF HOLL_TABLE ;
MOVLW 30H ;001-100,00(RB5/RB4)即V2/V1通,表中第4行
MOVWF DRV_TABLE ;DRV_TABLE=30H
GOTO HOLL_CHK_OVER ;
HOLL_POSITION3: ;HOLL_OLD=60H
MOVLW 60H ;(120度)
BTFSC HOLL_TYPE ;
MOVLW 40H ;(60度)
MOVWF HOLL_TABLE ;
MOVLW 50H ;010-100,00(RB4/RB6)即V1/V6通,表中第5行
MOVWF DRV_TABLE ;DRV_TABLE=50H
GOTO HOLL_CHK_OVER ;
HOLL_POSITION4: ;HOLL_OLD=40H
MOVLW 40H ;(120度)
BTFSC HOLL_TYPE ;
MOVLW 60H ;(60度)
MOVWF HOLL_TABLE ;
MOVLW 44H ;010-001,00(RB6/RB2)即V6/V5通,表中第6行
MOVWF DRV_TABLE ;DRV_TABLE=44H
GOTO HOLL_CHK_OVER ;
HOLL_POSITION5: ;HOLL_OLD=50H
MOVLW 50H ;(120度)
BTFSC HOLL_TYPE ;
MOVLW 70H ;(60度)
MOVWF HOLL_TABLE ;
MOVLW 84H ;100-001,00(RB2/RB7)即V5/V4通,表中第1行
MOVWF DRV_TABLE ;DRV_TABLE=84H
GOTO HOLL_CHK_OVER ;
HOLL_POSITION6: ;HOLL_OLD=10H
MOVLW 10H ;(120度)
BTFSC HOLL_TYPE ;
MOVLW 30H ;(60度)
MOVWF HOLL_TABLE ;
MOVLW 88H ;100-010,00(RB7/RB3)即V4/V3通,表中第2行
MOVWF DRV_TABLE ;DRV_TABLE=88H
;*******************************************************************************
HOLL_CHK_OVER:
BTFSS HD_HOLL_CHK ;硬件检测霍尔时,HD_HOLL_CHK已经置1;
GOTO RUPT_END ;中断检测霍尔,到退出中断程序。
BTFSS HOLL_CHK_TWICE ;尚未检测完,检查HOLL_CHK_TWICE,如果等于0,
;执行HD_HOLL_CHK_NEXT
GOTO HD_HOLL_CHK_NEXT ;硬件检测霍尔时需检测2次
BCF HD_HOLL_CHK ;硬件检测霍尔完毕,清硬件检测霍尔标志
BCF HOLL_CHK_TWICE ;清HOLL_CHK_TWICE标志
RETURN ;退出硬件检测程序。
;*******************************************************************************
;在硬件检测霍尔时,SPEED_CNT=0
HD_HOLL_CHK_NEXT:
BSF HOLL_CHK_TWICE ;置位2次检测标志
MOVLW 02H ;
SUBWF SPEED_CNT, 1 ;SPEED_CNT-02H
BTFSC STATUS, C ;
GOTO HOLL_CHANGE1 ;C=1,SPEED_CNT-02H>=0,即SPEED_CNT>=02H
CLRF SPEED_CNT ;C=0,即SPEED_CNT<02H时,SPEED_CNT=0;
;
GOTO HOLL_CHANGE1 ;程序过HOLL_CHANGE14后,再到HOLL_CHK_OVER
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -