曹銀萍,張祖琪,竇益華
(西安石油大學 機械工程學院,陜西 西安 710000)
在高產深氣井油管內過高的介質流動速度和壓力易對管柱產生附加作用力,從而使油管發生高頻低載荷受迫振動或低頻高載荷受迫振動。油管振動不僅會導致接箍螺紋松動、漏氣和脫扣,而且會對油管本體產生疲勞破壞,影響井筒生產安全。針對高產深氣井油管柱因載荷發生振動后產生的安全隱患,需要設計出智能可調油管抑振系統,對高產深氣井油管柱進行抑振。
為了動態控制井下管柱振動,本設計采用模糊控制與PID控制器相結合的方式對油管柱的所有頻域振動進行抑振控制[1]。系統中主控制器需要高速采集加速度計輸出大小,為進一步減小測控系統電路體積以及增加測量精度,要求控制器片內外設可擴展多通道高速AD轉換器及高速緩存,這樣可以同時獲得多片加速度計讀數,保證測量有效性;其次,計算中涉及到高速乘加運算以及重復性的積分微分運算,所以需要進行高速浮點運算并且具有硬件乘法器;最后考慮到井下管柱工作環境限制,要求主控制器具有高性能低功耗的特點。Altera公司的Cyclone 10LP系列FPGA芯片強調更低的功耗和成本,并針對I/O口擴展、傳感器融合,芯片到芯片控制等低靜態功耗低成本應用進行了優化,所以本設計采用Cyclone 10LP芯片實現該應用需求[2]。
磁流變抑振器是基于磁流變液在磁場作用下粘塑性發生變化的特性而設計的。通過控制磁場強度,可以產生隨不同的磁場強度而連續變化的粘度值,從而獲得連續可調的輸出阻尼力,在本系統中,通過安裝于測試器倉內的測振傳感器實時監測振動情況,當管柱實際振動偏離控制期望時,主控制器FPGA運行模糊PID控制算法對線圈電流進行實時調節,線圈磁場隨電流改變而改變,進而實時調節磁流變液提供的阻尼力,保證實時抑振[3-5]。智能抑振測控系統結構框圖如圖1所示,系統功能包括:主控芯片實時調節磁流變抑振器線圈電流大小,與測振傳感器構成閉環系統,實現管柱抑振;工作時,測控抑振短節安裝于待抑振油管之間,其中主控芯片FPGA、LIS2DH測振傳感器等構成測控系統,線圈、磁流變液、抑振器結構組成執行機構。
模糊自適應PID控制是將模糊理論與PID控制相結合,利用模糊控制規則在線對PID參數進行修改。該控制系統主要由模糊推理模塊、PID控制器、磁流變抑振器以及測振傳感器組成[6-8],其結構如圖2所示。
模糊控制設計的步驟分為如下4步。
1)模糊化:總結設計人員的知識經驗,并將其作為輸入量模糊化,將系統誤差e和誤差變化率ec變化范圍定義為模糊集上的論域。模糊子集為e,ec={NB,NM,NS,PS,PM,PB}中的元素分別代表負大、負中、負小、正小、正中以及正大。
2)選擇隸屬度函數:假設e、ec和kp、ki、kd均服從正態分布,可得出各模糊子集的隸屬度。
3)建立模糊規則表:根據各模糊子集的隸屬度復制表和各參數模糊控制模型,建立kp、ki、kd這3個參數整定的模糊規則表。
4)解模糊化輸出:需要通過解模糊轉化模糊量為精確值,根據步驟進行kp、ki、kd的自適應校正,應用模糊合成推理設計PID參數模糊矩陣表,查出修正參數代入式1~式3進行計算。
(1)
(2)
(3)
抑振測控系統中測振傳感器需要測量油管軸向的加速度,加速度大小為5~50 m/s2,頻率為2~100 Hz,為了實現x、y和z三軸加速度數據的同時采集,選用LIS2DH三軸加速度計模塊。該模塊具有數字SPI串行接口標準輸出,能夠以1 Hz~5.3 kHz的輸出數據速率測量加速度,保證在-40~+85 ℃的擴展溫度范圍內運行,可以有效地采集三軸加速度數據并存儲在寄存器中。LIS2DH模塊內部結構如圖3所示。
LIS2DH模塊采用SPI總線協議與控制器(FPGA)進行通信,因此通過SPI協議實現對該模塊相關寄存器的配置和采集數據的讀取。LIS2DH模塊的SPI串行接口是一個總線從機,其工作時序如圖4所示。
SPI是允許寫入和讀取設備的寄存器。串行接口通過CS、SPC、SDI和SDO這4條線與外部交互。CS是串行端口使能,由SPI主機控制。SPC是串行端口時鐘,它是由SPI主機控制。當CS處于高位(無數據傳輸)時,將停止在高位。SDI和SDO分別是串行端口數據輸入和輸出,SDI和SDO都在SPC的下降沿驅動,并在SPC的上升沿捕獲。
本系統設計采用自頂向下的設計思路,圖5所示為FPGA模塊劃分及硬件電路圖。系統主要由主控芯片FPGA運行模糊PID算法,由LIS2DH模塊采集并發送振動加速度信號。FPGA內部主要包含模糊PID算法模塊、SPI串行接口模塊、LIS2DH數據采集模塊和FIFO緩存等模塊。LIS2DH數據采集模塊通過SPI驅動模塊與LIS2DH器件進行通信,并將采集到的加速度信號送入PID控制模塊進行處理,SPI控制模塊負責控制讀取LIS2DH傳感器輸出的加速度數據,并將加速度數據傳入FPGA中的FIFO緩沖區等待模糊PID控制模塊處理,最后模糊PID控制模塊完成信號調節后將PID調節信號輸出到驅動電路,完成磁流變抑振器抑振功能[9]。
FPGA內部頂層模塊例化了SPI驅動模塊、LIS2DH數據采集模塊、FIFO數據緩存模塊、PID運算模塊和模糊控制模塊,完成了各模塊之間的數據交互。頂層模塊部分代碼如下:
module lis2dh_top(clk,rst_n,spi_scl,spi_sda);
//例化lis2dh數據采集模塊
lis2dh lis2dh_u(
.clk(clk),//時鐘信號
.rst_n(rst_n),//復位信號
.spi_rh_wl((spi_rh_wl),//SPI讀寫控制信號
.spi_exec((spi_exec),//SPI觸發執行信號
.spi_addr((spi_addr),//SPI器件內地址
.spi_data_w((spi_data_w),//SPI要寫的數據
.spi_data_r((spi_data_r),//SPI讀出的數據
.spi_done((spi_done),//SPI一次操作完成);
end
模糊PID算法模塊通過有限狀態機來實現,start_flag是模塊工作的使能信號,idle狀態為初始狀態,檢測到start_flag為高電平時進入fuzzy狀態,fuzzy狀態為模糊控制計算狀態,將模糊化后的值送入lookup查找地址模塊,檢測到fuzzy_done為高電平時進入lookup狀態,lookup狀態為查找地址模塊,得到kp、ki、kd的存儲地址,該狀態檢測到look_done為高電平時進入def狀態,def狀態為解模糊狀態,對PID參數進行解模糊處理,并將3個參數輸入到PID控制器中進行運算。模糊化模塊的狀態遷移圖如圖6所示。
PID運算控制模塊的計算過程如下:對各個變量進行初始賦值,并將初值輸出到誤差模塊計算PID控制器的誤差e,當接收到控制模塊的信號init_flag時進行誤差計算,輸出ek0、ek1、ek2,計算完成后將輸出完成信號done_flag置為高電平并送入控制模塊,在接收到控制模塊的信號out_flag后,對各個參數進行pid增量計算,在計算過pid增量后與上一時刻的輸出值進行相加,得到實際的輸出yt,輸出引腳pid_y將此時刻的數值送入寄存器中,其在數值上與輸出yt相同,計算完成功能。實現PID控制的部分代碼如下:
module pid(clk,rst_n,e,de,kp,ki,kd,yt);
wire signed[15:0] ek0;
reg signed[15:0] ek1;
reg signed[15:0] ek2;
wire signed[15:0] d_uk;//pid增量
reg signed[15:0] uk1;//上一時刻u(k-1)的值
reg signed[15:0] pid_y_reg=15'd0;
assign ek0={(target - y),16'd0};//計算e(k)
assign d_uk=(ek0-ek1)/kp+ek0/ki+((ek0-ek1)- (ek1-ek2))/kd;//計算pid增量
assign pid_y=pid_y_reg[15:0];
LIS2DH數據采集模塊通過調用SPI驅動模塊來實現對LIS2DH采集數據的讀取。將讀到的加速度數值a_data傳遞給FIFO模塊緩存,再將FIFO緩存的值傳遞給模糊PID控制模塊,用于控制加速度信號的大小。spi_rh_wl為SPI讀寫控制信號,spi_exec為SPI觸發執行信號,spi_addr為SPI器件內地址,spi_data_w為SPI要寫的數據,spi_data_r為SPI讀出的數據,spi_done為SPI一次操作完成信號,flow_cnt為狀態流控制寄存器,wait_cnt為計數等待寄存器,a_data_t為加速度的臨時數據,a_done為加速度值采集完成信號,LIS2DH數據采集模塊的代碼如下:
module LIS2DH_ctrl(clk,rst_n,spi_rh_wl,
spi_exec,spi_addr,spi_data_w,spi_data_r,spi_done);
4'd1:begin//配置LIS2DH的功能模式
spi_exec<=1'b1;
spi_rh_wl<=1'b0;
spi_addr<=8'h00;//配置系統寄存器
spi_data_w<=8'h03;//激活功能
flow_cnt<=flow_cnt+1'b1;
end
4'd2:begin//配置完成
if(spi_done)
flow_cnt<=flow_cnt+1'b1;
end
LIS2DH包含一個10bit32級FIFO。在FIFO工作模式下,x、y和z軸測量的加速度檢測數據存儲在FIFO中。本模塊調用QuartusII軟件中的FIFO ip core。fifo_my為調用的ip core。wrclk為100 MHz的寫時鐘信號,wren為寫使能信號,wrdata為寫數據信號,wrempty為寫空標志,wrfull為寫滿標志,wrusedw為寫使用量信號,rdclk為50 MHz的讀時鐘信號,rden為讀使能信號,rdata表示讀數據信號,rdempty表示讀空標志信號,rdfull表示讀滿標志信號,rdusedw表示讀使用量信號。FIFO數據緩存模塊的部分代碼如下:
fifo_my fifo_my_inst(
.data (wrdata),
.rdclk (rdclk),
.rdreq (rden),
.wrclk (wrclk),
.wrreq (wren),
.q (rdata),
.rdempty(rdempty),
.rdfull (rdfull);
由于LIS2DH采用SPI協議與FPGA進行通信,FPGA作為主機,LIS2DH作為從機,所以需要用SPI驅動模塊實現FPGA與LIS2DH信號的交互。根據SPI的工作時序圖,將SPI的時鐘的頻率定為5 MHz。本模塊負責將8 bit的并行數據按照SPI協議接收,將接收的數據并行傳輸給FPGA。spi_en為接收數據使能信號(脈沖信號),spi_data為所接收的數據,spi_done為接收完成信號。在接收邏輯中,全部的信號采用上升沿驅動。利用外部給予的spi_en作為啟動信號,啟動rec_en,經過移位接收數據。在spi_sclk輸出時,采用組合邏輯設計。SPI驅動模塊的部分代碼如下:
module spi_8bit_drive(clk,rst_n,spi_en,spi_ data, spi_done,spi_sclk,spi_mosi,spi_miso);
always@(posedge clk,negedge rst_n)
if(rst_n==1'b0)
spi_done<=1'b0;
else
if(rec_cnt==4'd8)
spi_done<=1'b1;
else
spi_done<=1'b0;
end
本系統采用了FPGA Cyclone 10LP作為控制核心,系統硬件部分采用Verilog HDL語言編寫,經過Quartus II9.1開發平臺編譯后在Modelsim Altera6.5下進行仿真,PID模塊的仿真時序圖如圖7所示。從仿真波形來看,波形符合預期,所以該智能控制系統可以得到滿意的抑振效果。圖8所示為磁流變抑振器實物圖。
本文針對常規單片機控制井下磁流變抑振器抑振過程中存在的數據信號傳輸困難、難以實現實時抑振的問題,設計了以FPGA為主控芯片的磁流變抑振器智能控制系統,該智能控制系統采用模糊自適應原理與PID控制器相結合的方式,控制LIS2DH模塊的數據采集與傳輸。試驗結果表明,基于FPGA的磁流變抑振器智能控制系統,滿足井下管柱抑振控制系統的各項性能指標,具有易于智能算法升級、集成度高、自動控制等優點,有效解決了該技術在井下的應用和推廣問題。