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

📄 pic16c72_ebike.asm

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