16F876控制的电动自行车驱动系统源程序(2)
;****************刹车中断服务程序***************
BRAKE
CALL PUSH ;保存现场
BCF STATUS,RP0 ;回存储区0
BSF FLAG1,SHUTDOWN;置相应标志位
BCF INTCON,INTF ;清中断标志位
CALL POP ;恢复现场
RETFIE
;中断返回
;***************低电压保护处理子程序*****************
POWER
BCF FLAG1,LOWPOWER;清相应的标志位
MOVF VOLTAGEH,0
MOVWF ACCaHI
MOVF VOLTAGEL,0
MOVWF ACCaLO
MOVLW VOLOFFH
MOVWF ACCbHI
MOVLW VOLOFFL
MOVWF ACCbLO
CALL D_sub
BTFSC ACCbLO,7 ;判断当前电池电压值是否低于保护电压(32V)
RETURN ;不是,返回
BCF INTCON,INTE
BCF T1CON,TMR1ON ;关闭电流采样
MOVLW FULLPWM
MOVWF CCPR1L
BSF STATUS,RP0
BCF PIE1,ADIE ;禁止AD采样中断
BCF STATUS,RP0POWER3
BTFSC ADCON0,GO ;正在进行AD采样?
GOTO POWER3 ;是,等待AD采样完毕
BCF PIR1,ADIF ;清AD采样中断标志位
BCF ADCON0,CHS0
BSF ADCON0,CHS1 ;选择电压采样通道
MOVLW 0X06 ;延时等待通道转换完成
MOVWF COUNTPOWER4
DECFSZ COUNT
GOTO POWER4POWER6
BSF ADCON0,GO ;采样电池电压值
POWER5
BTFSS PIR1,ADIF ;采样完毕?
GOTO POWER5
BCF PIR1,ADIF ;清AD中断标志位
BCF STATUS,C
MOVF ADRESH,0 ;当前电压值送被加数
MOVWF ACCbHI
BSF STATUS,RP0
MOVF ADRESL,0
BCF STATUS,RP0
MOVWF ACCbLO
MOVLW VOLONH ;35V电压值送被加数
MOVWF ACCaHI
MOVLW VOLONL
MOVWF ACCaLO
CALL D_sub ;当前电压值减35,与重开电压进行比较
MOVLW FULLPWM
MOVWF CCPR1L
CLRWDT
BTFSC ACCbHI,7 ;当前电压值大于35?
GOTO POWER6 ;否,重新采样
BSF FLAG1,OFF ;是,置相应的标志位
RETURN
;返回
;***电机转子位置采样子程序,状态采样子程序,出口地址:STATE1***
SAMPLE
MOVLW AND ;读RB口
ANDWF PORTB,0 ;分离出有效信息
MOVWF STATE1 ;暂存状态值
MOVLW 0X08
MOVWF DELAYDEL1
DECFSZ DELAY ;延时6 μs
GOTO DEL1
MOVLW AND ;读RB口
ANDWF PORTB,0 ;分离出有效信息,并暂存
MOVWF STATE2
XORWF STATE1,0 ;与上一次状态值相异或
BTFSC STATUS,Z
RETURN ;两个状态值相等则返回
MOVLW 0X06 ;否则延时4 μs
MOVWF DELAYDEL2
DECFSZ DELAY
GOTO DEL2
MOVLW AND ;读RB口
ANDWF PORTB,0 ;提取有效信息并暂存
MOVWF STATE3
XORWF STATE1,0 ;与第一次状态相同吗?
BTFSC STATUS,Z
RETURN ;相同则返回
MOVF STATE2,0 ;否则再与第二次状态相比较
XORWF STATE3,0
BTFSS STATUS,Z
GOTO SAMPLE ;三次状态均不相同则重新采样
MOVF STATE2,0 ;第三次状态与第二次相同,则将正确状态赋予STATE1并
MOVWF STATE1 ;返回
RETURN
;************** MOSFET触发信号输出子程序**************
OUTPUT
SWAPF STATE1,1 ;STATE1寄存器高低半字节互换
BCF STATUS,C ;清C位,并将STATE1寄存器左移一位
RRF STATE1,0 ;将采样所得结果放至W低三位
CALL OUT_TABLE ;查表获得输出值
MOVWF PORTC ;将输出值输出至RC口
RETURN
;*************** RB口电平变化中断服务程序**************
SAMPRB
CALL PUSH ;现场保护
BCF STATUS,RP0
CALL SAMPLE ;采样RB口状态
CALL OUTPUT ;根据RB口状态触发相应的MOSFET
CALL POP ;恢复现场
BCF INTCON,RBIF ;清RB口电平变化中断标志
RETFIE
;中断返回
;************ AD采样中断服务程序***************
AD
CALL PUSH ;保护现场
BTFSC FLAG1,VOLTAGE ;是电压采样?
GOTO SET_VOL ;是,作相应的处理SET_TS
BCF ADCON0,CHS0 ;AD采样值是TS,则选择1采样通道
INCF COUNT_VOL ;电压采样周期寄存器值加1
BTFSS STATUS,Z ;电压采样周期到?
GOTO AD4
BCF ADCON0,CHS0 ;是,选择2采样通道
BSF ADCON0,CHS1
BSF FLAG1,VOLTAGE ;置相应的标志位
AD4
BCF PIR1,ADIF ;清AD中断标志
MOVF ADRESH,0 ;采样值送寄存器暂存
MOVWF TSH
BSF STATUS,RP0
MOVF ADRESL,0
BCF STATUS,RP0
MOVWF TSL
BSF FLAG1,PWM
BTFSS FLAG1,VOLTAGE ;是否需要进行电压采样?
GOTO AD6 MOVLW 0X05 ;是,延时后采样电压
MOVWF TEMP1AD5
DECFSZ TEMP1
GOTO AD5
BSF ADCON0,GOAD6
CALL POP ;恢复现场,中断返回
RETFIE
SET_VOL
BCF ADCON0,CHS1 ;如果采样值为电压值,则选择0通道
BCF ADCON0,CHS0
BCF PIR1,ADIF ;清中断标志位
BCF FLAG1,VOLTAGE ;清相应标志位
MOVF ADRESH,0 ;将采样结果放入被减数寄存器
MOVWF VOLTAGEH
BSF STATUS,RP0
MOVF ADRESL,0
BCF STATUS,RP0
MOVWF VOLTAGEL
BSF FLAG1,LOWPOWER;是,置相应标志位
CALL POP
;中断返回
RETFIE
;**************中断保护现场子程序******************
PUSH
MOVWF W_STACK ;暂存W寄存器
MOVF STATUS,0 ;暂存STATUS寄存器
MOVWF ST_STACK
RETURN ;子程序返回
;**************中断恢复现场子程序**************
POP
MOVF ST_STACK,0 ;恢复STATUS寄存器值
MOVWF STATUS
MOVF W_STACK,0 ;恢复W寄存器值
RETURN ;子程序返回
;**************初始化子程序****************
SETUP
MOVLW .15 ;初始化TEMP
MOVWF TEMP
MOVF ACCbHI,0 ;ACCb送ACCd
MOVWF ACCdHI
MOVF ACCbLO,0
MOVWF ACCdLO
CLRF ACCbHI ;清ACCb
CLRF ACCbLO
RETLW 0
;**********乘除法运算确定结果符号子程序**********
S_SIGN
MOVF ACCaHI,0 ;ACCaHI异或ACCbHI,结果送SIGN单元
XORWF ACCbHI,0
MOVWF SIGN
BTFSS ACCbHI,7 ;ACCb为负?
GOTO CHEK_A ;否,检查ACCa
CALL NEG_BCHEK_A
BTFSS ACCaHI,7 ;ACCa为负?
RETLW 0 ;ACCa和ACCb均为负,返回
GOTO NEG_A ;ACCa为负,取补
GOTO MAIN
END
;程序结束
;程序结束
;程序结束
;程序结束
;程序结束
;程序结束
;程序结束
;程序结束
;程序结束
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码