新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 16F876控制的電動自行車驅動系統源程序(2)

        16F876控制的電動自行車驅動系統源程序(2)

        作者: 時間:2012-09-11 來源:網絡 收藏

        ;****************剎車中斷服務程序***************

        本文引用地址:http://www.104case.com/article/148412.htm

        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

        ;程序結束

        ;程序結束

        ;程序結束

        ;程序結束

        ;程序結束

        ;程序結束

        ;程序結束

        ;程序結束

        ;程序結束



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 开远市| 临桂县| 宜君县| 财经| 襄垣县| 拉孜县| 长沙县| 海林市| 剑河县| 阿瓦提县| 江川县| 广河县| 白城市| 禹州市| 曲阳县| 铁岭市| 张家港市| 仁怀市| 怀集县| 禹城市| 高唐县| 德惠市| 新和县| 山丹县| 桐柏县| 乌海市| 鲁甸县| 新密市| 清河县| 弥渡县| 栾川县| 香河县| 乡城县| 岳西县| 毕节市| 玉龙| 镇江市| 佛山市| 略阳县| 阿拉善右旗| 永宁县|