字體:小 中 大 | |
|
|
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; } } } |
|
( 興趣嗜好|其他 ) |