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

📄 pic16c72_ebike.asm

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