CAN總線在風(fēng)力發(fā)電控制系統(tǒng)中的應(yīng)用
read從接收緩沖區(qū)讀取數(shù)據(jù);write向發(fā)送緩沖區(qū)寫人數(shù)據(jù);release關(guān)閉can 控制器;ioctl向can 控制器發(fā)各種操作命令,包括設(shè)置sja1000總線波特率、id過濾器等;open 打開can 控制器,并使用函數(shù)request_irq()向系統(tǒng)申請中斷,并設(shè)置中斷處理程序為can_interrupt(),當(dāng)sja1000內(nèi)部中斷寄存器(ir)的任意位置為1時,int引腳低電平有效,調(diào)用其中斷處理函數(shù)can-interrupt(),在該函數(shù)中讀取中斷控制寄存器,判斷中斷原因(接收中斷、發(fā)送中斷、錯誤中斷、數(shù)據(jù)溢出中斷、喚醒中斷),從而調(diào)用相應(yīng)的服務(wù)子程序。
(2)sja1000讀寫邏輯分析及設(shè)計。由于sja1000的地址線和數(shù)據(jù)線是分時復(fù)用的,需要通過軟件編程模擬地址鎖存信號,以達(dá)到數(shù)據(jù)和地址的分時傳輸,因此,在程序設(shè)計中,要考慮sja1000的讀寫時序。圖4為sja1000的寫時序圖。
4.2 寫時序邏輯
通過分析寫時序,可知,sja1000的寫數(shù)據(jù)/命令過程分為以下兩步[4]:
(1)將sja1000的ale引腳信號拉高,然后往復(fù)用總線上送地址信號,待數(shù)據(jù)穩(wěn)定后,拉低ale信號,在ale引腳產(chǎn)生下降沿,進(jìn)行地址鎖存。
(2)將cs引腳信號拉低,并拉低wr信號,打開寫允許;然后往復(fù)用總線上送數(shù)據(jù)信號,待數(shù)據(jù)穩(wěn)定后,拉高wr信號,使wr引腳產(chǎn)生上升沿,進(jìn)行寫操作,將數(shù)據(jù)寫入sja1000目標(biāo)寄存器。
linux系統(tǒng)中,不能直接訪問物理地址,而是先要映射到內(nèi)核空間中,通過虛擬地址去訪問。由硬件電路可知,sja1000的物理地址是0x50000000,最大空間為為108個字節(jié)(pelican方式)。sja1000寫程序如下:
addr = ioremap(0x50000000, 0x80);
void write_sja1000 (unsigned int data, unsigned int reg) {
writeb (reg, addr+1);
writeb (data, addr);
}
其中,ioremap()為物理地址到虛擬內(nèi)存的映射,addr為地址映射后得到的內(nèi)核空間虛擬地址;reg是sja1000內(nèi)部寄存器地址;data是要寫的數(shù)據(jù)。writeb(reg, addr+1)模擬ale鎖存地址,發(fā)地址信號reg,addr+1將使地址線a0產(chǎn)生高電平,由硬件設(shè)計電路知道這將使地址鎖存信號ale拉高;然后,reg被送到了復(fù)用總線上。writeb (data, addr)發(fā)送數(shù)據(jù)到地址reg,addr將使a0拉低,reg被鎖存;然后,data被送到復(fù)用總線上,也就寫到了被鎖存的地址reg所指空間。
4.3 讀時序邏輯
圖5為sja1000的讀時序圖。
通過分析讀時序,可知,sja1000的讀數(shù)據(jù)/命令過程分為以下兩步[4]:
(1) 將sja1000的ale引腳信號拉高,然后往復(fù)用總線上送地址信號,待數(shù)據(jù)穩(wěn)定后,拉低ale信號,在ale引腳產(chǎn)生下降沿,進(jìn)行地址鎖存。
(2)將cs引腳信號拉低,并拉低rd信號,打開讀允許;然后往復(fù)用總線上送數(shù)據(jù)信號,待數(shù)據(jù)穩(wěn)定后,拉高rd信號,使rd引腳產(chǎn)生上升沿,進(jìn)行讀操作,將sja1000目標(biāo)寄存器的數(shù)據(jù)讀回。
sja1000讀程序如下:
int read_sja1000 (unsigned int reg) {
writeb (reg , addr+1);
readb ( addr);
}
readb(addr)從地址reg讀取數(shù)據(jù)。addr將使a0拉低,reg被鎖存;然后,通過復(fù)用總線讀取被鎖存的地址reg所指空間數(shù)據(jù)。
4.4 can通訊應(yīng)用程序設(shè)計
(1) can數(shù)據(jù)報文格式。風(fēng)電機(jī)組控制系統(tǒng)中,各控制模塊之間需要傳輸?shù)男盘柡芏啵M量、數(shù)字量以及控制指令和控制參數(shù)等。模擬量包括風(fēng)速風(fēng)向,電壓電流,功率,電網(wǎng)頻率,各類轉(zhuǎn)速和溫度等,數(shù)字量包括機(jī)組的各類狀態(tài)信息,如并網(wǎng)狀態(tài),電源狀態(tài)等及各類故障信息。這些信號均根據(jù)can協(xié)議封裝為報文,以數(shù)據(jù)包的形式發(fā)送。每個報文可由一個或一組信號組成。各個報文需要定義其幀格式,包括數(shù)據(jù)id,優(yōu)先級,數(shù)據(jù)長度等。每個模擬量均定義為兩個字節(jié)長度,數(shù)字量則占1位。為了提高傳輸效率,多個數(shù)字量組合為一個報文來發(fā)送。
系統(tǒng)中can通訊協(xié)議采用擴(kuò)展幀格式,29位id定義見圖6。
其中,命令碼是來自不同模塊的報文的代號,占id的高12位,范圍為0x000-0x0FFf,包含同一組信號的報文具有唯一的命令碼。源地址和目標(biāo)地址取決于控制器地址,主控制器為0x01,網(wǎng)側(cè)變流控制器為0x02,電機(jī)側(cè)變流控制器為0x03,變槳偏航控制器為0x04。id的低9位分別為后續(xù)幀標(biāo)志和后續(xù)幀幀數(shù),若后續(xù)幀標(biāo)志為1,則表示該報文還有后續(xù)幀需要傳輸。
(2) 基于qt/e的圖形界面應(yīng)用程序設(shè)計。本系統(tǒng)中主控制器圖形界面應(yīng)用程序基于linux平臺的qt/e實現(xiàn)。圖形界面應(yīng)用程序主要功能有兩個:一是從can 總線接收風(fēng)電機(jī)組運行狀態(tài)信息,并顯示給用戶,二是判斷并處理機(jī)組狀態(tài)信息,通過can接口向各子控制模塊發(fā)送控制信息。由于本系統(tǒng)中can以多主方式工作,接收來自多個節(jié)點的數(shù)據(jù),并向多個節(jié)點發(fā)送數(shù)據(jù),因此,在應(yīng)用程序中要封裝不同的報文,還要分析收到數(shù)據(jù)的信息。
為了提高系統(tǒng)的響應(yīng),應(yīng)用程序采用多線程機(jī)制,本系統(tǒng)中設(shè)計三個獨立線程來處理不同的任務(wù)。主線程負(fù)責(zé)主界面實時數(shù)據(jù)顯示,歷史數(shù)據(jù)查詢以及機(jī)組狀態(tài)的邏輯判斷和流程控制等。由于數(shù)據(jù)庫的讀寫是對磁盤文件的直接操作,速度較慢,因此在一獨立線程中實現(xiàn)歷史數(shù)據(jù)的寫操作,以防止對主線程控制程序的影響,而對于歷史數(shù)據(jù)的查詢,現(xiàn)場只在特定情況下用到,仍在主線程中實現(xiàn)。can總線數(shù)據(jù)的交互比較頻繁,為了避免數(shù)據(jù)的丟失,在一獨立線程中完成數(shù)據(jù)的接收。
5 結(jié)束語
目前,風(fēng)力發(fā)電控制技術(shù)主要掌握在國外大企業(yè)手中,國內(nèi)機(jī)組的控制器主要依靠技術(shù)進(jìn)口,因此,研究并設(shè)計有自主產(chǎn)權(quán)的機(jī)組控制系統(tǒng)有著深遠(yuǎn)的意義。
參考文獻(xiàn)
[1] 葉杭冶. 風(fēng)力發(fā)電機(jī)組的控制技術(shù)[m]. 北京:機(jī)械工業(yè)出版社,2006.
[2] 孫大鵬. 雙饋風(fēng)力發(fā)電機(jī)組電控與安全保護(hù)系統(tǒng)設(shè)計研究[d]. 北京:華北電力大學(xué)研究生論文,2009.
[3] 繞運濤等. 現(xiàn)場總線can原理與應(yīng)用技術(shù)[m]. 北京:北京航空航天大學(xué)出版社,2007:242-243.
[4] 儲忠,溫陽東. 基于s3c2410控制的can總線接口設(shè)計[j]. 合肥學(xué)院學(xué)報:自然科學(xué)版,2007,5,2:59-62.
評論