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

📄 pic16c72_ebike.asm

📁 这是用PIC16C72的量产的电动自行车控制器的源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;*******************************************************************************
				LIST   				P=16F72
				INCLUDE 			"P16F72.INC"
;-------------------------------------------------------------------------------
				#DEFINE 		FULL_SHEEL 			36H,6		;全堵转标志
				#DEFINE 		HALF_SHEEL 			36H,5		;半堵转标志
				#DEFINE 		TIME32_FG 			36H,4		;定时计数器溢出时等于1
				#DEFINE 		TM524_FLASH 		36H,3		;每524毫秒取反一次(程序其他地方未用)
				#DEFINE 		BRG_ERR_TYPE 		36H,2		;上桥故障等于0,下桥故障等于1
				#DEFINE 		OVER_SPEED			36H,1		;超速标志(只在堵转中使用,可以深入利用)
				#DEFINE 		TURN_VALID			36H,0		;有效转把标志                  
;-------------------------------------------------------------------------------
				#DEFINE 		HOLL_TYPE				37H,7		;60度霍尔等于1和120度霍尔等于0            
				#DEFINE 		TURN_POL				37H,6		;转把电压极性标志,0=正极性  
				#DEFINE 		BREAK_POL				37H,5		;刹车电压极性标志,1=正极性
				#DEFINE 		ABS_CRUISE			37H,4		;置1为ABS功能,清0为巡航功能
				#DEFINE 		ABS_BREAK_FULL	37H,3		;ABS刹车全开标志
				#DEFINE 		PWM_ABS_MODE		37H,2		;ABS刹车时PWM工作模式
;-------------------------------------------------------------------------------
				#DEFINE 		STOP_BYKE				38H,7		;刹车标志位
				#DEFINE 		CLOSE_DRV				38H,6		;关闭桥标志位
				#DEFINE 		DRV_ERR					38H,5		;驱动坏
				#DEFINE 		CRUISE_RUN			38H,4		;巡航运行标志
				#DEFINE 		HOLL_CHK_TWICE	38H,3		;硬件检测霍尔时,两次检查霍尔标志
				#DEFINE 		BRIDGE_ERR			38H,2		;桥路不正常
				#DEFINE 		HD_HOLL_CHK			38H,1		;硬件检测霍尔标志
				#DEFINE 		LM358_ERR				38H,0		;LM358故障
;-------------------------------------------------------------------------------
				#DEFINE 		TURN_LOW				39H,7		;转把电压低于1.15V置位
				#DEFINE 		WHEEL_POL				39H,6		;电机正反转极性???
				#DEFINE 		HOLL_ERR				39H,5		;霍尔故障标志位
				#DEFINE 		LOW_BAT					39H,4		;欠压标志位
				#DEFINE 		ABS_MOTOR_STOP	39H,3		;ABS刹车后电机停标志位
				#DEFINE 		ABS_BREAK_FG		39H,2		;ABS刹车标志位,连续16次被触发后置位
				#DEFINE 		HOLL_LOCK				39H,0		;霍尔没有变化,HOLL_LOCK=1
;-------------------------------------------------------------------------------
				#DEFINE 		SAMP_I					3AH,3		;电流采样标志位
				#DEFINE 		SAMP_U					3AH,2		;电池电压采样标志位
				#DEFINE 		SAMP_STOP				3AH,1		;刹车采样标志位
				#DEFINE 		SAMP_TURN				3AH,0		;转把采样标志位
;*******************************************************************************
				#DEFINE 		LED_PIN					PORTC,7			;系统指示灯					RC7
				#DEFINE 		ABS_PIN					PORTC,3			;ABS/巡航输入脚		 	RC3
				#DEFINE 		PWM_PIN					PORTC,2			;PWM输出脚		 			RC2
				#DEFINE 		STOP_PIN				PORTC,1			;巡航/刹车指示灯		RC1
				#DEFINE 		LOWBAT_PIN			PORTC,0			;欠压指示灯					RC0
;*******************************************************************************
				STACK_R1				EQU			20H				;堆栈保护寄存器
				STACK_R2  			EQU			21H				;堆栈保护寄存器
				R1							EQU			22H				;通用寄存器
				R2							EQU			23H				;通用寄存器
				R3							EQU			24H				;通用寄存器
				R4							EQU			27H				;通用寄存器
				ICOUNT   				EQU     25H      	;电流采样次数
        IRESH    				EQU     26H      	;电流采样结果高位
        IRESL    				EQU     27H      	;电流采样结果低位
        ADRESL    			EQU     28H     	;AD采样结果低位
        ADRESH    			EQU     29H     	;AD采样结果高位
        ADCOUNT   			EQU     2AH    		;AD采样结果次数
				;------							 		2BH		     -------------------------------------
				;------							 		2CH			   -------------------------------------
				TM32_CNT				EQU			2DH			  ;主程序每循环1次加1(周期为32.768mS),
																					;到10H时归零
				TM524_CNT				EQU			2EH				;主程序每循环16次加1(周期为524mS)
				VOL2PWM					EQU		 	2FH	  	  ;转把电压转换成PWM的值
;-------------------------------------------------------------------------------
				PWM_VAL					EQU			30H				;PWM的值
				PWM_TEMP				EQU   	31H				;PWM临时寄存器
				DRV_TABLE				EQU	 	  32H			  ;上下桥输出的值
				;------									33H					------------------------------------
				HOLL_TABLE			EQU	    34H				;在霍尔和相线的赋值时为霍尔值
				HOLL_OLD				EQU	    35H       ;原来霍尔的值
				FLAG1						EQU    	36H				;标志位寄存器1
				FLAG2						EQU    	37H				;标志位寄存器2
				FLAG3						EQU    	38H				;标志位寄存器3
				FLAG4						EQU    	39H				;标志位寄存器4
				SAMP_FLAG				EQU     3AH				;采样标志位寄存器5
				I_MODE					EQU	    3BH       ;限流模式选择
				SPEED_CNT				EQU			3CH			  ;在524mS内霍尔位置变化计数器		
				R5							EQU		  3DH       ;通用寄存器
				R6							EQU			3EH       ;通用寄存器
				R7							EQU			3FH       ;通用寄存器
;-------------------------------------------------------------------------------
				RUPT_HOLL_VAL		EQU		  40H		  	;中断中检测到的霍尔值
				HOLL_TEMP				EQU		  41H		  	;霍尔的值
				R8							EQU			42H				;通用寄存器
				HD_HOLL_TMP			EQU			43H				;检测硬件时读的零时霍尔值
				HD_HOLL_VAL			EQU			44H				;检测硬件时读的确定的霍尔值
				LIMIT_I					EQU			45H				;最大工作电流
				ABS_LOW					EQU			46H				;ABS低参考电流
				ABS_HIGH				EQU			47H				;ABS高参考电流
				REF_LOW					EQU  	  48H			  ;最低限流工作电流值
				REF_HIGH				EQU	  	49H				;最高限流工作电流值
				I_BASIC			  	EQU			4AH				;电流偏置值
				I_REMAIN				EQU			4BH				;最大工作电流-当前工作电流
				PWM_INCR				EQU			4CH				;PWM_INCR每3次,PWM_VAL加1
				CHK_PLBM_SUM		EQU			4DH				;霍尔位置有问题累加器
				CHK_PLBM_CNT		EQU			4EH				;检查霍尔位置有问题计数器
				TIME_AUX1				EQU		  4FH				;主程序每循环16次加1(程序其他地方未用)
;-------------------------------------------------------------------------------
				TIME_AUX2				EQU			50H			  ;主程序每循环16次加1(程序其他地方未用)
				CRUISE_REG			EQU			51H				;巡航检测次数寄存器  	
				OUTSIG					EQU	    52H       ;转把电压经过处理后的电压
				BAT_LOW_CNT			EQU			53H 			;欠压计数器
				BAT_HIGH_CNT		EQU			54H				;过压计数器(超过43.6V)
				;------						   		55H				 -------------------------------------
				BAT_DOWN				EQU			56H       ;降压系数:	高于43.6V时=0,
																					;				    低于38.2V时为1EH,
																					;				    之间为小于43.6V的1.5倍
				TM_128_CNT			EQU			57H				;定时中断计数器
				CRUISE_CNT			EQU			58H				;成功检测到巡航开关的次数
				;------ 						  	59H				 -------------------------------------
				HOLL_CHAG_SUM		EQU			5AH				;霍尔位置错误累加器(堵转程序专用)
				TM_AFT_CHAG			EQU			5BH				;霍尔变化后计时器
				;------							  	5CH				 -------------------------------------
				LED_SET_NO			EQU			5DH				;LED闪烁设置次数
				LED_WORK_NO			EQU			5EH       ;LED已经完成次数计数器
				LED_DELAY				EQU			5FH       ;LED延时计数器
;-------------------------------------------------------------------------------
				LOW_LIMIT_UP		EQU			60H				;当前电流超过最低限流电流值,低于将置零
				TM_LOCK_128			EQU			61H				;霍尔锁定计时器,每单位128uS
				TM_CHAG_128			EQU			62H				;霍尔变化计时器,每单位128uS
				TM_LOCK_32			EQU			63H				;霍尔锁定计时器,每单位32mS																					
				TM_CHAG_32			EQU			64H				;霍尔变化计时器,每单位32mS
				BRAKE   				EQU     65H				;刹车采样电压
				VOLTAGE  				EQU     66H				;电池电压寄存器
				TURNER					EQU			67H       ;转把采样电压
				CURRENT					EQU			68H				;电流采样电压
				R9							EQU			69H				;
				ABS_NOSIG_CNT		EQU			6AH				;无ABS刹车信号计数器
				ABS_BREAK_REG		EQU			6BH				;ABS刹车PWM增减计数器
;-------------------------------------------------------------------------------
				ABS_BREAK_OFF	MACRO											;宏定义,关闭ABS刹车
				        			BSF    STATUS, RP0        ;选择BANK1
        							BSF    PORTB, 1           ;RB1=1,置为输入口,拉高PB1
        							BCF    STATUS, RP0        ;选择BANK0
											ENDM
;-------------------------------------------------------------------------------
				ABS_BREAK_ON	MACRO										  ;宏指令,启动ABS刹车
				        			BSF    STATUS, RP0				;BANK=1
        							BCF    PORTB, 1						;设PB口为输出口
        							BCF    STATUS, RP0				;BANK0
        							BCF    PORTB, 1						;PB1清零
											ENDM
;-------------------------------------------------------------------------------
	    	ORG    0000H
        GOTO   START
			  ORG    0004H
        GOTO   INTERRUPT			 ;中断入口
;*******************************************************************************
;																程序开始
;*******************************************************************************
				ORG    0010H
START:
        CALL   RESET           	;START程序初始化														
        CLRWDT
        CALL   DELAY           	;主程序延时																	
        CLRWDT
        CALL   SET_MOS_INIT 		;建立上桥MOS管的工作环境后关闭所有MOS管		
        CALL   BASIC_ISET      	;基准电流设定 							 
        CALL   WORK_MODE     	  ;工作模式设定										
        												;1)霍尔角度
        												;2)限流模式
        												;3)转把极性
        												;4)刹车极性
        CALL   CHECK_HARDWARE   ;检测MOS管/霍尔好坏(霍尔检测第2次尚未清楚)
        CALL   U_READ  			 		;电池电压采样,VOLTAGE为电池电压寄存器    							
        CLRWDT
        CALL   BRAKE_READ       ;刹车电压采样,BRAKE为刹车电压寄存器    							
        MOVLW  88H							;1000,1000
        MOVWF  ADCON0          	;恢复到通道1电池电压采样
        BSF    ADCON0, ADON    	;允许AD转换
        BSF    INTCON, GIE     	;开总中断
MAIN:
        CALL   MAX_ISET         ;根据配置,设定过流大小值
        CALL   WORK_ISET        ;根据工作电压等,设定当前最大电流值
        BTFSS  TIME32_FG				;16M晶振,500nS TM0时钟,中断周期128uS,
        												;TIME32_FG周期32.768mS
        GOTO   MAIN            	;时间未到,小循环
        CALL   ABS_CRUISE_CHK   ;定时中断时间到,检查ABS_CRUISE信号
        CALL   TURN2PWM         ;检测转把电压,查表得到PWM值
        CLRF   PCLATH
        CALL   BATTART_CHK      ;检查电池电压
        CALL   TIME_SCHEME      ;时钟安排
        CALL   LED             	;LED指示程序
        GOTO   MAIN            	;进入循环
;*******************************************************************************
;                            转把电压-PWM对应表
;*******************************************************************************
OUT_TABLE:
        MOVWF  PCL
        RETLW  08H		;8			3.14%			1
        RETLW  08H		;8			3.14%			2
        RETLW  0CH		;12			4.71%			3
        RETLW  10H		;16			6.27%			4
        RETLW  14H		;20			7.84%			5
        RETLW  18H		;24			9.41%			6
        RETLW  1CH		;28			10.98%		7
        RETLW  20H		;32			12.55%		8
        RETLW  24H		;36			14.12%		9
        RETLW  28H		;40			15.69%		10
        RETLW  2CH		;44			17.25%		11
        RETLW  30H		;48			18.82%		12
        RETLW  34H		;52			20.39%		13
        RETLW  38H		;56			21.96%		14
        RETLW  3CH		;60			23.53%		15
        RETLW  41H		;65			25.49%		16
        RETLW  46H		;70			27.45%		17
        RETLW  4BH		;75			29.41%		18
        RETLW  53H		;83			32.55%		19
        RETLW  5AH		;90			35.29%		20
        RETLW  61H		;97			38.04%		21
        RETLW  68H		;104		40.78%		22
        RETLW  70H		;112		43.92%		23
        RETLW  78H		;120  	47.06%		24
        RETLW  80H		;128		50.20%		25
        RETLW  88H		;136		53.33%		26
        RETLW  90H		;144		56.47%		27
        RETLW  98H		;152		59.61%		28
        RETLW  0A0H		;160		62.75%		29
        RETLW  0A8H		;168		65.88%		30
        RETLW  0B0H		;176		69.02%		31
        RETLW  0B8H		;184		72.16%		32
        RETLW  0C0H		;192		75.29%		33
        RETLW  0C7H		;199		78.04%		34
        RETLW  0CDH		;205		80.39%		35
        RETLW  0D3H		;211		82.75%		36
        RETLW  0D9H		;217		85.10%		37
        RETLW  0DEH		;222		87.06%		38
        RETLW  0E2H		;226		88.63%		39
        RETLW  0E6H		;230		90.20%		40
        RETLW  0EAH		;234		91.76%		41
        RETLW  0F0H		;240		94.12%		42
        RETLW  0F5H		;245		96.08%		43
        RETLW  0FAH		;250		98.04%		44
        RETLW  0FFH		;255		100%			45
        RETLW  0FFH		;255		100%			46
        RETLW  0FFH		;255		100%			47
;*******************************************************************************
;													根据转把电压查表输出PWM信号
;正极性电压小于0.63V,负极性电压大于4.2V,将清零巡航运行标志标志。(程序次序有错);
;有巡航标志,不再处理转把电压;
;转把电压低于1.15V,视为低转把电压,清除各种标志位;
;转把电压高于2.9V,视为高转把电压,直接输出0FFH给OUTSIG;
;电压在1.15-2.9V之间,按超过部分的1/2为查表指针,查表OUT_TABLE输出给OUTSIG
;(查表期间禁止中断)
;最后在输出信号给VOL2PWM之前,需要进一步检查并处理(待详细研究)。
;*******************************************************************************
TURN2PWM:
        BTFSC  LOW_BAT       				;
        GOTO   OUTPUT_EXIT          ;LOW_BAT=1,为欠压,返回
        BTFSC  LM358_ERR     				;
        GOTO   OUTPUT_EXIT          ;LM358_ERR=1,为LM358故障,返回
        BTFSC  ABS_BREAK_FG					;
        GOTO   STOP_CRUISE					;ABS刹车标志位=1,GOTO STOP_CRUISE
        MOVF   TURNER, 0						;读取转把电压到R2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -