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

📄 x36vznys.asm

📁 电动车程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;****************************************************************
;程序名称: 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 + -