如上所述,太陽能自動跟蹤系統(tǒng)的軟件部分包含多個模塊,各模塊的啟動和停止由單片機(jī)控制。在程序設(shè)計時,將這些模塊的入口都安排在主程序中,主程序循環(huán)檢測通過串口接收的命令,通過對命令解釋,然后根據(jù)命令轉(zhuǎn)入相應(yīng)的模塊。程序流程圖如圖3.1。
系統(tǒng)軟件的設(shè)計主要是通過C語言編程實(shí)現(xiàn)單片機(jī)對步進(jìn)電機(jī)控制以及系統(tǒng)狀態(tài)的顯示。
系統(tǒng)通電后,首先對LCD,IO端口初始化,然后開中斷,此時系統(tǒng)開始工作,檢測當(dāng)前太陽位置,直到接收板對準(zhǔn)太陽,實(shí)現(xiàn)對太陽能全方位跟蹤。系統(tǒng)默認(rèn)時間是00:00,用戶可以根據(jù)當(dāng)?shù)貢r間調(diào)整系統(tǒng)時間。當(dāng)陰天時,太陽跟蹤系統(tǒng)檢測不到太陽,為了實(shí)現(xiàn)太陽一出來就能自動跟蹤太陽,系統(tǒng)時間每到12:00或18:00(也是太陽落山),系統(tǒng)自動控制接收板與大地垂直,這樣不管太陽在那個位置,接收板都能檢測到太陽。
圖中,啟動后首先進(jìn)行的初始化包括:對單片機(jī)本身的中斷和LCD液晶顯示器等的初始化。
系統(tǒng)采用光敏電阻光強(qiáng)比較法,設(shè)計出一種全新的光電轉(zhuǎn)換裝置,很好的實(shí)現(xiàn)了光電轉(zhuǎn)換。它能夠利用光敏電阻比較法實(shí)現(xiàn)對太陽水平、垂直方向的全方位跟蹤,晚上便自動復(fù)位。當(dāng)太陽的水平或垂直位置發(fā)生偏移時,D1、D2或D3、D4(另一組控制電路)四個光電管中必有一個受陽光照射,這樣就可確認(rèn)太陽運(yùn)動的方向了?刂齐娐酚袃山M,電路圖中是其中的一組,另一組電路與此相同。光電管是直接與控制電路連接的,當(dāng)太陽能板正對太陽時,D1、D2都是高電阻,A、B兩點(diǎn)電壓相等。運(yùn)放輸出的電壓相同,單片機(jī)收到的信號差為零,所以單片機(jī)不控制電動機(jī)轉(zhuǎn)動。若陽光發(fā)生傾斜,使Dl被陽光射中呈低電阻,則A點(diǎn)電位比B點(diǎn)高,信號經(jīng)過放大和轉(zhuǎn)換,則單片機(jī)使得電機(jī)得電轉(zhuǎn)動并拖動太陽能板轉(zhuǎn)動,使太陽能板重新對準(zhǔn)太陽。當(dāng)D1、D2重新轉(zhuǎn)為高電阻時,電機(jī)停轉(zhuǎn)。若陽光偏轉(zhuǎn)時使D2被陽光射中則電機(jī)反轉(zhuǎn)。不論哪種情況,電機(jī)運(yùn)動的方向和太陽運(yùn)動的方向總是一致的.從而達(dá)到了跟蹤的目的。當(dāng)光敏電阻對準(zhǔn)陽光時,采用微凋即可使得A、B兩點(diǎn)的電位相等,以提高系統(tǒng)的準(zhǔn)確度。
該程序中參數(shù) vol_value_2 是硅光片上面的光敏電阻經(jīng)過A/D轉(zhuǎn)換所得的電壓值,參數(shù)vol_value_4是硅光片下面的光敏電阻經(jīng)過A/D轉(zhuǎn)換所得的電壓值,上段程序是將上下兩個光敏電阻吸收的陽光通過A/D轉(zhuǎn)換變?yōu)殡妷汉筮M(jìn)行比較,從而控制電機(jī)的正反轉(zhuǎn)。
3.3 太陽能板二維角度調(diào)整模塊
3.3.1 電機(jī)水平轉(zhuǎn)動控制部分
當(dāng)通過AD轉(zhuǎn)換后,單片機(jī)得到左右兩邊的輸出電壓,若左右兩邊的輸出電壓不相等時,水平電機(jī)控制部分別開始工作,若左邊電壓值比右邊電壓值高且左邊電壓與右邊電壓差的絕對值超過一定的范圍時,電機(jī)開始向右轉(zhuǎn),反之,若右面電壓比左面電壓大,且左右兩面電壓差的絕對值超過一定范圍后,電機(jī)向左轉(zhuǎn),否則,電機(jī)不轉(zhuǎn)動。當(dāng)水平控制結(jié)束后,水平轉(zhuǎn)動停止,垂直轉(zhuǎn)動開始。
在這個模塊中,超過一定是絕對值是為了避免因?yàn)楹苄〉恼`差或者一些沒有必要轉(zhuǎn)動的情況下電機(jī)發(fā)生轉(zhuǎn)動,提高了電機(jī)的利用效率。
3.3.2 程序設(shè)計思想或說明
通過AD轉(zhuǎn)換得到光敏電阻的電壓值,將左右或上下的電壓值進(jìn)行比較,根據(jù)電壓值的不同進(jìn)行電機(jī)的調(diào)整。以電機(jī)的水平調(diào)整為例,若左面電壓值大于右面電壓值,則表示左面接收的太陽光必右面的多,則電機(jī)通過步進(jìn)電機(jī)向右轉(zhuǎn),在轉(zhuǎn)動的同時,左右兩面的電壓也一直還在比較,直到左右兩邊電壓相等或兩面電壓的絕對值在一定的范圍內(nèi),電機(jī)水平轉(zhuǎn)動停止。
Main.c #include "msp430x14x.h" #include "adc12.h" #include "move.h" #include "cry1602.h"
unsigned char tishi_horizontal[] = {"HZ:"}; unsigned char tishi_vertical[] = {"VT:"}; unsigned char flag_horizontal_stop = 0; unsigned char flag_vertical_stop = 1; #define jingdu_horizontal 200 //水平精度控制 #define jingdu_vertical 200 //垂直精度控制 void motor_deal_horizontal(); //水平電機(jī)控制 void motor_deal_vertical(); //垂直電機(jī)控制 void main(void) { WDTCTL = WDTPW + WDTHOLD; P6DIR |= BIT2;P6OUT |= BIT2; //關(guān)閉電平轉(zhuǎn)換 P2DIR = 0xff; P2OUT = 0xf0; P1DIR = 0xff; P1OUT = 0xf0; LcdReset(); //復(fù)位1602液晶 DispNChar(0,0,3,tishi_horizontal); //顯示提示信息 DispNChar(0,1,3,tishi_vertical); //顯示提示信息 AD_Start(); while(1) { if((flag_vertical_stop == 1) && (flag_horizontal_stop ==0)) { motor_deal_horizontal(); //flag_vertical_stop = 0; } else if((flag_horizontal_stop == 1) && (flag_vertical_stop == 0)) { motor_deal_vertical(); //flag_horizontal_stop = 0; } else {;} } } void motor_deal_horizontal() //水平電機(jī)控制 { extern unsigned int vol_value_1; extern unsigned int vol_value_3; if ((vol_value_1 > vol_value_3 ) && ((vol_value_1 - vol_value_3) >= jingdu_horizontal)) { right_zhuan(1500); AD_Start(); } else if ((vol_value_1 < vol_value_3 ) && ((vol_value_3 - vol_value_1) >= jingdu_horizontal)) { fan_zhuan(1500); AD_Start(); } else { stop(); AD_Start(); flag_horizontal_stop = 1; flag_vertical_stop = 0; } } void motor_deal_vertical() //垂直電機(jī)控制 { extern unsigned int vol_value_2; extern unsigned int vol_value_4; if ((vol_value_2 > vol_value_4 ) && ((vol_value_2 - vol_value_4) >= jingdu_vertical)) { fan_zhuan_y(3000); AD_Start(); } else if ((vol_value_2 < vol_value_4 ) && ((vol_value_4 - vol_value_2) >= jingdu_vertical)) { right_zhuan_y(3000); AD_Start(); } else { stop_y(); AD_Start(); flag_vertical_stop = 1; flag_horizontal_stop = 0; } } Move.c #include <msp430x14x.h> typedef unsigned char uchar; typedef unsigned int uint; uchar F_Rotation[4]={0x10,0x20,0x40,0x80};//電機(jī)正轉(zhuǎn)表; uchar B_Rotation[4]={0x80,0x40,0x20,0x10};//電機(jī)反轉(zhuǎn)表 //電機(jī)控制模擬端口放在P2口,根據(jù)前一次的檢測光強(qiáng)x_before,以及 //當(dāng)前采集的系統(tǒng)光強(qiáng)x_now,確定電機(jī)的轉(zhuǎn)動方向 void Delay(uint w)//延時程序 { while(--w); } //*************垂直電機(jī)控制部分程序****************** void right_zhuan_y(uint sudu) //電機(jī)正轉(zhuǎn)速度為sudu { uint w; for(w=0;w<4;w++) //4相 { P1OUT=~F_Rotation[w]; //正轉(zhuǎn)時序 Delay(sudu); //速度為sudu } } void fan_zhuan_y(uint sudu) //電機(jī)反轉(zhuǎn)速度為sudu { uint w; for(w=0;w<4;w++) //4相 { P1OUT=~B_Rotation[w]; //正轉(zhuǎn)時序 Delay(sudu); //速度為sudu } } void stop_y() { P1OUT=0XFF; Delay(10000); P1OUT=0XFF; Delay(10000); }
//*******水平電機(jī)控制部分開始************************************ void right_zhuan(uint sudu) //電機(jī)正轉(zhuǎn)速度為sudu { uint w; for(w=0;w<4;w++) //4相 { P2OUT=~F_Rotation[w]; //正轉(zhuǎn)時序 Delay(sudu); //速度為sudu } } void fan_zhuan(uint sudu) //電機(jī)反轉(zhuǎn)速度為sudu { uint w; for(w=0;w<4;w++) //4相 { P2OUT=~B_Rotation[w]; //正轉(zhuǎn)時序 Delay(sudu); //速度為sudu } } void stop() { P2OUT=0XFF; Delay(10000); P2OUT=0XFF; Delay(10000); } cry1602.c #include <msp430x14x.h> #include "cry1602.h" typedef unsigned char uchar; typedef unsigned int uint; /**************宏定義***************/ #define DataDir P4DIR #define DataPort P4OUT
全部資料51hei下載地址:
太陽能追蹤系統(tǒng).zip
(121.28 KB, 下載次數(shù): 68)
2020-4-19 21:59 上傳
點(diǎn)擊文件名下載附件
別人寫的供參考
太陽能自動跟蹤系統(tǒng).doc
(675 KB, 下載次數(shù): 48)
2020-4-19 21:50 上傳
點(diǎn)擊文件名下載附件
|