?? 16f876控制的電動(dòng)自行車驅(qū)動(dòng)系統(tǒng)源程序.c
字號(hào):
PWM3 MOVLW 0X0FF ;1.1 V對(duì)應(yīng)的采樣值補(bǔ)碼送加數(shù)
MOVWF ACCbHI
MOVLW 0X1F
MOVWF ACCbLO
CALL D_add ;TS-1.1V
CLRF ACCaHI ;系數(shù)K=56=38H送乘數(shù)
MOVLW 0X3F
MOVWF ACCaLO
CALL D_mpy ;得到放大128倍的低電平時(shí)間K*(TS-1.1V)
MOVF ACCcHI,0 ;將結(jié)果取出
MOVWF ACCaHI
MOVF ACCcLO,0
MOVWF ACCaLO
MOVLW 0X64 ;PWM周期T減去低電平時(shí)間,得到高電平時(shí)間
MOVWF ACCbHI
CLRF ACCbLO
CALL D_sub
BTFSC ACCbHI,7 ;低電平時(shí)間是否大于周期?
GOTO PWM2 ;是,輸出全壓
RLF ACCbLO ;否則,輸出與低電平時(shí)間對(duì)應(yīng)的高電平時(shí)間
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 ;返回
;****************剎車中斷服務(wù)程序***************
BRAKE CALL PUSH ;保存現(xiàn)場(chǎng)
BCF STATUS,RP0 ;回存儲(chǔ)區(qū)0
BSF FLAG1,SHUTDOWN;置相應(yīng)標(biāo)志位
BCF INTCON,INTF ;清中斷標(biāo)志位
CALL POP ;恢復(fù)現(xiàn)場(chǎng)
RETFIE ;中斷返回
;***************低電壓保護(hù)處理子程序*****************
POWER BCF FLAG1,LOWPOWER;清相應(yīng)的標(biāo)志位
MOVF VOLTAGEH,0
MOVWF ACCaHI
MOVF VOLTAGEL,0
MOVWF ACCaLO
MOVLW VOLOFFH
MOVWF ACCbHI
MOVLW VOLOFFL
MOVWF ACCbLO
CALL D_sub
BTFSC ACCbLO,7 ;判斷當(dāng)前電池電壓值是否低于保護(hù)電壓(32V)
RETURN ;不是,返回
BCF INTCON,INTE
BCF T1CON,TMR1ON ;關(guān)閉電流采樣
MOVLW FULLPWM
MOVWF CCPR1L
BSF STATUS,RP0
BCF PIE1,ADIE ;禁止AD采樣中斷
BCF STATUS,RP0
POWER3 BTFSC ADCON0,GO ;正在進(jìn)行AD采樣?
GOTO POWER3 ;是,等待AD采樣完畢
BCF PIR1,ADIF ;清AD采樣中斷標(biāo)志位
BCF ADCON0,CHS0
BSF ADCON0,CHS1 ;選擇電壓采樣通道
MOVLW 0X06 ;延時(shí)等待通道轉(zhuǎn)換完成
MOVWF COUNT
POWER4 DECFSZ COUNT
GOTO POWER4
POWER6 BSF ADCON0,GO ;采樣電池電壓值
POWER5 BTFSS PIR1,ADIF ;采樣完畢?
GOTO POWER5
BCF PIR1,ADIF ;清AD中斷標(biāo)志位
BCF STATUS,C
MOVF ADRESH,0 ;當(dāng)前電壓值送被加數(shù)
MOVWF ACCbHI
BSF STATUS,RP0
MOVF ADRESL,0
BCF STATUS,RP0
MOVWF ACCbLO
MOVLW VOLONH ;35V電壓值送被加數(shù)
MOVWF ACCaHI
MOVLW VOLONL
MOVWF ACCaLO
CALL D_sub ;當(dāng)前電壓值減35,與重開電壓進(jìn)行比較
MOVLW FULLPWM
MOVWF CCPR1L
CLRWDT
BTFSC ACCbHI,7 ;當(dāng)前電壓值大于35?
GOTO POWER6 ;否,重新采樣
BSF FLAG1,OFF ;是,置相應(yīng)的標(biāo)志位
RETURN ;返回
;***電機(jī)轉(zhuǎn)子位置采樣子程序,狀態(tài)采樣子程序,出口地址:STATE1***
SAMPLE MOVLW AND ;讀RB口
ANDWF PORTB,0 ;分離出有效信息
MOVWF STATE1 ;暫存狀態(tài)值
MOVLW 0X08
MOVWF DELAY
DEL1 DECFSZ DELAY ;延時(shí)6 μs
GOTO DEL1
MOVLW AND ;讀RB口
ANDWF PORTB,0 ;分離出有效信息,并暫存
MOVWF STATE2
XORWF STATE1,0 ;與上一次狀態(tài)值相異或
BTFSC STATUS,Z
RETURN ;兩個(gè)狀態(tài)值相等則返回
MOVLW 0X06 ;否則延時(shí)4 μs
MOVWF DELAY
DEL2 DECFSZ DELAY
GOTO DEL2
MOVLW AND ;讀RB口
ANDWF PORTB,0 ;提取有效信息并暫存
MOVWF STATE3
XORWF STATE1,0 ;與第一次狀態(tài)相同嗎?
BTFSC STATUS,Z
RETURN ;相同則返回
MOVF STATE2,0 ;否則再與第二次狀態(tài)相比較
XORWF STATE3,0
BTFSS STATUS,Z
GOTO SAMPLE ;三次狀態(tài)均不相同則重新采樣
MOVF STATE2,0 ;第三次狀態(tài)與第二次相同,則將正確狀態(tài)賦予STATE1并
MOVWF STATE1 ;返回
RETURN
;************** MOSFET觸發(fā)信號(hào)輸出子程序**************
OUTPUT SWAPF STATE1,1 ;STATE1寄存器高低半字節(jié)互換
BCF STATUS,C ;清C位,并將STATE1寄存器左移一位
RRF STATE1,0 ;將采樣所得結(jié)果放至W低三位
CALL OUT_TABLE ;查表獲得輸出值
MOVWF PORTC ;將輸出值輸出至RC口
RETURN
;*************** RB口電平變化中斷服務(wù)程序**************
SAMPRB CALL PUSH ;現(xiàn)場(chǎng)保護(hù)
BCF STATUS,RP0
CALL SAMPLE ;采樣RB口狀態(tài)
CALL OUTPUT ;根據(jù)RB口狀態(tài)觸發(fā)相應(yīng)的MOSFET
CALL POP ;恢復(fù)現(xiàn)場(chǎng)
BCF INTCON,RBIF ;清RB口電平變化中斷標(biāo)志
RETFIE ;中斷返回
;************ AD采樣中斷服務(wù)程序***************
AD CALL PUSH ;保護(hù)現(xiàn)場(chǎng)
BTFSC FLAG1,VOLTAGE ;是電壓采樣?
GOTO SET_VOL ;是,作相應(yīng)的處理
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 ;置相應(yīng)的標(biāo)志位
AD4 BCF PIR1,ADIF ;清AD中斷標(biāo)志
MOVF ADRESH,0 ;采樣值送寄存器暫存
MOVWF TSH
BSF STATUS,RP0
MOVF ADRESL,0
BCF STATUS,RP0
MOVWF TSL
BSF FLAG1,PWM
BTFSS FLAG1,VOLTAGE ;是否需要進(jìn)行電壓采樣?
GOTO AD6
MOVLW 0X05 ;是,延時(shí)后采樣電壓
MOVWF TEMP1
AD5 DECFSZ TEMP1
GOTO AD5
BSF ADCON0,GO
AD6 CALL POP ;恢復(fù)現(xiàn)場(chǎng),中斷返回
RETFIE
SET_VOL BCF ADCON0,CHS1 ;如果采樣值為電壓值,則選擇0通道
BCF ADCON0,CHS0
BCF PIR1,ADIF ;清中斷標(biāo)志位
BCF FLAG1,VOLTAGE ;清相應(yīng)標(biāo)志位
MOVF ADRESH,0 ;將采樣結(jié)果放入被減數(shù)寄存器
MOVWF VOLTAGEH
BSF STATUS,RP0
MOVF ADRESL,0
BCF STATUS,RP0
MOVWF VOLTAGEL
BSF FLAG1,LOWPOWER;是,置相應(yīng)標(biāo)志位
CALL POP ;中斷返回
RETFIE
;**************中斷保護(hù)現(xiàn)場(chǎng)子程序******************
PUSH MOVWF W_STACK ;暫存W寄存器
MOVF STATUS,0 ;暫存STATUS寄存器
MOVWF ST_STACK
RETURN ;子程序返回
;**************中斷恢復(fù)現(xiàn)場(chǎng)子程序**************
POP MOVF ST_STACK,0 ;恢復(fù)STATUS寄存器值
MOVWF STATUS
MOVF W_STACK,0 ;恢復(fù)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
;**********乘除法運(yùn)算確定結(jié)果符號(hào)子程序**********
S_SIGN MOVF ACCaHI,0 ;ACCaHI異或ACCbHI,結(jié)果送SIGN單元
XORWF ACCbHI,0
MOVWF SIGN
BTFSS ACCbHI,7 ;ACCb為負(fù)?
GOTO CHEK_A ;否,檢查ACCa
CALL NEG_B
CHEK_A BTFSS ACCaHI,7 ;ACCa為負(fù)?
RETLW 0 ;ACCa和ACCb均為負(fù),返回
GOTO NEG_A ;ACCa為負(fù),取補(bǔ)
GOTO MAIN
END ;程序結(jié)束
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -