久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機電動自行車控制系統
[打印本頁]
作者:
煙花盡頭
時間:
2016-6-5 13:26
標題:
單片機電動自行車控制系統
單片機電動自行車控制系統
單片機控制的電動自行車驅動系統
14.4.4 各部分程序
LIST P=16F876
#INCLUDE P16F876.INC
;以下采用塊定義的方法定義單片機內部寄存器
CBLOCK 0X20 ;自
定義寄存器從0X20開始
FLAG1 ;
FLAG1作為標志寄存器
VOLTAGEH ;電池電壓高位寄
存器
VOLTAGEL ;電池電壓低位寄
存器
TSH
;手柄電壓高位寄存器
TSL
;手柄電壓低位寄存器
STATE1 ;霍
爾信號采樣暫存器1
STATE2 ;霍
爾信號采樣暫存器2
STATE3 ;霍爾信號采樣暫
存器3
DELAY ;延
時計數器
COUNT_VOL ;低電壓采樣次數
計數器
ACCaLO ;
ACCa~ACCd為運算用的寄存器
ACCaHI
ACCbLO
ACCbHI
ACCcLO
ACCcHI
ACCdLO
ACCdHI
TEMP ;臨
時寄存器
TEMP1 ;臨
時寄存器(中斷用)
SIGN ;符
號寄存器
COUNT ;臨
時寄存器
W_STACK ;中
斷時用于暫存W寄存器值
ST_STACK ;中
斷時用于暫存STATUS寄存器值
ENDC
;***********標志寄存器位定義以及程序中常數定義***********
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種狀態,霍爾信號來自B口RB7、RB6、RB5,C口輸出低電
平有
;效,其中RC1,RC2不作為觸發電路輸出口,故表中使其為高電平
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
的霍爾信號對應電機狀態
RETLW 0X07E ;如霍爾信號為
0、1、1,則使RC0、RC7為低電平
RETLW 0X0CF ;如霍爾信號為
1、0、0,則使RC4、RC5為低電平
RETLW 0X0FF ;沒有為1、0、1
的霍爾信號對應電機狀態
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 ;輸出口,其它位
為觸發信號輸出
BCF STATUS,RP0 ;選
擇存儲體0
CLRF PIR1 ;清
所有中斷標志位
CLRF INTCON ;禁止所有中斷
MOVLW 0X01 ;設
置TMR2預分頻值為4
MOVWF T2CON
MOVLW FULLPWM ;初始化PWM工作循環寄存
器,使PWM占空比為1
MOVWF CCPR1L ;輸出電壓為零
MOVLW 0XFF ;設
置CCP1工作于PWM方式
MOVWF CCP1CON
MOVLW 0X0B ;
CCP2工作于特殊事件觸發方式,用作AD采樣周期寄存 MOVWF
CCP2CON ;器
MOVLW 0X081 ;選擇AD轉換時鐘
為32分頻,選擇AN0通道,并使AD
MOVWF ADCON0 ;轉換允許
CLRF TMR2 ;TMR2計數器清零
CLRF TMR1H ;TMR1計數器清零
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在下降沿產生中斷
BCF STATUS,RP0
CALL SAMPLE ;確定當前轉子位
置
CALL OUTPUT ;根據采得的狀態
值觸發相應的MOSFET
MOVLW 0X0D8 ;開總中斷、外圍
中斷、INT中斷和RB口電平變化中斷允
MOVWF INTCON ;許
BCF PIE2,CCP2IE ;CCP2中斷禁止
BSF PIE1,ADIE ;打開AD采樣中斷
CLRF FLAG1 ;清標志位寄存器
CLRF COUNT_VOL ;清電池電壓采樣計數器
BSF T1CON,TMR1ON ;開CCP2,對手柄
進行等間隔采樣
BSF T2CON,TMR2ON ;開CCP1
RETEST 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 COUNT
BREAK3 DECFSZ COUNT
GOTO BREAK3
BREAK5 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 PWM3
PWM2 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 ;返
回
;****************剎車中斷服務程序***************
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,RP0
POWER3 BTFSC ADCON0,GO ;正在進行AD采樣?
GOTO POWER3 ;是,等待AD采樣
完畢
BCF PIR1,ADIF ;清AD采樣中斷標
志位
BCF ADCON0,CHS0
BSF ADCON0,CHS1 ;選擇電壓采樣通
道
MOVLW 0X06 ;延
時等待通道轉換完成
MOVWF COUNT
POWER4 DECFSZ COUNT
GOTO POWER4
POWER6 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 DELAY
DEL1 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 DELAY
DEL2 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 TEMP1
AD5 DECFSZ TEMP1
GOTO AD5
BSF ADCON0,GO
AD6 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_B
CHEK_A BTFSS ACCaHI,7 ;ACCa為負?
RETLW 0 ;
ACCa和ACCb均為負,返回
GOTO NEG_A ;ACCa為負,取補
GOTO MAIN
END
;程序結束
復制代碼
單片機控制的電動自行車驅動系統.doc
2016-6-5 13:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
37 KB, 下載次數: 16, 下載積分: 黑幣 -5
作者:
雙贏電子
時間:
2016-6-6 16:46
這個資料太好了,技術貼頂貼
作者:
tieq1952
時間:
2017-12-14 08:44
很需要它
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩在线一区二区三区
|
亚州无限乱码
|
91精品国产综合久久久久久
|
久久国产免费
|
麻豆毛片
|
91精品久久久久久久久久
|
国产精品成人一区二区三区夜夜夜
|
激情五月婷婷综合
|
午夜在线观看视频
|
黄色大片免费网站
|
国产精品国产成人国产三级
|
一级毛片免费完整视频
|
国产中文字幕网
|
亚洲精品久久视频
|
免费在线观看一区二区三区
|
免费的一级视频
|
激情小视频
|
久久国产欧美日韩精品
|
国产区在线观看
|
日韩精品极品视频在线观看免费
|
亚洲精品乱码
|
天堂久久一区
|
国产在线精品一区二区三区
|
国产伦一区二区三区四区
|
日韩中文不卡
|
久久精品亚洲精品国产欧美
|
99久久精品国产一区二区三区
|
在线欧美a
|
免费看国产精品视频
|
中文字幕乱码一区二区三区
|
欧美综合视频
|
国产区在线
|
二区成人
|
欧美精品一区三区
|
中文字幕影院
|
天天夜夜人人
|
欧美一级免费片
|
三级在线观看
|
91久久久久
|
日本不卡一二三
|
国产精品日韩
|