PIC16F72單片機控制的電動自行車C源程序_第1頁
PIC16F72單片機控制的電動自行車C源程序_第2頁
PIC16F72單片機控制的電動自行車C源程序_第3頁
PIC16F72單片機控制的電動自行車C源程序_第4頁
PIC16F72單片機控制的電動自行車C源程序_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、/pic 16f72單片機控制的電動自行車c源程序,原理圖及設(shè)計說/pic16f72單片機控制的電動白行車駁動系統(tǒng)c程序#include <pic.h>電動車雙閉環(huán)程序,采用雙閉環(huán)方式控制電機,以得到最好的zh轉(zhuǎn)速性能,并且可以限制電機的最人電流。木應(yīng)用程序用到兩個ccp部件,其中ccp1用于pwm輸出,以 控/制電機電壓;ccp2用于觸發(fā)ad,定時器tmr2、tmr1, int中斷,rb 口電平變化中 斷,看門狗以及6個通用i/o 口#define and oxeo /狀態(tài)采集 5, 6, 7 位#dcfinc cura oxoa 電流環(huán)比例和積分系數(shù)之和#define curb

2、 0x09 電流環(huán)比例系數(shù)#define thl 0x6400 電流環(huán)授大輸出#define fullduty oxoff/占空比為1時的高電平時間#define spea oxld 轉(zhuǎn)速環(huán)比例和積分系數(shù)之和#dcfinc speb oxlc /轉(zhuǎn)速環(huán)比例系數(shù)#define gcurhilo oxo33o 轉(zhuǎn)速環(huán)最人輸出#define gcurh 0x33 最大給定電流#define gspeh 0x67 最大轉(zhuǎn)速給定#define tson ()x38 手柄開啟電壓1.1 v, tson*2為剎車后手柄開啟電壓,即/2.2 v#define volon 0x4c 低電壓保護重開電壓3.0 v

3、即33 v#define voloff 0x49 低電壓保護關(guān)斷電壓2.86 v即31.5 vvolatile unsigned char delayh,delayl,oldstate,speed,speedcount,tsh,count_ts,count_vol,gcur,currenth,voltage; 寄存器定義static bit sp 1 ,spc,ts,volflag,spcpid,lowpowcr,off,shutdown,curpid; / 標志位定義static volatile unsigned char new 10j=0xaf,0xbe,0xff,0x7e,0xcf,

4、0xff,0xd7,0x77,0xff,0xff; 狀態(tài)寄存器表/pic16f877初始化子程序void init877()portc=0x0ff; 關(guān)斷所有 mosfettrisc=0x02; 設(shè)置 c 口輸出pie 1=0x00;/中斷寄存器初始化,關(guān)斷所冇中斷trisa=0xcf; /設(shè)置 ra4,ra5 輸出tr1sb=oxef;/rb 口高三位輸入,采集電機三相的霍爾信號portc=newr(portb&and)>>5;/采集第一次崔爾信號,并輸出相應(yīng)的信號,導(dǎo)通 兩個mos管t2con=0x01;/tmr2 4 分頻ccprll=0x0ff;/初始時pwm 輸出

5、全高ccp1con=oxoff;/ccp1 設(shè)置為 pwm 方式ccp2con=oxob; /ccp2設(shè)置為特殊方式,以觸發(fā)adadcono=ox81;/ad時鐘為32分頻,fl. ad使能,選擇ano通道采集手 柄電壓tmr2=0x00; /tmr2寄存器初始化tmr1h=()x()(); /tmr1 寄存器初始化tmril=oxoo;t1con=oxoo;/tmr1 為 1 分頻ccpr2h=0x08;ccpr2l=0x00; /電流采樣周期設(shè)置為tad=512 u spr2=0xc7; /pwm 頻率設(shè)證為 5 khzadcon 1=0x02; /ad 結(jié)果左移option=oxfb;

6、/int 上升沿觸發(fā)tmr2on=1;/pwm 開始工作intcon=oxd& 中斷設(shè)置 gie=1,peie=1,rb1e=1adie=1;/ad中斷使能speedcount=oxoo; /轉(zhuǎn)速計數(shù)寄存器 spccd=0x7f; 轉(zhuǎn)速保持寄存器 spe=l; 低速標,忐位 spl = l; 低速標志位oldstate=oxoff; 初始狀態(tài)設(shè)置,區(qū)別于其他狀態(tài) count_ts=()x()8; /電流采樣8次採集1次手柄 count_vol=oxoo; /采樣256次手柄,采集1次電池電壓 ts=l;/nf以釆集手柄值的標店位adgo=1;/ad采樣使能tmr1on=1;/ccp2部

7、件開始工作/延時子程序#pragma intcrrupt_lcvcl 1void delay l(x)char x;delayh=x; 延時參數(shù)設(shè)置#asmdelay2 movlw 0x06movwf _delayldelay 1 decfsz _delaylgoto delay 1decfsz _delayhgoto delay2#en dasni/狀態(tài)采集子程序void samplc() char state i ,state2,state3,x;do x=l;state 1 =(portb &and); 霍爾信號采集delay l(x);state2=(portb&and

8、);while(statel-state2); 當三次采樣結(jié)果不相同時繼續(xù)采集狀態(tài) if(statel-oldstate!=0) /看本次釆樣結(jié)果是否厶/上次相同,不同 則執(zhí)行oldstate=state 1; 將本次狀態(tài)設(shè)置為ih狀態(tài)state 1 =(oldstate»5);portc=ncwstatcl;/c 口輸出相應(yīng)的信號觸發(fā)兩個mos管 if(spl=l) spc= 1 ;spl =0;else 如果轉(zhuǎn)速很低,則spe置1spe=0;spl=0;speedcount«= 1;statc3=(tmr 1 h»2); /否則,spc=0,計轉(zhuǎn)速 speed

9、=speedcount+state3; /speed 寄存器為每 256 us 力口 1 speedcount=0;/ad釆樣子程序void ad()char x;adif=0;清ad小斷標志位if(ts=l) 如果為手柄采樣,則采樣手柄值chs0=l; 選擇電流采樣通道count_vol=count_vol+1; /電池采樣計數(shù)寄存器 spepid=l; 置轉(zhuǎn)速閉環(huán)運算標志 ts=o;tsh=adresh; 存手柄值if(count_vol=0) /如果電池釆樣吋間到,則選擇an2通道,采集電池電壓 chs0=0;chs 1=1 ;volflag= 1 ;x= 1 ;delay l(x);a

10、dgo= 1;else if(volflag=l) 電池采樣完畢,進行相應(yīng)的處理chsl=0;chs0=1 ;volflag=0;voltago=adresh;lowpowcr=l;else /®則,中斷為采樣電流中斷 speedcount=speedcount+1; /speedcount 寄存器加 1,作為測錄轉(zhuǎn)速用 if(speedcount>0x3d) spl = l;/如果轉(zhuǎn)速低于 1 000000 p s/(512 u s*3eh*3) /則認為為低速狀態(tài)currenth=adresh;curpid=l;coiint_ts=count_ts-1;if(count_t

11、s=0) 如果手柄時間到,則轉(zhuǎn)入手柄采樣通道chs0=0;count_ts=0x08;ts= l;x=l ;delay 1 (x);adgo= 1;/剎車處理子程序void breakon0char x;off=0; /off清零,如果是干擾則不復(fù)位shutdown=0;if(rb0=l) 如果剎車信號為真,則停止輸出電壓adie=0; /關(guān) ad 中斷inte二0;/關(guān)剎車中斷ccpr1l=fullduty; 輸出電壓 0tmr1 on=0; 關(guān) ccp2,不再觸發(fā) adfor(:adgo=i;) continue;/如正在采樣,貝u等待采樣結(jié)束adif=0; /adif 位清零chs()=

12、(); 選擇通道()采樣乎柄chs 1=();x=l;delay l(x);do adgo= 1;for(;adif=();)continue;adif=0;ccpr1l=fullduty;asm(“clrwdt');tsh=(adresh»l);whilc(tsh>tsoniirbo=l); /當手柄值人于2.2 v或剎車仍iii繼續(xù)時,執(zhí)行以 上語句off=l;置復(fù)位標志/欠保護了程序void power()char x;lowpower=0;voltage»=l; /電壓值換為7位,以利于單字節(jié)運算 if(voltage<voloff) /電池電壓

13、小于3*k(v)時保護 adie=0;inte=0;tmr10n=0;ccpr1l=fullduty;for(;adgo= 1 ;)continue;ad1f=o;chso=o;chs1 = 1;x=l;delay l(x);doadgo=l;for(;adif=0;)continue;adif=o;voltage=(adresh» 1);ccpr1l=fullduty;asm(“clrwdt“);while(voltage<volon); /電池電壓小于35 v時繼續(xù)保護 off=l;/置復(fù)位標志/電流環(huán)運算子程序void curpk) static int curep=0x

14、00,curek=0x00,curuk=0x00;union data) int pwm;char a2;b;/定義電流環(huán)運算寄存器curpid=0; 清電流運算標志cuwp=curek*curb; /計算上一次偏差與比例系數(shù)的積 if(currenth<2)currenth=2; 如果采樣電流為零,則認為有一個小電流以利于 使轉(zhuǎn)速下降currcnth»=l;curek=gcur-currenth; / 計算木次偏差 curuk=curuk+curek*cura-curep; /按閉壞pi運算方式得到本次輸出結(jié)果, 而對結(jié)果進行處理if(curuk<0x00) 如果輸出小

15、于零,則認為輸出為零curuk=o;ccpr 1 l=fullduty;ccp 1 x=0;ccp 1 y=0;else if(curuk-thl>=0) 如果輸出大于限幅值,則輸出最大電壓 curuk=thl;ccpr 1 l=0;ccp 1 x=0;ccp 1 y=0;else /否則,按比例輸出相應(yīng)的高電平時間到ccpr1寄存器b.pwm=thl-curuk;b.pwm«=l;ccpr1 l=b.a 1 ; /ccpr1 l=(b.pwm»8)&()x()ff;將 pwm 寄存器的高半字節(jié) if(b.pwm&0x80!=0) ccp1x=1;el

16、se ccp1x=o;if(b.pwm&0x40!=0) ccp1y=1;else ccp1y=o;/轉(zhuǎn)速環(huán)運算子程序void spepi0 static int speep=0x00,speek=0x00,speuk=0x00;int tshl,speedl; /轉(zhuǎn)速寄存器定義 spepid=0; 清轉(zhuǎn)速運算標憑 if(spe=l) speed 1 =0x00; /若轉(zhuǎn)速太低,則認為轉(zhuǎn)速為零 else speed 1 =0x7f-speed; 否則計算實際轉(zhuǎn)速 if(speedl<0) speed 1=0;speep=speek*speb;tshl=tsh-ox38; /得到計

17、算用的手柄值speek=tshl-speed 1;if(tsh 1 <0) speuk=0;gcur=0; 當手柄值低于1.1 v時,則認為手柄給定為零 clse否則,計算相應(yīng)的轉(zhuǎn)速環(huán)輸出 if(tshl>=gspeh)/限制最大轉(zhuǎn)速tshl 二gspeh;speuk=speuk+speek*spea-speep; 計算得轉(zhuǎn)速環(huán)輸出 if(speuk<=0x00) speuk=0x00;gcur=0x00;轉(zhuǎn)速壞輸出處理 else if(speuk>gcurhilo) 轉(zhuǎn)速環(huán)輸岀限制,即限制最人電流約12a speuk=gcurhilo;gcur=gcurh;else

18、調(diào)速狀態(tài)吋的輸出gcur=(speuk»4)&0x0ff;/主程序main()for(;)init8770; 單片機復(fù)位后,先對其進行初始化off=0; 清復(fù)位標志for(;off=0;) /復(fù)位標志為零,則執(zhí)行下面程序,否則復(fù)位 if(curpid= 1) curpi(); 電流 pi 運算 else if(spcpid=l) spepi(); /轉(zhuǎn)速 pi 運算 else if(lowpower=l) power();else if(shutdown=l) breakon();asm(nclrwdtn);/中斷服務(wù)子程序#pragma interrupt_level 1v

19、oid interrupt ints(void)if(rbif=l) rbif=o;sample();else if(adif=l) ad();else if(intf=l) shutdown=l;intf=0; /剎車中斷來,置剎車標志設(shè)計思路:目的目前電動車市場各種功能無刷控制器琳瑯滿目,種類繁多。普通模擬專用芯片已是窮途末路, 而利用單片機控制則能做到“只有想不到,不怕做不到”地步,九花八門的單片機紛紛推向 電動車這個新興的行業(yè)。我公司根據(jù)電動車市場的流行趨勢,制定了無刷控制器的設(shè)計方案。 功能概述冃前電動車市場上的控制器分冇刷控制器和無刷控制器兩大類,rh于冇刷電機輸出扭距小, 效率低

20、,需要定期更換炭刷等諸多缺點而逐步被輸出扭距大、效率高、使川壽命長的無刷電 機取代。根據(jù)電動車車型分簡易車和豪華車型以及電動摩托車,簡易車功率一般在250w以 下,而豪華車都在350w以上,設(shè)計時必須考慮。簡易車的常用功能冇1: 1助力、巡航、 電量及工作狀態(tài)顯示。工作模式有自動和手動切換兩種。豪華車型根據(jù)客八的隨意性有很多功能,主要有飛車保護、 軟abs剎車、反充電、雙動力(檔位切換)、電機鎖(關(guān)閉電源電機鎖定)等。為方便調(diào)試和防止非法解密,設(shè)計采用專用調(diào)試工具,外接一個帶有鍵盤和顯示器(數(shù)碼管) 的工具來設(shè)定一些基木參數(shù),如欠壓値、限流、相位選擇和工作電壓選擇等??梢岳脝纹?機內(nèi)部或外接

21、eeprom保存設(shè)置參數(shù)。通過該調(diào)試工具達到系列產(chǎn)品的通用性。主耍技術(shù)參數(shù)1基木功能1.1工作電壓鍵盤設(shè)定,分12、24、36、48、60、72v檔,根據(jù)輸入電壓采樣值,確定欠壓保護值,單 節(jié)電池保護電壓為10.5v±05v,低于該值關(guān)閉輸出。由于取樣電壓冇相應(yīng)的誤差,用鍵盤 應(yīng)可以微調(diào)。欠壓工作方式:當電源電壓低于設(shè)定值時,關(guān)閉輸出,當電源電壓滯回到大于 設(shè)定值2v時,開啟輸出。另一種方式為當電源電壓低于電池容量的50%吋,相應(yīng)縮減輸出 脈寬,以10個百分點逐減,到設(shè)定值時減為零即關(guān)閉輸出,滯回則相反。1.2調(diào)速電壓調(diào)速把輸出電壓范圍為14.2v,控制器起點電壓應(yīng)高于iv,控制器的

22、脈寬調(diào)制范圍應(yīng)設(shè) 定為1.383.8v,大于3.8v輸出為全打開。1.3剎車斷電分高電平、低電平和abs三種方式,高、低電平控制方式由鍵盤設(shè)定,abs單獨引腳控制, 該功能如不用時,i/o 口可以指定其它功能。1.4限流當取樣信號到達設(shè)定點時,采用對pwm進行遞減的方法,來減小電機電流,使輸出電流不 超過設(shè)定值。即最人輸出電流怛定在設(shè)定點。設(shè)定值由鍵盤設(shè)定,以便調(diào)試。1.5過流保護:由于mcu單片機a/d采樣速度的因素造成輸出電流大節(jié)設(shè)定值,在這種情況下,設(shè)定一個 保護值,關(guān)閉輸出,一般設(shè)定為大于限流值23a。此值應(yīng)由鍵盤設(shè)定。1.6堵轉(zhuǎn)保護限流值保持13秒后,關(guān)閉輸出。1.7相角選擇60度/120度選擇,鍵盤設(shè)定。1.81: 1助

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論