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

📄 pic16c72_ebike.asm

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