• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

    16F876控制的電動自行車驅動系統(tǒng)源程序(1)

    作者: 時間:2012-09-11 來源:網(wǎng)絡 收藏

    ;.

    本文引用地址:http://www.czjhyjcfj.com/article/148413.htm

    ;沒有鎖閉環(huán)程序。

    LIST P=

    #INCLUDE P.INC

    ;以下采用塊定義的方法定義單片機內部寄存器

    CBLOCK 0X20 ;自定義寄存器從0X20開始

    FLAG1 ;FLAG1作為標志寄存器

    VOLTAGEH ;電池電壓高位寄存器

    VOLTAGEL ;電池電壓低位寄存器

    TSH ;手柄電壓高位寄存器

    TSL ;手柄電壓低位寄存器

    STATE1 ;霍爾信號采樣暫存器1

    STATE2 ;霍爾信號采樣暫存器2

    STATE3 ;霍爾信號采樣暫存器3

    DELAY ;延時計數(shù)器

    COUNT_VOL ;低電壓采樣次數(shù)計數(shù)器

    ACCaLO ;ACCa~ACCd為運算用的寄存器

    ACCaHI

    ACCbLO

    ACCbHI

    ACCcLO

    ACCcHI

    ACCdLO

    ACCdHI

    TEMP ;臨時寄存器

    TEMP1 ;臨時寄存器(中斷用)

    SIGN ;符號寄存器

    COUNT ;臨時寄存器

    W_STACK ;中斷時用于暫存W寄存器值

    ST_STACK ;中斷時用于暫存STATUS寄存器值

    ENDC

    ;***********標志寄存器位定義以及程序中常數(shù)定義***********

    CONSTANT VOLTAGE=0 ;采電池電壓標志位

    CONSTANT PWM=1 ;輸出下一次PWM信號標志位

    CONSTANT LOWPOWER=2 ;低電壓標志位

    CONSTANT SHUTDOWN=3 ;剎車標志位

    CONSTANT OFF=4 ;復位標志位

    CONSTANT AND=0XE0 ;AND用于獲取有效霍爾信號

    CONSTANT FULLPWM=0XFF ;當PWM輸出全高時,輸入CCPR1L中的值

    CONSTANT VOLOFFH=0X02 ;當電池電壓低于24AH時, 低壓保護2.86 V/31.5 V

    CONSTANT VOLOFFL=0X4A

    CONSTANT VOLONH=0X02 ;當電池電壓大于266H時,允許電機重開3V/33V

    CONSTANT VOLONL=0X66

    CONSTANT TSONH=0X01 ;剎車后手柄復位值低于133H,則允許電機重新啟動

    CONSTANT TSONL=0X33

    ;***復位矢量入口(單片機復位時,PC指針指向程序存儲器0X0000單元)***

    ORG 0X0000

    START GOTO MAIN ;復位后程序進入主程序

    ;***中斷矢量入口程序(PIC單片機的中斷矢量入口為0X0004)***

    ORG 0X0004 ;中斷矢量入口

    BTFSC INTCON,RBIF ;是否為RB口電平變化中斷?

    GOTO SAMPLERB ;是,進入RB口電平變化中斷服務程序

    BTFSC PIR1,ADIF ;是否為AD采樣中斷

    GOTO AD ;是,進入AD中斷服務程序

    BTFSC INTCON,INTF ;是否為剎車中斷

    GOTO BRAKE ;是,剎車中斷處理

    RETFIE ;如都不是,則中斷返回

    ;************逆變橋輸出表*************

    ;逆變橋輸出表,其輸出對應6種狀態(tài),霍爾信號來自B口RB7、RB6、RB5,C口輸出低電平有

    ;效,其中RC1,RC2不作為觸發(fā)電路輸出口,故表中使其為高電平

    ORG 0X0020

    ;表程序從0X0020單元開始存放(也可以不從這開始)

    OUT_TABLE

    ADDWF PCL,1

    RETLW 0X0AF ;如霍爾信號為0、0、0,則使RC4、RC6為低電平

    RETLW 0X0BE ;如霍爾信號為0、0、1,則使RC0、RC6為低電平

    RETLW 0X0FF ;沒有為0、1、0的霍爾信號對應電機狀態(tài)

    RETLW 0X07E ;如霍爾信號為0、1、1,則使RC0、RC7為低電平

    RETLW 0X0CF ;如霍爾信號為1、0、0,則使RC4、RC5為低電平

    RETLW 0X0FF ;沒有為1、0、1的霍爾信號對應電機狀態(tài)

    RETLW 0X0D7 ;如霍爾信號為1、1、0則使RC3、RC5為低電平

    RETLW 0X077 ;如霍爾信號為1、1、1則使RC3、RC7為低電平

    ;***************主程序*****************

    ORG 0X0100 ;主程序從0X0100單元開始存儲

    MAIN

    MOVLW 0X0FF ;由于C口上電復位值不確定,必須先關閉所有MOS管

    MOVWF PORTC

    BSF STATUS,RP0 ;選擇存儲體1

    MOVLW 0X02 ;設置RC1為輸入口,其它為輸出口,其中RC2為PWM

    MOVWF TRISC ;輸出口,其它位為觸發(fā)信號輸出

    BCF STATUS,RP0 ;選擇存儲體0

    CLRF PIR1 ;清所有中斷標志位

    CLRF INTCON ;禁止所有中斷

    MOVLW 0X01 ;設置TMR2預分頻值為4

    MOVWF T2CON

    MOVLW FULLPWM ;初始化PWM工作循環(huán)寄存器,使PWM占空比為1

    MOVWF CCPR1L ;輸出電壓為零

    MOVLW 0XFF ;設置CCP1工作于PWM方式

    MOVWF CCP1CON

    MOVLW 0X0B ;CCP2工作于特殊事件觸發(fā)方式,用作AD采樣周期寄存

    MOVWF CCP2CON ;器

    MOVLW 0X081 ;選擇AD轉換時鐘為32分頻,選擇AN0通道,并使AD

    MOVWF ADCON0 ;轉換允許

    CLRF TMR2 ;TMR2計數(shù)器清零

    CLRF TMR1H ;TMR1計數(shù)器清零

    CLRF TMR1L

    CLRF T1CON ;TMR1預分頻為1,關閉振蕩器,工作于定時工作方式

    MOVLW 0X08 ;初始化AD采樣周期寄存器,T=512 μs

    MOVWF CCPR2H

    MOVLW 0X00

    MOVWF CCPR2L

    BSF STATUS,RP0 ;選擇存儲體1

    MOVLW 0XEF ;RB口高3位用于采樣霍爾信號,RB0為剎車中斷,設置為

    MOVWF TRISB ;輸入,其它未用

    MOVLW 0XC7 ;初始化PWM頻率為5 kHz

    MOVWF PR2

    MOVLW 0X082 ;AD采樣結果右移,RA口引腳均為模擬輸入

    MOVWF ADCON1

    BSF OPTION_REG,INTEDG ;選擇INT在下降沿產(chǎn)生中斷

    BCF STATUS,RP0

    CALL SAMPLE ;確定當前轉子位置

    CALL OUTPUT ;根據(jù)采得的狀態(tài)值觸發(fā)相應的MOSFET

    MOVLW 0X0D8 ;開總中斷、外圍中斷、INT中斷和RB口電平變化中斷允

    MOVWF INTCON ;許BCF

    PIE2,CCP2IE ;CCP2中斷禁止

    BSF PIE1,ADIE ;打開AD采樣中斷

    CLRF FLAG1 ;清標志位寄存器

    CLRF COUNT_VOL ;清電池電壓采樣計數(shù)器

    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 ;是,調用電壓保護子程序處理數(shù)據(jù)

    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值送被減數(shù)

    MOVWF ACCbHI

    BSF STATUS,RP0

    MOVF ADRESL,0

    BCF STATUS,RP0

    MOVWF ACCbLO

    MOVLW TSONH ;1.5 V所對應的采樣值送減數(shù)

    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

    ;返回

    ;***************開環(huán)PWM輸出子程序****************

    OUT_PWM

    BCF FLAG1,PWM ;清相應的標志位

    MOVF TSH,0 ;將調速手柄采樣值送至被加數(shù)

    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對應的采樣值補碼送加數(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倍的低電平時間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

    ;返回



    評論


    相關推薦

    技術專區(qū)

    關閉
    主站蜘蛛池模板: 禹城市| 教育| 炉霍县| 筠连县| 抚松县| 兰西县| 镇平县| 甘南县| 盘锦市| 沭阳县| 淅川县| 黔东| 石首市| 古丈县| 鄢陵县| 石台县| 宝应县| 龙里县| 丹棱县| 河西区| 宿迁市| 江口县| 石屏县| 夹江县| 云龙县| 柳河县| 黄骅市| 阿拉善左旗| 嘉善县| 金川县| 竹山县| 白玉县| 晋江市| 东阿县| 大埔县| 刚察县| 浦县| 永兴县| 罗田县| 抚远县| 盐亭县|