📄 x36vznys.asm
字号:
;****************************************************************
;程序名称: 36V有刷智能控制器
;单片机 : PIC16F716 4M晶振
;功能 : 转把调速度,助力,定速,刹车
; 欠压保护,过流保护,限流保护
;编写日期:2006年9月21日
;****************************************************************
;list p = 16f716 ;4M晶振
#include"p16f716.inc"
;----------------------------------------------------------------
__CONFIG(0X1F76) ;配置位 WDT开 代码保护开
;-------------参数------------------------------------------------
#define QYDW 0x8F ;欠压值 ;0X8F
#define QYUP 0x98 ;欠压重开值 ;0X98
#define DLXZ 0x4a ;限制电流值
#define TSON 0x52 ;转把开启电压1.6V
#define YSTS 0x0C ;;转把有效确定延时计数次数
#define LOSTS 0xE5 ;转把掉线保护电压 4.4V
#define _BANK STATUS,5 ;BANK1,换页
;----------I/0--------------------------------------------------
#define PGL PORTB,0 ;过流检测 RB0
#define PDS PORTB,1 ;巡航 定速 RB1
#define PSC PORTB,2 ;刹车(低电平)RB2
#define PZL PORTA,2 ;助力(脉宽) RA2
;----------寄存器------------------------------------------------
;PWM
IN_PWM EQU 0X20 ;外设输入PWM(转把\助力)
PWM EQU 0X21 ;PWM脉宽输出
PWML EQU 0X22 ;PWM脉宽输出低2位
PWMH EQU 0X23 ;PWM脉宽输出高8位
;转把
TSS EQU 0X24 ;转把有效确定延时
TS_V EQU 0X25 ;转把采样电压
TS_PWS EQU 0X26
;电池电压
DC_V EQU 0X27 ;电池采样电压
DC_L EQU 0X28 ;电压高位
DC_H EQU 0X29 ;电压低位
DC_CONT EQU 0X2A ;电压采样次数
;电流
DL_V EQU 0X2B ;电流采样电压
DL_PWS EQU 0X2C
;助力
ZL_1S EQU 0X2D ;助力1.6S延时
ZL_TIM EQU 0X2E ;助力脉宽计数
ZL_TIM_H EQU 0X2F ;助力高脉宽计数
ZL_TIM_L EQU 0X30 ;助力低脉宽计数
ZL_HL EQU 0X31 ;助力中断值
ZL_V EQU 0X32 ;助力中断输出值
ZLTP EQU 0X33 ;助力处理缓冲
ZL_PWS EQU 0X34 ;助力PWM调整值
;定速
DS_TIM EQU 0X35 ;定速键延时
;AD中断
ADTP0 EQU 0X36 ;AD转换通道控制
ADTP1 EQU 0X37
;定时器1中断
TIMTP0 EQU 0X38 ;定时器1定时控制
TIMTP1 EQU 0X39
RS EQU 0X3A ;软件延时间
RSS EQU 0X3B ;软件延时间
;位定义
ADWEI EQU 0X3C ;AD位
PWMWEI EQU 0X3D ;PWM控制位
WEI EQU 0X3E
#define OFF PWMWEI,0 ;复位标志位
#define PWM_OUT PWMWEI,1 ;PWM输出标志位
#define INCPWM PWMWEI,2 ;加PWM
#define DECPWM PWMWEI,3 ;减PWM
#define DS_ON PWMWEI,4 ;定速度键有效标志
#define DS_DW PWMWEI,5 ;定速度键按下效标志
#define ZL_ON PWMWEI,6 ;助力模式启动
#define ZL_PZL PWMWEI,7 ;助力原来状态
#define TS_AD ADWEI,0 ;转把电压在转换
#define DC_AD ADWEI,1
#define DL_AD ADWEI,2
#define TS_OK ADWEI,3 ;转把电压在转换完毕
#define DC_OK ADWEI,4
#define DL_OK ADWEI,5
#define TS_YX ADWEI,6 ;转把开启
#define ZL_OK ADWEI,7 ;助力输出标志位
#define DS_OK WEI,0 ;定速度开启标志位
;#define ZL_SA WEI,1 ;助力开启速度
W_TEMP EQU 0X40 ;备份 W
STATUS_TEMP EQU 0X41 ;备份 STATUS
;****************************************************************
;----------------------------------------------------------------
; 开始程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0X00
CLRWDT ;清看门狗
GOTO MAIN
ORG 0X04
;--------------中断---------------------------------------------
BANKSEL W_TEMP ;中断
MOVWF W_TEMP ;备份 W
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP ;备份 STATUS
;中断向量
BTFSC PIR1,TMR1IF
GOTO INT_TMR1 ;Timer1中断
BTFSC PIR1,ADIF ;AD中断
GOTO INT_AD
BTFSC INTCON,INTF ;RB0/INT中断
GOTO INT_RB0 ;过电流中断
INT_RET CLRF STATUS ;恢复
SWAPF STATUS_TEMP,W ;还原 STATUS
MOVWF STATUS
SWAPF W_TEMP,F ;还原 W
SWAPF W_TEMP,W
RETFIE ;中断返回
;----------------------------------------------------------------
;Timer1中断
INT_TMR1
BCF PIR1,TMR1IF ;中断标志位清0
BCF T1CON,0 ;关Timer1
MOVLW 0XFE
MOVWF TMR1H
CLRF TMR1L ;512US
BSF ADCON0,GO ;开AD转换
BSF PWM_OUT ;PWM输出调整使能
CALL ZLJC ;助力脉宽检测
DECFSZ TIMTP0,F
GOTO INT_RTM
MOVLW 0X3C ;60次*512US=30MS
MOVWF TIMTP0
CALL ZLJCOUT ;助力输出控制
CALL CLDS ;定速键检测
INT_RTM
BSF T1CON,0 ;开Timer1
GOTO INT_RET
;----------------------------------------------------------------
;过流中断
INT_RB0
BCF INTCON,INTF ;清中断标志位
BTFSC PGL
GOTO INT_RBR
CALL DEC10US ;延时20US
CALL DEC10US
BTFSC PGL ;确定有过流
GOTO INT_RBR
INT_RB
BCF CCP1CON,4 ;关脉宽输出
BCF CCP1CON,5
CLRF CCPR1L
CLRWDT ;清看门狗
BCF INTCON,GIE ;关全局中断使能
BCF ADCON0,GO ;关AD转换
BCF TS_OK
BCF DL_OK
BCF DC_OK
BSF OFF ;置复位标志
BTFSS PGL
GOTO INT_RB ;还有过流
CALL DEC10MS ;确定是否还有过流
BTFSS PGL ;没有过流,退出
GOTO INT_RB
INT_RBR
GOTO INT_RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;================================================================
; 主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN
MOVLW 0XFF ;I/0初始化
MOVWF PORTB
movlw B'00000111' ;RB0-RB2为输入,RB3-RB7为输出
BSF _BANK
movwf TRISB
BCF _BANK
CLRF PORTA
movlw B'00001111' ;RA
BSF _BANK
movwf TRISA
BCF _BANK
RESET
BSF PORTB,3
CLRWDT ;清看门狗
CALL MST_REG
CALL MST_AD
CALL MST_TIMER1
CALL MST_PWM
CALL DEC10MS ;上电延时10M
DCJC
CLRWDT ;清看门狗
CLRF DC_H ;电池电压开启检测
CLRF DC_L
MOVLW 0X10
MOVWF DC_CONT
DCJC_0
MOVLW B'10011001'
MOVWF ADCON0 ;写入电压转换通道
CALL DEC10US ;延时10US
BSF ADCON0,GO ;开AD转换
DCJC_1
BTFSC ADCON0,GO
GOTO DCJC_1 ;等待转换完成
MOVF ADRES,W
ADDWF DC_L,F
BTFSC STATUS,C
INCF DC_H,F
DECFSZ DC_CONT,F
GOTO DCJC_0
MOVLW 0X04
MOVWF DC_CONT
DCJC_2
BCF STATUS,C
RRF DC_H,F
RRF DC_L,F
DECFSZ DC_CONT,F
GOTO DCJC_2
MOVLW QYUP ;电池开启电压
SUBWF DC_L,W
BTFSS STATUS,C
GOTO DCJC
CALL MST_INT ;中断配置
CALL DEC10MS ;延时20MS
CALL DEC10MS
BCF DS_ON
BCF DC_OK
BCF TS_OK
BCF DL_OK
BCF TS_YX
BCF PWM_OUT
CLRWDT ;清看门狗
;--------------------------------------------------------------------------------
;模式转换与控制
;助力模式: 助力有效ZL_ON置1(ZL_ON=1),此时转把无效
; ZL_OK位1.6S置1一次,主程序循环运行,在助力没有输出为0,PWM输出调整到0.
;电动模式: 在转把达到开启电压TSON,转把有效为TS_ON置1(TS_ON=1),转把采样完成,TS_OK=1.
; 在TS_ON=1,主程序进入电动模式运行.
;定速模式: 在电动模式下(TS_ON=1),定速键有效DS_ON=1,进入定速模式.在有刹车\欠压
; 或再次按下定速键退出定速模式.
;----------------------------------------------------------------------------------
;助力模式
ZLMOD
BTFSC ZL_ON ;助力开启?
GOTO ZLMOD0 ;是
BTFSC TS_YX ;转把是否有效?
GOTO DDMOD ;是,跳到电动模式
ZLMOD0
BTFSC PWM_OUT
CALL PWMOUT ;PWM输出
BTFSC ZL_OK
CALL CLZL ;助力信号处理
BTFSC DL_OK
CALL CLIN_PWM ;PWM加减调整(限流)
BTFSC DC_OK
CALL CLDC ;欠压检测
BTFSC OFF ;判断是否有复位标志位
GOTO RESET ;复位
BTFSS PSC ;刹车
CALL CLSC ;刹车处理程序
BTFSC OFF ;判断是否有复位标志位
GOTO RESET ;复位
CLRWDT ;清看门狗
BCF DS_OK ;关定速检测
GOTO ZLMOD ;继续循环
;电动模式
DDMOD
BTFSS TS_YX ;转把开启?
GOTO ZLMOD ;转把没有开启,跳到助力模式
BTFSS DS_ON
GOTO DDMOD0
BCF DS_ON
GOTO DSMOD
DDMOD0
BTFSC TS_OK
CALL CLZB
BTFSC DL_OK
CALL CLIN_PWM ;PWM加减处理
BTFSC PWM_OUT
CALL PWMOUT
BTFSC DC_OK
CALL CLDC
BTFSC OFF ;判断是否有复位标志位
GOTO RESET ;复位
BTFSS PSC ;刹车
CALL CLSC
BTFSC OFF ;判断是否有复位标志位
GOTO RESET ;复位
CLRWDT ;清看门狗
BSF DS_OK ;开启定速度检测
GOTO DDMOD ;继续循环
;定速模式
DSMOD
BTFSS DS_ON
GOTO DSMOD0
BCF DS_ON
GOTO DDMOD
DSMOD0
BTFSC DL_OK
CALL CLIN_PWM ;PWM加减处理
BTFSC PWM_OUT
CALL PWMOUT
BTFSC DC_OK
CALL CLDC
BTFSC OFF ;判断是否有复位标志位
GOTO RESET ;复位
BTFSS PSC ;刹车
CALL CLSC
BTFSC OFF ;判断是否有复位标志位
GOTO RESET ;复位
CLRWDT ;清看门狗
GOTO DSMOD ;继续循环
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;============================================================================
;----------------------------------------------------------------------------
;AD中断
;AD转换中断,由TIMER1中断启动(定时512US)
;AD转换对电流\转把\电池电压循环采样.
;电流采样8次转把采样一次,转把采样64次电池电压采样一次.
;----------------------------------------------------------------------------
INT_AD
BCF PIR1,ADIF ;清中断标志位
MOVF ADRES,W ;读出转换结果
BTFSC DL_AD
GOTO DL_ST
BTFSC TS_AD
GOTO TS_ST
BTFSS DC_AD
GOTO INT_AD0
DC_ST
MOVWF DC_V ;存入电压值
BSF DC_OK ;置转换完毕标志位
GOTO INT_AD0
DL_ST
MOVWF DL_V
BSF DL_OK ;置转换完毕标志位
GOTO INT_AD0
TS_ST
MOVWF TS_V
BSF TS_OK
MOVLW TSON ;转把启动电压
SUBWF TS_V,W
BTFSC STATUS,C ;C=1,TS_V>TSON,达到开启电压
GOTO TS_ST0
BCF TS_YX ;没有达到开启电压,清转把有效标志位
BCF TS_OK
MOVLW YSTS
MOVWF TSS
GOTO INT_AD0
TS_ST0
DECFSZ TSS,F ;延时TSS,确定转把准确的开启
GOTO INT_AD0
BSF TS_YX ;置转换开启标志位
INT_AD0
BCF TS_AD ;清转换标志位
BCF DL_AD
BCF DC_AD
DECFSZ ADTP0,F
GOTO DL_ZH
MOVLW 0X08 ;电流采样8次,转把采样一次
MOVWF ADTP0
DECFSZ ADTP1,F
GOTO TS_ZH
MOVLW 0X40 ;转把采样64次,电池电压采样一次
MOVWF ADTP1
DC_ZH
BSF DC_AD ;置转换标志
MOVLW B'10011001' ;相应的转换通道
GOTO INT_AD1
TS_ZH
BSF TS_AD
MOVLW B'10001001'
GOTO INT_AD1
DL_ZH
BSF DL_AD
MOVLW B'10000001'
INT_AD1
MOVWF ADCON0 ;写入转换通道
GOTO INT_RET
;----------------------------------------------------------------------------
;转把调速度运算
;转把有效电压1.6-4V采样82-204,差位122,
;PWM有效位0-240,则将转把采样值减82,再乘以2,即PWM=(TS_V-82)*2
;防断线电压4.6
;----------------------------------------------------------------------------
CLZB
BCF TS_OK
MOVF TS_V,W
MOVWF TS_PWS
MOVLW LOSTS ;防断线,4.6V
SUBWF TS_PWS,W ;TS_PWS<235,C=0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -