📄 pic16c72_ebike.asm
字号:
;*******************************************************************************
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 + -