中断和RB口电平变化中断允
MOVWF INTCON ;许BCF
PIE2,CCP2IE ;CCP2中断禁止
BSF PIE1,ADIE ;打开AD采样中断
CLRF FLAG1 ;清标志位寄存器
CLRF COUNT_VOL ;清电池电压采样计数器
BSF T1CON,TMR1ON ;开CCP2,对手柄进行等间隔采样
BSF T2CON,TMR2ON ;开CCP1RETEST
BTFSS FLAG1,PWM ;TS采样完毕?
GOTO NEXT1 ;没有,转NEXT1
CALL OUT_PWM ;TS采样完毕,送出相应的PWM信号
BCF FLAG1,PWM ;清PWM允许标志NEXT1
BTFSS FLAG1,LOWPOWER;电压采样完毕?
GOTO NEXT2 ;没有转NEXT2
CALL POWER ;是,调用电压保护子程序处理数据
BTFSC FLAG1,OFF ;是否需要复位?
GOTO MAIN ;是,单片机复位NEXT2
BTFSS FLAG1,SHUTDOWN;刹车中断到来?
GOTO RETEST ;否,回转RETEST
CALL BRAKEON ;是,调用刹车处理子程序
CLRWDT BTFSC FLAG1,OFF ;OFF=0?
GOTO MAIN ;否,单片机复位
GOTO RETEST ;是,回转RETEST
;***************刹车处理子程序******************
BRAKEON
BCF FLAG1,OFF ;清复位标志
BCF FLAG1,SHUTDOWN;是,清相应标志位
BTFSS PORTB,0 ;INT引脚仍为1?
RETURN ;否,中断是由干扰引起的,返回
BSF STATUS,RP0 BCF PIE1,ADIE ;禁止AD采样中断
BCF STATUS,RP0 BCF INTCON,INTE ;关RB0中断
MOVLW FULLPWM ;PWM输出全高
MOVWF CCPR1L
BCF T1CON,TMR1ON ;关闭手柄采样BREAK2
BTFSC ADCON0,GO ;正在进行AD采样?
GOTO BREAK2 ;是,等待AD采样完毕
BCF ADCON0,CHS0
BCF ADCON0,CHS1 ;选择0采样通道,准备采样手柄电压
BCF PIR1,ADIF ;清AD采样中断标志位
MOVLW 0X06 ;延时
MOVWF COUNTBREAK3
DECFSZ COUNT
GOTO BREAK3BREAK5
BSF ADCON0,GO ;采样TS值BREAK4
BTFSS PIR1,ADIF ;采样完毕?
GOTO BREAK4
BCF PIR1,ADIF
BCF STATUS,C
MOVF ADRESH,0 ;当前TS值送被减数
MOVWF ACCbHI
BSF STATUS,RP0
MOVF ADRESL,0
BCF STATUS,RP0
MOVWF ACCbLO
MOVLW TSONH ;1.5 V所对应的采样值送减数
MOVWF ACCaHI
MOVLW TSONL
MOVWF ACCaLO
CALL D_sub ;当前TS值减1.5V
MOVLW FULLPWM
MOVWF CCPR1L
CLRWDT
BTFSS ACCbHI,7 ;当前电压值大于1.5V?
GOTO BREAK5 ;是,重新采样
BTFSC PORTB,0
GOTO BREAK5
BSF FLAG1,OFF ;否,置相应的标志位
RETURN
;返回
;***************开环PWM输出子程序****************
OUT_PWM
BCF FLAG1,PWM ;清相应的标志位
MOVF TSH,0 ;将调速手柄采样值送至被加数
MOVWF ACCaHI
MOVF TSL,0
MOVWF ACCaLO
MOVLW 0XFF ;FF1F补码为0XE1,即1.1 V
MOVWF ACCbHI
MOVLW 0X1F
MOVWF ACCbLO
CALL D_add
BTFSS ACCbHI,7 ;TS>1.1V?
GOTO PWM1 ;是,转PWM1
MOVLW FULLPWM ;否则输出全高
MOVWF CCPR1L
RETURN
PWM1
MOVLW 0XFD ;0X27B=3.1V
MOVWF ACCbHI
MOVLW 0X85
MOVWF ACCbLO
CALL D_add
BTFSC ACCbHI,7 ;TS>3.1V?
GOTO PWM3PWM2
CLRF CCPR1L
BCF CCP1CON,4
BCF CCP1CON,5
RETURN
PWM3
MOVLW 0X0FF ;1.1 V对应的采样值补码送加数
MOVWF ACCbHI
MOVLW 0X1F
MOVWF ACCbLO
CALL D_add ;TS-1.1V
CLRF ACCaHI ;系数K=56=38H送乘数
MOVLW 0X3F
MOVWF ACCaLO
CALL D_mpy ;得到放大128倍的低电平时间K*(TS-1.1V)
MOVF ACCcHI,0 ;将结果取出
MOVWF ACCaHI
MOVF ACCcLO,0
MOVWF ACCaLO
MOVLW 0X64 ;PWM周期T减去低电平时间,得到高电平时间
MOVWF ACCbHI
CLRF ACCbLO
CALL D_sub
BTFSC ACCbHI,7 ;低电平时间是否大于周期?
GOTO PWM2 ;是,输出全压
RLF ACCbLO ;否则,输出与低电平时间对应的高电平时间
RLF ACCbHI
MOVF ACCbHI,0 ;D10~D2位送CCPR1L
MOVWF CCPR1L
BCF CCP1CON,5 ;D0位送CCP1CON5
BTFSC ACCbLO,7
BSF CCP1CON,5
BCF CCP1CON,4 ;D.1位送CCP1CON4
BTFSC ACCbLO,6
BSF CCP1CON,4
RETURN
;返回
|