網路城邦
上一篇 回創作列表 下一篇  字體:
步進馬達之追日系統
2013/01/14 03:07:29瀏覽1007|回應0|推薦1

/*-----------------------------------------------

  名稱:步進馬達之追日系統

  編寫:PETER YANG

  日期:2013.01.14

  內容:使用80C52設計一組用步進馬達來定時旋轉固定角度的太陽能板追日系統,使用之步進馬達為512步進/圈,在完成指定的終點角度後,自動回覆至起始點,根據使用之步進馬達來計算,每個步進將旋轉軸心0.703125°度,為了讓每次旋轉更為精準,期望每定時旋轉的步進數為4相的整數步進,如根據過去國內研究太陽能板發電的效率的數據,當太陽能板能夠保持與太陽運行角度垂直時,其發電功率為最大,而固定仰角架設25度傾斜基座時,其發電效率與追日系統之差異有最少10~12%,如果能夠用簡單低成本的追日系統來提升每日之發電功率,那麼相對的也可以提早回收太陽能板發電系統架設之成本回收.

實驗中使用每個步進旋轉0.703125°角度的步進馬達,為了方便程式設計,每次用4相為整數的規劃,也就是說最少每次朝一個方向旋轉2.8125°度,如果每日時段含蓋AM 6:00~PM 18:00共12時段來控制,而每時段再用28個步進,那麼每個時段就是旋轉19.6875°度,一個整日的白晝也將有236.25°度的幅度在運作,應該足以應付白天的日照時間.

    本程式只使用單相控制的方式,如需更細之旋轉角度,那可以用雙相電極的方式控制,

           那麼16個STEP就可以只旋轉4.5°度的要度.

                        STEP          度/STEP

               360        512            0.703125°

 

               STEP       度/單相           度/時段

               28         0.703125°     19.6875°

----------------------------------------------------------------------------------*/

      因為整體實驗程式包含了其他偵錯程式,所以在此只將主要修改之計時器中斷副程式陳述如下,本文屬於前一篇LY-51S 步進馬達正反轉綜合控制之延續,提供給有志研究89C51系列之同好做參考,

      原先LY-51S提供之配套程式,並不包含計算步進數動作之控制,所以加寫以下函數

 

timesw - 為累計步進馬達動作之步進數

timesx - 每時段將運轉的步進數28步進,

timesz - 符合時段數時之比對,

 

      因為此實驗所撰寫之程式,是預留將來自家加裝太陽能板發電設備時,可以考慮的的追日系統,所以只有就硬體電路與軟體程式兩個部份進行實驗,有關機構之設計只有構念,等待未來有初步的結構實品時,再分享之.

 

/*------------------------------------------------

                 計時器中斷副程式-1ms

------------------------------------------------*/

void Timer0_isr(void) interrupt 1

{

    static unsigned char times,i,k;

    TH0=(65536-1000)/256;         //重新賦值 1ms

    TL0=(65536-1000)%256;

     

    Display(0,8);

    if(StopFlag==0 && timesz==(time_buf1[5]%15)) //判斷啟動旗號與時段位置

  {    if(times==(20-Speed))       //最大值18,所以最小間隔值20-18=2

       {    times=0;k=i%4;           //取得步進馬達將動作相數

           if(!FrFlag)           //偵測正反轉旗號,FrFlag=0時為正轉

                   switch(k)

                  {    case 0:Coil_A1;i++;timesw--;break;      //正轉

                      case 1:Coil_B1;i++;timesw--;break;

                      case 2:Coil_C1;i++;timesw--;break;

                      case 3:Coil_D1;i++;timesw--;break;

                      case 4:i=0;break;

                      default:break;           }      

           if(FrFlag)

                   switch(k)     //偵測正反轉旗號,FrFlag=0時為反轉

                  {    case 0:Coil_D1;i++;timesw++;break;      //反轉

                      case 1:Coil_C1;i++;timesw++;break;

                      case 2:Coil_B1;i++;timesw++;break;

                      case 3:Coil_A1;i++;timesw++;break;

                      case 4:i=0;break;

                      default:break;           }      

           timesx--;

       }

       times++;    //

        if(timesx==0)            //如步進數為0時,

    {    StopFlag=1;           //暫停步進馬達

           StepCnt++;            //時段數加一

           if(StepCnt<13){     FrFlag=1;  }   //判別是否已至最後時段,

           if(StepCnt>13)    {     StepCnt=0;FrFlag=1;timesw=0;    }   //時段數超過

           timesx=28;

           timesz=StepCnt;

           if(StepCnt==13)    {    FrFlag=0;timesx=timesw;StepCnt=0;}   

           StopFlag=0;

       }

    }

}

( 興趣嗜好其他 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=PYANG&aid=7223261