<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> EDA開發應用 >> Keilc >> 正文

      直流電機控制Keil c51源代碼

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2011-3-3

      直流電機的開環控制Keil c51源代碼

      //-----------------------函數聲明,變量定義--------------------------------------------------------
      #include <reg51.h>
      #include <intrins.h>
      #include<ABSACC.H>  
      //-----------------------定義管腳--------------------------------------------------------
      sbit PWM=P1^0;             //PWM波形輸出
      sbit DR=P1^1;              //方向控制
      #define  timer_data  (256-100) //定時器預置值,12M時鐘是,定時0.1ms
      #define  PWM_T 100         //定義PWM的周期T為10ms
      unsigned char PWM_t;       //PWM_t為脈沖寬度(0~100)時間為0~10ms
      unsigned char PWM_count;   //輸出PWM周期計數
      unsigned char time_count;  //定時計數
      bit direction;             //方向標志為
      //--------------------------------------------------------------------------------------------------
      // 函數名稱:timer_init
      // 函數功能:初始化設施定時器
      //--------------------------------------------------------------------------------------------------
      void timer_init()
           {
         TMOD=0x22; /*定時器1為工作模式2(8位自動重裝),0為模式2(8位自動重裝) */
            PCON=0x00;
            TF0=0;
            TH0=timer_data;   //保證定時時長為0.1ms
            TL0=TH0;
            ET0=1;
         TR0=1;            //開始計數
            EA=1;             //中斷允許
         }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱:setting_PWM
      // 函數功能:設置PWM的脈沖寬度和設定方向
      //--------------------------------------------------------------------------------------------------
      void setting_PWM()
            {
         if(PWM_count==0)  //初始設置
         {
         PWM_t=20;
         direction=1;
         }
         }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱:IntTimer0
      // 函數功能:定時器中斷處理程序
      //--------------------------------------------------------------------------------------------------
      void IntTimer0() interrupt 1
                    {
           time_count++;
                    DR=direction;
           if(time_count>=PWM_T)
                    {
           time_count=0;
           PWM_count++;
           setting_PWM();  //每輸出一個PWM波調用一次
           }
           if(time_count<PWM_t)
           PWM=1;
           else
           PWM=0;
           }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱:main
      // 用戶主函數
      // 函數功能:主函數
      //--------------------------------------------------------------------------------------------------
      void main()
           {
        timer_init();
        setting_PWM();
        }


      直流電機閉環控制Keil c51源代碼

      //-----------------------函數聲明,變量定義--------------------------------------------------------
      #include <reg51.h>
      sbit INT_0 =P3^2;              // 將p3.2外部中斷0
      sbit pulse_A=P1^2;               // P1.2為脈沖A輸入
      sbit PWM=P1^0;                   //PWM波形輸出
      sbit DR=P1^1;                    //方向控制
      //-----------------------預定義值--------------------------------------------------------
      #define PWM_T 1800              //定義PWM的周期T為18ms
      #define Ts    1000              //定義光電編碼器采樣時間為10ms
      #define  timer_data  (256-10) //定時器預置值,12M時鐘是,定時0.01ms
      //-----------------------預設定值--------------------------------------------------------
      bit direction;                  //方向標志位               用戶設定
      unsigned char R;                //需要得到的直流電機轉速   用戶設定
      //-----------------------實際運行狀態--------------------------------------------------------
      bit real_direction;             //電機實際運行方向  
      unsigned char Rr;               //直流電機實際轉速
      //-----------------------計算所得補償狀態------------------------------------------
      bit    compensate_polarity;     //補償極性
      unsigned char dR;               //轉速補償
      //-----------------------經補償后得到的脈寬------------------------------------------
      unsigned char PWM_t;            //PWM_t為脈沖寬度(320~400)時間為3.2~4.0ms
      unsigned char PWM_count;        //輸出PWM周期計數
      //-----------------------各中間計數值------------------------------------------
      unsigned char pulseB_count;     //脈沖計數
      unsigned char time0_count;      //定時計數
      unsigned char time1_count;      //定時計數
      //--------------------------------------------------------------------------------------------------
      // 函數名稱:timer_init
      // 函數功能:初始化設置定時器
      //--------------------------------------------------------------------------------------------------
      void timer_init()
           {
         TMOD=0x22; /*定時器1為工作模式2(8位自動重裝),0為模式2(8位自動重裝) */
            PCON=0x00;
            TF0=0;
            TH0=timer_data;   //保證定時時長為0.01ms
            TL0=TH0;
         TH1=timer_data;   //保證定時時長為0.01ms
            TL1=TH0;
            ET0=1;            //定時器0中斷允許
         TR0=1;            //定時器0開始計數
         ET1=1;            //定時器1中斷允許
         TR1=1;            //定時器1開始計數
            EA=1;             //中斷允許
         }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱: INT0_init()
      // 函數功能: 初始化設置
      //            設定INT0的工作方式
      //--------------------------------------------------------------------------------------------------
      void INT0_init(void ) 
                   {
          pulseB_count=0;        //脈沖計數器清零
                    IT0=1;     //選擇INT0為沿觸發方式
                    EX0=1;     //外部中斷允許
                    EA=1;      //系統中斷允許
                    }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱:setting_PWM
      // 函數功能:設置PWM的脈沖寬度和設定方向
      //--------------------------------------------------------------------------------------------------
      void setting_PWM()
            {
       // direction=1;  //設定轉動方向
       // R=540;        //設定轉速
       // dR=0;         //轉速補償為零
       // calculate_PWM_t();      //重新計算脈寬
         }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱: calculate_PWM_t
      // 入口參數: R需要得到的直流電機轉速,dR轉速補償
      // 出口參數: PWM_t為脈沖寬度(320~400)時間為3.2~4.0ms
      // 函數功能: 計算脈沖寬度,PWM_t=R/150;
      //--------------------------------------------------------------------------------------------------
      void calculate_PWM_t()
                    {
            if(compensate_polarity==1) //正補償
                     PWM_t=(R+dR)/150;
            else
             PWM_t=(R-dR)/150;        //負修正
            }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱: calculate_Rr
      // 入口參數: pulseB_count脈沖計數
      // 出口參數: Rr直流電機實際轉速
      // 函數功能: 計算實際轉速
      //--------------------------------------------------------------------------------------------------
      void calculate_Rr()
                    {
                     Rr=pulseB_count/6;
            }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱: compensate_dR
      // 入口參數: Rr直流電機實際轉速
      //            R需要得到的直流電機轉速
      // 出口參數: dR轉速補償
      // 函數功能: 計算實際補償值和補償極性 ,根據不同的補償算法重新設計
      //--------------------------------------------------------------------------------------------------
      void compensate_Rr()
                    {
                    Rr=1;
                    if(Rr>R)
            compensate_polarity=0;     //補償極性
           else
                     compensate_polarity=1;
            }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱: INT0_intrupt
      // 函數功能: 外部中斷0處理程序
      //--------------------------------------------------------------------------------------------------
      void INT0_intrupt() interrupt 0 using 1
              {
        pulseB_count++;
              if(pulse_A==0)
                {  
                real_direction=1;  //若P1.2為低電平,則電機為正轉,計數器N的值加1
                }
              else                //若為高電平,則電機為反轉,計數器N值減l。
                 {
                  real_direction=1;
                }
      }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱:IntTimer0
      // 函數功能:定時器中斷處理程序
      //--------------------------------------------------------------------------------------------------
      void IntTimer0() interrupt 1
                    {
           time0_count++;
                    DR=direction;
           if(time0_count>=PWM_T)
                    {
           time0_count=0;
           PWM_count++;
           setting_PWM();  //每輸出一個PWM波調用一次
           }
           if(time0_count<PWM_t)
           PWM=1;
           else
           PWM=0;
           }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱:IntTimer1
      // 函數功能:定時器中斷處理程序
      //--------------------------------------------------------------------------------------------------
      void IntTimer1() interrupt 3
                    {
           time1_count++;
           if(time1_count==1)
                    {
           INT0_init();           //初始化外部中斷設置
           }
           if(time1_count>=Ts)
           {
           time1_count=0;          //一個補償周期結束,計數器清零
           calculate_Rr();         //計算實際轉速
           compensate_Rr();        //計算實際補償值和補償極性
           calculate_PWM_t();      //重新計算脈寬
           }
           }
      //--------------------------------------------------------------------------------------------------
      // 函數名稱:main
      // 用戶主函數
      // 函數功能:主函數
      //--------------------------------------------------------------------------------------------------
      void main()
           {
           direction=1;  //設定轉動方向
        R=540;        //設定轉速
        dR=0;         //轉速補償為零
        calculate_PWM_t();      //重新計算脈寬
        timer_init();
        }

      Tags:keilc,直流電機控制  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      推薦文章
      最新推薦
      熱門文章
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 亚洲 欧洲 日韩 综合在线| 六月丁香婷婷综合| 久久综合综合久久综合| 亚洲综合无码AV一区二区| 国产婷婷综合在线视频| 国产色产综合色产在线观看视频| 伊人婷婷综合缴情亚洲五月| 国产一级a爱做综合| 国产综合免费精品久久久| 色欲综合一区二区三区| 亚洲AV综合色区无码一二三区 | 六月丁香激情综合成人| 久久亚洲高清综合| 色妞色综合久久夜夜| 国产成人综合久久精品亚洲| 综合人妻久久一区二区精品| 亚洲国产亚洲综合在线尤物| 伊人色综合九久久天天蜜桃| 尹人久久大香找蕉综合影院| 一本综合久久国产二区| 亚洲精品综合久久中文字幕| 婷婷久久综合九色综合绿巨人| 狼狼综合久久久久综合网| 综合久久久久久久综合网| 99久久国产综合精品1尤物| 亚洲国产成人久久综合一区77| 亚洲av日韩av综合| 狠狠色婷婷综合天天久久丁香| 激情综合婷婷丁香五月俺来也| 亚洲综合区图片小说区| 亚洲av一综合av一区| 亚洲婷婷五月综合狠狠爱| 亚洲国产免费综合| 一本色道久久鬼综合88| 综合激情区视频一区视频二区 | 色婷婷综合和线在线| 亚洲AV综合色区无码一区爱AV| 久久久久亚洲AV综合波多野结衣| 中文字幕久久综合| 狠狠做深爱婷婷综合一区| 伊人亚洲综合青草青草久热 |