日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應(yīng)用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
單片機控制的電動自行車驅(qū)動系統(tǒng)
單片機控制的電動自行車驅(qū)動系統(tǒng)
 更新時間:2009-7-9 16:52:10  點擊數(shù):0
【字體: 字體顏色
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  0xe0       //狀態(tài)采集5,6,7位    #define CURA 0X0a       //電流環(huán)比例和積分系數(shù)之和#define CURB 0X09       //電流環(huán)比例系數(shù)#define THL  0X6400     //電流環(huán)最大輸出#define FULLDUTY 0X0FF  //占空比為1時的高電平時間#define SPEA 0X1d       //轉(zhuǎn)速環(huán)比例和積分系數(shù)之和#define SPEB 0X1c       //轉(zhuǎn)速環(huán)比例系數(shù)#define GCURHILO 0X0330 //轉(zhuǎn)速環(huán)最大輸出#define GCURH 0X33      //最大給定電流#define GSPEH 0X67      //最大轉(zhuǎn)速給定#define TSON 0X38       //手柄開啟電壓1.1 V,TSON*2為剎車后手柄開啟電壓,即                          //2.2 V#define VOLON 0X4c      //低電壓保護重開電壓3.0 V即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 sp1,spe,ts,volflag,spepid,lowpower,    off,shutdown,curpid;        //標志位定義static volatile unsigned char new[10]={0xaf,0xbe,0xff,0x7e,0xcf,    0xff,0xd7,0x77,0xff,0xff};  //狀態(tài)寄存器表//------------PIC16F877初始化子程序------------void INIT877(){       PORTC=0X0FF;            //關(guān)斷所有MOSFET    TRISC=0X02;         //設(shè)置C口輸出    PIE1=0X00;          //中斷寄存器初始化,關(guān)斷所有中斷    TRISA=0XCF;         //設(shè)置RA4,RA5 輸出    TRISB=0XEF;         //RB 口高三位輸入,采集電機三相的霍爾信號    PORTC=new[(PORTB&AND)>>5];  //采集第一次霍爾信號,并輸出相應(yīng)的信號,導(dǎo)通//兩個MOS管    T2CON=0X01;         //TMR2 4分頻    CCPR1L=0X0FF;       //初始時PWM輸出全高    CCP1CON=0X0FF;      //CCP1設(shè)置為PWM方式    CCP2CON=0X0B;       //CCP2設(shè)置為特殊方式,以觸發(fā)AD    ADCON0=0X81;            //AD時鐘為32分頻,且AD使能,選擇AN0通道采集手//柄電壓        TMR2=0X00;          //TMR2寄存器初始化    TMR1H=0X00;         //TMR1寄存器初始化    TMR1L=0X00;    T1CON=0X00;         //TMR1為1分頻    CCPR2H=0X08;    CCPR2L=0X00;            //電流采樣周期設(shè)置為TAD=512 μs    PR2=0XC7;           //PWM頻率設(shè)置為5 kHz    ADCON1=0X02;            //AD結(jié)果左移    OPTION=0XFB;            //INT上升沿觸發(fā)    TMR2ON=1;           //PWM開始工作    INTCON=0XD8;            //中斷設(shè)置GIE=1,PEIE=1,RBIE=1    ADIE=1;             //AD中斷使能    speedcount=0x00;        //轉(zhuǎn)速計數(shù)寄存器    speed=0x7f;         //轉(zhuǎn)速保持寄存器    spe=1;              //低速標志位    sp1=1;              //低速標志位    oldstate=0x0ff;     //初始狀態(tài)設(shè)置,區(qū)別于其他狀態(tài)    count_ts=0x08;      //電流采樣8次,采集1次手柄    count_vol=0x00;     //采樣256次手柄,采集1次電池電壓    ts=1;               //可以采集手柄值的標志位    ADGO=1;             //AD采樣使能    TMR1ON=1;           //CCP2部件開始工作}//------------延時子程序---------------#pragma interrupt_level 1void DELAY1(x)char x;{    DELAYH=x;           //延時參數(shù)設(shè)置#asmDELAY2  MOVLW   0X06    MOVWF   _DELAYLDELAY1  DECFSZ  _DELAYL    GOTO    DELAY1    DECFSZ  _DELAYH    GOTO    DELAY2#endasm}//-----------狀態(tài)采集子程序----------------------void sample(){    char state1,state2,state3,x;    do  {        x=1;        state1=(PORTB&AND);     //霍爾信號采集        DELAY1(x);        state2=(PORTB&AND);    }while(state1-state2);      //當(dāng)三次采樣結(jié)果不相同時繼續(xù)采集狀態(tài)    if(state1-oldstate!=0)      //看本次采樣結(jié)果是否與上次相同,不同//則執(zhí)行     {oldstate=state1;          //將本次狀態(tài)設(shè)置為舊狀態(tài)      state1=(oldstate>>5);      PORTC=new[state1];            //C口輸出相應(yīng)的信號觸發(fā)兩個MOS管      if(sp1==1){spe=1;sp1=0;}      else  {                   //如果轉(zhuǎn)速很低,則spe置1spe=0;sp1=0;        speedcount<<=1;        state3=(TMR1H>>2);      //否則,spe=0,計轉(zhuǎn)速        speed=speedcount+state3;    //speed寄存器為每256 μs加1      }      speedcount=0;    }}//-----------------AD采樣子程序----------------------void AD(){    char x;    ADIF=0;                 //清AD中斷標志位    if(ts==1){              //如果為手柄采樣,則采樣手柄值     CHS0=1;                    //選擇電流采樣通道     count_vol=count_vol+1; //電池采樣計數(shù)寄存器     spepid=1;              //置轉(zhuǎn)速閉環(huán)運算標志     ts=0;tsh=ADRESH;       //存手柄值     if(count_vol==0) { //如果電池采樣時間到,則選擇AN2通道,采集電池電壓        CHS0=0;CHS1=1;volflag=1;x=1;DELAY1(x);ADGO=1;      }    }    else if(volflag==1) {           //電池采樣完畢,進行相應(yīng)的處理       CHS1=0;CHS0=1;volflag=0;voltage=ADRESH;lowpower=1;    }    else    {                       //否則,中斷為采樣電流中斷      speedcount=speedcount+1;  //speedcount寄存器加1,作為測量轉(zhuǎn)速用      if(speedcount>0x3d)  sp1=1;   //如果轉(zhuǎn)速低于1 000 000 μs/(512 μs*3eh*3)                                      // 則認為為低速狀態(tài)      currenth=ADRESH;      curpid=1;      count_ts=count_ts-1;      if(count_ts==0) {         //如果手柄時間到,則轉(zhuǎn)入手柄采樣通道          CHS0=0;count_ts=0x08;ts=1;x=1;DELAY1(x);ADGO=1;        }     }}//-------------剎車處理子程序------------------void BREAKON(){    char x;    off=0;                  //off清零,如果是干擾則不復(fù)位    shutdown=0;    if(RB0==1)  {           //如果剎車信號為真,則停止輸出電壓    ADIE=0;             //關(guān)AD中斷        INTE=0;             //關(guān)剎車中斷        CCPR1L=FULLDUTY;        //輸出電壓0        TMR1ON=0;           //關(guān)CCP2,不再觸發(fā)AD        for(;ADGO==1;)  continue;//如正在采樣,則等待采樣結(jié)束        ADIF=0;             //ADIF位清零        CHS0=0;             //選擇通道0采樣手柄        CHS1=0;        x=1;DELAY1(x);        do  {            ADGO=1;            for(;ADIF==0;)continue;            ADIF=0;            CCPR1L=FULLDUTY;        asm("CLRWDT");            tsh=(ADRESH>>1);        }while(tsh>TSON||RB0==1);   //當(dāng)手柄值大于2.2 V或剎車仍舊繼續(xù)時,執(zhí)行以                                 //上語句        off=1;                  //置復(fù)位標志  }}//---------欠保護子程序-------------------void POWER(){    char x;    lowpower=0;    voltage>>=1;                    //電壓值換為7位,以利于單字節(jié)運算    if(voltage<VOLOFF) {            //電池電壓小于3*k(V)時保護    ADIE=0;        INTE=0;        TMR1ON=0;        CCPR1L=FULLDUTY;        for(;ADGO==1;)continue;        ADIF=0;        CHS0=0;CHS1=1;        x=1;DELAY1(x);        do{ADGO=1;            for(;ADIF==0;)continue;            ADIF=0;            voltage=(ADRESH>>1);            CCPR1L=FULLDUTY;        asm("CLRWDT");        }while(voltage<VOLON);  //電池電壓小于35 V時繼續(xù)保護        off=1;                  //置復(fù)位標志    }}//------------電流環(huán)運算子程序-----------------void CURPI(){   static int curep=0x00,curek=0x00,curuk=0x00;    union data{int pwm;        char a[2];}b;           //定義電流環(huán)運算寄存器    curpid=0;                   //清電流運算標志    curep=curek*CURB;           //計算上一次偏差與比例系數(shù)的積    if(currenth<2)currenth=2;       //如果采樣電流為零,則認為有一個小電流以利于//使轉(zhuǎn)速下降    currenth>>=1;    curek=gcur-currenth;            //計算本次偏差    curuk=curuk+curek*CURA-curep;       //按閉環(huán)PI運算方式得到本次輸出結(jié)果,下//面對結(jié)果進行處理    if(curuk<0x00) {                //如果輸出小于零,則認為輸出為零      curuk=0;CCPR1L=FULLDUTY;CCP1X=0;CCP1Y=0;        } else if(curuk-THL>=0)   {   //如果輸出大于限幅值,則輸出最大電壓            curuk=THL;CCPR1L=0;CCP1X=0;CCP1Y=0;        }else    {               //否則,按比例輸出相應(yīng)的高電平時間到CCPR1寄存器            b.pwm=THL-curuk;            b.pwm<<=1;            CCPR1L=b.a[1]; //CCPR1L=(b.pwm>>8)&0x0ff;將PWM寄存器的高半字節(jié)            if(b.pwm&0x80!=0) CCP1X=1;            else CCP1X=0;            if(b.pwm&0x40!=0) CCP1Y=1;            else CCP1Y=0;    }}//---------------轉(zhuǎn)速環(huán)運算子程序-----------------------void SPEPI(){   static int speep=0x00,speek=0x00,speuk=0x00;    int tsh1,speed1;                //轉(zhuǎn)速寄存器定義    spepid=0;                   //清轉(zhuǎn)速運算標志            if(spe==1)  speed1=0x00;        //若轉(zhuǎn)速太低,則認為轉(zhuǎn)速為零    else speed1=0x7f-speed;     //否則計算實際轉(zhuǎn)速    if(speed1<0) speed1=0;    speep=speek*SPEB;    tsh1=tsh-0x38;              //得到計算用的手柄值    speek=tsh1-speed1;    if(tsh1<0) {speuk=0;gcur=0;}    //當(dāng)手柄值低于1.1 V時,則認為手柄給定為零    else {                      //否則,計算相應(yīng)的轉(zhuǎn)速環(huán)輸出        if(tsh1>=GSPEH)         //限制最大轉(zhuǎn)速        tsh1=GSPEH;    speuk=speuk+speek*SPEA-speep;   //計算得轉(zhuǎn)速環(huán)輸出        if(speuk<=0X00) {speuk=0x00;gcur=0x00;}//轉(zhuǎn)速環(huán)輸出處理        else if(speuk>GCURHILO) {   //轉(zhuǎn)速環(huán)輸出限制,即限制最大電流約12 A            speuk=GCURHILO;gcur=GCURH;}        else        {                   //調(diào)速狀態(tài)時的輸出            gcur=(speuk>>4)&0x0ff;        }    }}//-----------主程序-------------------------main(){for(;;){        INIT877();              //單片機復(fù)位后,先對其進行初始化        off=0;                  //清復(fù)位標志        for(;off==0;)   {       //復(fù)位標志為零,則執(zhí)行下面程序,否則復(fù)位        if(curpid==1) CURPI();  //電流PI運算        else if(spepid==1)  SPEPI();    //轉(zhuǎn)速PI運算        else if(lowpower==1)    POWER();        else if(shutdown==1)    BREAKON();        asm("CLRWDT");    }  }}//---------中斷服務(wù)子程序---------------------#pragma interrupt_level 1void interrupt INTS(void){       if(RBIF==1) {RBIF=0;sample();}    else if(ADIF==1)    AD();    else if(INTF==1)    {shutdown=1;INTF=0;}    //剎車中斷來,置剎車標志}
  • 上一篇: 基于8xC749單片機的電動自行車智能充電器的設(shè)計與實現(xiàn)
  • 下一篇: 51蜂鳴器唱《祝你平安》(匯編)
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設(shè)備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責(zé)信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1