電源常用技術與算法
2.1 有效值檢波技術
2.1.1 均值檢波技術
在工業中,我們常用的檢波技術主要由三種:均值檢波技術、峯值檢波技術以及均方根值檢波技術。其中,均值檢波法主要應用於交直流轉換電路中,其主要實現方法是將交流信號進行半波或者全波整流,再對整流輸出的脈動直流信號進行積分得到較爲平緩的直流信號,最後再根據被測信號的半波整流平均值或全波整流平均值與有效值的關係即可計算出被測信號的有效值。圖2.1爲均值檢波的典型電路圖:
圖2.1爲用於電流的交直流轉換電路,圖中二極管D1和D2構成半波整流電路,二極管D2用於保持被測迴路電流的連續性,並非轉換電路本身需要。當用於測量電壓信號時,二極管D2可以省略。當輸入處於正半周時,二極管D1導通,向電容C充電,微安表得到的是經電容平滑濾波之後的直流電,當輸入處於負半周時,電流從D2流過,二極管D1截止,電容電荷通過微安表內阻放電,電容電壓下降。
電容兩端的電壓波形如圖2.2所示,流過微安表的電流波形與圖2.2電壓波形相同,可見,只要輸入交流電流幅值不變,流過電流表的波形非常接近一條直線。充放電電路的時間常數越大或信號頻率越高,輸出波形越接近直線。充放電電路的時間常數越大,當輸入電流幅值發生變化時,輸出響應越慢。因此,均值檢波電路較適合於幅值相對穩定或變化緩慢,而頻率較高的交流電測量。
而峯值檢波則是對交流信號進行半波或者全波整流,再用充電電容保持整流輸出的脈動直流信號的峯值,得到較爲平緩的直流信號。
均值檢波電路通常採用電容充放電電路作爲平均值電路,由於輸出爲整流平均值,要求電容充放電時間常數相等。由圖2.1可知,電容充放電時間常數取決於微安表內阻,充電時,微安表內阻越大,電容越大,流過微安表的電流越小,電容充電電流越大,充電越快;放電時,微安表內阻越大,電容越大,放電越慢。爲了使充放電速度相同,因此,只有在微安表內阻與電容符合特定關係時,才能使充放電速度相同。
對於數字採樣的儀表,圖中微安表可用取樣電阻替代。並且一般會先將電流信號轉變爲電壓信號再作轉換,電壓半波整流的均值檢波電路如圖2.3所示。
但是,上圖存在一些問題:
① 由於二極管存在壓降,當測量電壓較小時,二極管壓降帶來的影響不能忽略。
② 這是電阻電容串聯電路,並不是嚴格的平均電路。
因此,圖2.3電路不能實現嚴格的整流平均值,我們可以通過將變容二極管半波整流電路採用基於精密整流的絕對值電路替代來解決第一個問題,圖2.4爲實用的均值檢波電路,圖中只要去除C1,就是全波精密整流電路,本電路在A2構成反相加法器上增加積分電容,將其變爲反相加法及積分電路。圖中R3=2R4。
2.1.2 峯值檢波技術
峯值檢波法構建的交直流轉換電路對交流信號進行半波或全波整流,再用充電電容保持整流輸出的脈動直流信號的峯值,得到較平緩的直流信號,直流信號的幅值就是被測交流信號的峯值,再利用被測信號的峯值與有效值的關係即可計算出被測信號的有效值。與均值檢波技術不同的是,它利用的是被測信號的峯值而不是均值來計算有效值。
峯值因數是指信號的峯值與有效值的比值。因此,峯值檢波法交直流轉換電路得到的測量結果需要除以峯值因數纔是被測信號的有效值。
有趣的是,峯值檢波的最簡電路模型可以採用和交流電壓檢波電路一樣的模型,如圖2.5所示:
但是實際上,峯值檢波和均值檢波還是有很多差別的,它們的最大差別在於:
① 峯值檢波電路要求充電時間足夠短,用於窄脈衝測試的峯值檢波電路,要求在很短的時間之內,電容可以快速充電至峯值。而放電時間相對長,否則,輸出波形不夠平滑。對於正負對稱並且幅值相對穩定的交流電而言,只要放電速度遠遠低於充電速度,即使充電速度較慢,也能使輸出非常接近於峯值。
② 均值檢波電路要求充放電時間相等,否則,得到的不是整流平均值,均值檢波電路適用於正負對稱並且幅值相對穩定的交流電的測量。
與均值檢波類似,在被測電壓較小時,需要消除二極管壓降帶來的誤差,我們同樣對電路進行改進,得到如圖2.6所示電路:
我是紅色當Vi大於Vo時,A1輸出正電源電壓,變容二極管D1截止,D2導通,電容C迅速充電至Vi。
我是紅色當Vi小於Vo時,A1輸出負電源電壓,變容二極管D1導通,D2截止,電容C通過電阻Rc緩慢放電。
2.1.3 均方根值檢波技術
均方根值檢波技術可以用硬件方法或者軟件算法來實現,如果要用硬件實現的話,可以採用專用的真有效值轉換芯片來實現。常用真有效值轉換芯片有AD536、AD637、LTC1966、LTC1967、LTC1968等。其用法可以參考芯片的datasheet,這裏不再贅述。我們來詳細探討下軟件算法的實現。
均方根值,顧名思義,就是在輸入信號的整數週期內,對輸入信號進行平方,相加平均再開方。我們採用均方根值算有效值的流程通常是先將輸入信號轉化爲電壓信號,再根據信號的頻率選用高速AD對信號進行採樣,最後,我們將採樣值輸入FPGA或者單片機中進行算法處理,得到信號的有效值。這裏有兩點要特別注意:
① 對於頻率較高的信號,我們最好選用採樣率足夠高的AD和主頻足夠高的FPGA來進行處理,否則的話,算出來的有效值誤差會非常大。
② 在採樣時,最好是按照週期的整數倍來進行採樣和數據處理,如果數據處理時不是按照整數個週期來處理的話,得到的值將會是一個跳動的數字。
流程圖如下:
接下來,我們以FPGA爲例來詳細介紹一下如何利用算法實現有效值的計算。
首先,搭建一個DDS平臺來產生週期性累加的時鐘信號,具體代碼如下所示:
module dds_add
(
input clk,rst_n,
input [31:0]data_rate_square,
output reg[31:0]outdata_square
);
reg [31:0]add_rate_san;
reg [31:0]add_rate_sin;
reg [31:0]add_rate_square;
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
add_rate_square<=32'd0;
end
else begin
add_rate_square<=add_rate_square+data_rate_square;
end
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
outdata_square<=32'd0;
end
else begin
outdata_square<=add_rate_square;
end
endmodule
這個時鐘產生模塊實際就相當於一個分頻器,對輸入的時鐘信號進行分頻,其中data_rate_square是和輸入信號頻率有關的一個量,此模塊的作用就是產生一個和輸入信號週期整數倍同步的一個時鐘信號,以保證每次進行數據累加處理時,單個週期內的數據量是一定的。
接下來,我們用時鐘信號驅動週期平方平均模塊,模塊內部具體實現如下:
module sample
(
input clk,rst_n,
input [13:0]data3,
output reg [47:0]
add_data
);
reg [13:0] rdata;
reg [47:0] radd_data;
reg [2:0] i;
reg [9:0] cnt;
always @(posedge clk or negedge rst_n)
if(!rst_n) begin
add_data<=48'd0;
rdata<=14'd0;
i<=3'd0;
cnt<=10'd200;
end
else
case(i)
3'd0: begin i<=i+1'd1;rdata<=data3; end
3'd1: begin if(rdata[13]) rdata<=~rdata;i<=i+1'd1; end
3'd2: begin if(cnt) begin radd_data<=radd_data+rdata*rdata;cnt<=cnt-1'd1;
end i<=i+1'd1;
end
3'd3: begin i<=3'd0;if(!cnt) begin add_data<=radd_data;cnt<=10'd200;
radd_data<=48'd0 ;
end
end
endcase
endmodule
代碼很明瞭,就是對輸入的信號進行平方累加,這裏不再多說。最後,我們將以上模塊輸出的累加值進行平均和開根號:
module EFFECT_Cal
(
input clk,rst_n,
input [47:0]EV_IN,
output [13:0]EV_OUT
);
wire [47:0]AVE_EVIN = EV_IN/200;
wire [31:0]SQ_OUT;
sqrt sqrt_inst
(
.radical ( AVE_EVIN ),
.q ( SQ_OUT ),
.remainder ( remainder_sig )
);
assign EV_OUT = SQ_OUT;
endmodule
模塊最終輸出就是要求的有效值,經實測,用TLC3578採樣,每個週期採樣兩百個點進行運算,最終得到的有效值精度可以到小數點後第三位,滿足絕大部分應用場景。
綜上所述,均值檢波電路輸出結果等於被測信號有效值除以波形因數,峯值檢波電路輸出結果等於被測信號有效值乘以峯值因數,均方根檢波電路輸出結果等於被測信號有效值。三種方法各有優劣,應根據實際場景來選擇最合適的方案。
2.2 高精度採樣技術
採樣對於電源設計來說,是極其重要的一部分,採樣精度往往決定了整個系統最終輸出的精度,性能以及穩定性,因此,我們在設計系統的採樣部分時,應儘可能地高標準。要想實現高精度採樣,有兩點最重要,第一是AD的選擇,第二則是採樣電路以及濾波算法的選擇。
2.2.1 AD的選擇
根據A/D轉換器的轉換原理可以把A/D轉換器分爲兩大類:直接型A/D和間接型A/D。
直接型A/D將輸入的模擬電壓通過比較直接轉換爲數字量。而間接型A/D轉換器,模擬電壓先被轉換爲一種中間變量(像時間、頻率、脈衝等),然後再把中間量轉換成數字量。
直接型A/D中應用較爲廣泛的主要有逐次逼近式A/D轉換器、流水線A/D轉換器;間接型A/D轉換器中應用較爲廣泛的主要有雙積分A/D轉換器和V/F變換A/D轉換器。
這節主要介紹一下A/D的性能指標以及應用。
2.2.1.1 A/D轉換器的性能指標
在選擇A/D轉換器的時候,要根據需要選擇性能指標合適的A/D轉換器,這就需要我們對A/D的性能指標有一定的瞭解。
(1)分辨率
分辨率表示輸出數字量變化一個數字量,輸入的模擬電壓的變化量,轉換器的分辨率定義爲滿刻度電壓與2的n次方的比值,其中n代表A/D轉換器位數。
(2)轉換速率
轉換速率是指A/D轉換器完成一次數據轉換所需要的時間。不同的A/D的轉換時間是不一樣的,根據實際需要轉換速率合適的A/D。
(3)量化誤差
量化誤差是由於A/D轉換器的有限分辨率而引起的誤差。量化誤差是指量化結果和被量化模擬量的差值,顯然量化級數越多,量化的相對誤差越小。分辨率高的A/D具有較小的量化誤差。
(4)非線性度
非線性度是指轉換器實際的轉換曲線與理想轉換曲線的偏移,也可以稱爲線性度。
(5)偏移誤差
偏移誤差是指輸入信號爲零時,輸出信號不爲零的值,也叫做零值誤差。偏移誤差通常是由A/D轉換器內部的放大器或比較器輸入的失調電壓或電流引起的。在使用A/D轉換器前,要先將偏移誤差降到最低,有的A/D轉換器有零點調節的功能。
(6)輸入電壓範圍
A/D轉換器一般都有規定的輸入電壓範圍,使用過程中儘量不要超出範圍,因爲這樣會造成對A/D的永久損壞。
2.2.1.2 A/D轉換器的選擇
對於品種繁多、性能各異的A/D轉換器,在設計數據採集系統時要按照一下幾點要求進行選擇。
(1)A/D轉換器的位數
A/D轉換器的位數的確定與整個測量控制系統所要測量控制的範圍和精度有關。A/D轉換器的位數至少要比總精度要求的最低分辨率高一位。雖然分辨率與轉換精度是不同的概念,但是沒有基本的分辨率就談不上轉換精度。但是,選的太高也沒有實際意義,而且會增加系統的成本。
(2)確定A/D轉換器的轉換速率
A/D的轉換速率從s級到ns級都有,實際應用中根據系統需要選擇合適的轉換速率。像積分型的A/D轉換速率就比較慢,一般用於對溫度、壓力、流量等緩變參量的測量和控制。逐次比較型A/D轉換器屬於中速轉換器,常用於單片機控制系統、音頻採集等。FLASHA/D轉換器屬於高速轉換器,適用於雷達、數字傳輸、瞬態記錄等實時要求高的測量系統。
(3)確定工作電壓和基準電壓
早期設計的集成A/D轉換器需要±15V的工作電源,現在的A/D轉換器大多可以在5V~12V範圍內工作。基準電壓是A/D轉換準確的保證,有的A/D帶有內部基準比較方便,對於要外接基準的A/D轉換器,一定要保證基準電壓幅度穩定、準確。必要時使用基準電壓芯片。
(4)輸入電壓範圍
A/D轉換器根據用途不一,輸入電壓範圍各異,選擇A/D前一定要注意輸入電壓的範圍,超範圍的電壓輸入可能會導致A/D轉換器的永久損壞。
2.2.1.3 A/D轉換器的使用注意事項
A/D轉換器的啓動一般需要外部控制啓動轉換信號,一般由CPU提供。A/D轉換器的啓動轉換信號一般分爲兩種:脈衝控制啓動和電平控制啓動。對於電平控制類A/D轉換器,電平應在轉換的全過程中保持不變,否則會中止轉換。
在正常使用中,A/D轉換芯片可能會電流突然增大、突然發熱,這是可控硅現象,是所有CMOS集成電路在使用中都可能發生的現象。出現這種情況以後,要切斷電源,然後重新打開,又會回覆正常工作。爲防止這種現象發生可採取一下措施:
(1)儘量避免較大電流乾擾竄入電路;
(2)加強電源穩壓濾波措施,在A/D轉換芯片的電源入口處加去耦電路。爲防止窄脈衝竄入,應加一個高頻濾波電容(0.01µF左右);
(3)在A/D轉換芯片的電源端串一個100~200Ω的限流電阻,可在出現可控硅現象時有效地限定電流,保護芯片。
另外現在使用的A/D中一般都自帶採樣保持電路,不需要外面再外接採樣保持電路。
2.2.2 採樣電路的設計
說完了AD的選擇,我們就來聊聊採樣電路的設計。在電源系統的設計中,AD的採樣管腳直接採樣的一般都是電壓信號,如果需要採樣電流信號,我們可以先將電流信號轉化爲電壓信號之後再進行採樣,而電壓採樣一般也分爲兩種:直流電壓採樣和交流電壓採樣,接下來我們來分別討論這兩種採樣的電路設計。
2.2.2.1 直流電壓採樣
最簡單,最直接的採樣方法:判斷採樣電壓的峯值是否在AD的採樣範圍之內,如果信號範圍和AD採樣範圍相吻合,濾波後直接送入AD採樣口進行採樣,這裏濾波可以用簡單的LC或者RC濾波。如果信號的範圍超出了AD的採樣範圍,可以用電阻分壓之後再將信號送入AD採樣口進行採樣。如果分壓之後信號幅值太小,可以用運放將信號放大之後再送入AD採樣口採樣。典型的電路圖如圖2.8所示:
2.2.2.2 交流電壓採樣
在我國,交流電的頻率一般都是50Hz,對交流電壓的採樣,我們可以先用電壓電流互感器將強交流信號轉化爲較弱的交流信號,以方便後級採樣。這裏對交流互感器的選擇也是有講究的,普通的線圈互感器只能互感交流信號,如果採樣信號是交流加上直流偏置的話,直流信號會被直接過濾掉,從而破壞信號的完整性,爲了同時採集直流信號和交流信號,我們可以採用霍爾交流互感器,它可以同時互感直流和交流信號,最大程度地保證信號的完整性。然後,我們可以利用高速AD,以週期爲單位採集信號的瞬時值並保存在數組裏,爲之後求信號有效值值或者峯值做準備,這裏以求信號有效值爲例,我們可以用FPGA搭建一個DDS信號發生器或者買一個DDS發生器模塊,使得DDS信號發生器的週期和交流信號的週期成整數倍關係,然後根據DDS信號的節拍去對採樣信號進行均方根運算,最後將結果除以那個整數,即可求得較爲精確的交流電壓有效值。典型採樣電路如圖2.8所示:
2.3 SPWM波調製技術
逆變電路的控制方式主要是採用SPWM(正弦脈寬調製技術),DUK-AL20控制開關管的通斷來實現正弦調製,正弦脈寬調製技術(SPWM)的基本思路是將一個正弦波按等寬間距分成N等份,對於每一個波形以一個等面積的脈衝來對應,使脈衝的中點與相應正弦波部分的中點重合,如圖2.10所示,由於此脈衝序列的面積分佈滿足正弦規率,根據面積等效原理,將這個脈衝序列輸出至負載時,將使負載得到相當接近正弦的輸出電壓和電流。
由於採用該方式輸出的電壓波形很接近正弦波,所以電壓中的諧波成分較少,同時也可以提高功率因數。通過改變SPWM脈衝的寬度可以改變輸出電壓的幅值,調節電路的調製週期則可以改變輸出電壓的頻率,方便對負載進行控制。
2.3.1 單極性正弦脈寬調製
單極性正弦脈寬調製是以一個寬度正弦規律變化的正弦脈衝序列對應交流輸出波形的正半周,再以一個寬度按正弦規率變換的負脈衝序列對應交流輸出波形的負半周,這兩個脈衝序列交替作用,控制開關器件產生近似於正弦波的輸出電壓波形。
正弦脈寬調製的基本方法是將正弦波性的調製波與三角波形的載波進行比較,通過比較正弦波形各點的瞬時值確定該點對應的脈衝寬度。單極性正弦脈寬調製使用的三角波是單極性的,在正弦調製波爲正半周時三角載波是正極性的;在正弦波爲負半周時三角波載波爲負極性。如圖2.12所示。
2.3.2 雙極性正弦脈寬調製
雙極性正弦脈寬調製是以一個寬度按正弦規率變化的正負雙向脈衝序列對應交流輸出波形的整個週期,通過正向脈衝與負向脈衝寬度的差產生出按正弦規率變換的正半周波和負半周波。
雙極性正弦脈寬調製使用的三角波是雙極性的,其波形的形式如圖2.13,通過正弦調製波與三角波比較,當正弦調製波值大於三角波時,輸出正脈衝;而當正弦調製波的值小於三角載波時,輸出負脈衝。如此得到的脈衝序列是正負交替的雙向脈衝序列。
2.3.3 三相正弦脈寬調製
三相正弦脈寬調製可以使用三個相角彼此相差120°的單相調製電路來合成,但是這樣會使調製電路結構比較複雜。較簡單的方法是採用一個雙極性的三角載波對三相正弦調製波進行調製,其調製的波形如圖2.14。
調製過程中,雙極性三角載波爲三個正弦調製波共用,分別進行比較後獲取脈寬調製信號,方式與雙極性正弦脈寬調製方法相同。從而得到三個雙向的脈衝序列,分別對應A、B、C三相,使用此三個脈衝序列控制逆變電路的A、B、C三相開關元件,可以將直流電壓逆變爲正弦波的三相交流輸出電壓。
三相脈寬調製波的三角載波只能是雙極性的,因爲單極性三角載波需要根據正弦調製波的正、負半周更換載波的極性。採用雙極性正弦脈寬調製,H橋上同一相的上、下兩個橋臂導通與截止都是互補的,爲防止上下兩個橋臂直通而造成的短路,需要在給一個橋臂施加關斷信號後延遲一段時間,從而在波形中引入了死區時間,死區將會給輸出的SPWM波形帶來高次諧波。
2.3.4 正弦脈寬調製(SPWM)控制信號的生成
早期的SPWM採用模擬控制方式來實現,通過信號發生器產生所需的信號,由比較器進行信號之間的比較,隨着數字技術和微處理器在SPWM逆變技術中的應用,採用一定算法產生SPWM的數字控制方式越來越廣泛。
2.3.4.1 模擬控制方式
波形比較法,其基本的方法是由正弦信號發生器件產生正弦調製波,由三角波信號發發生器產生的三角載波,將正弦調製波與三角載波比較,通過比較器的判斷而產生出對應的脈衝信號序列,對逆變電路進行控制從而得到所需的交流電壓。
2.3.4.2 數字控制方式
(1)等效面積法
其原理就是按面積等效原理構成與正弦波等效的一系列等幅但寬度按正弦規律變化的矩形脈衝。等效面積法適用於單極性控制,算法中計算的是正弦波形到橫軸間的面積,這與模擬控制方式中的單極性正弦脈衝調製的方式一致。
(2)自然採樣法與規則採樣法
自然採樣法在算法上仿真模擬控制方式的雙極性正弦脈衝調製,通過計算正弦調製波與三角載波的交點位置,確定調製的脈衝寬度。而規則採樣法是對自然採樣法的簡化,其幾何關係如圖2.16。
規則採樣法適用於雙極性控制,因爲算法中採用的三角載波是雙極性。等效面積法和規則採樣法都是數字控制的算法,可以由微處理器實時計算SPWM脈衝的寬度和位置,實現對逆變電路的控制,也可以事先計算好每個脈衝中心位置和脈衝寬度存入微處理器中,以查表的方式實現對逆變電路的控制。
此外除了使用微處理器生成SPWM以外,目前還有專門產生SPWM波形的大規模集成芯片,有些微處理器也繼承有SPWM波形發生器,如89XC196MC微處理器,其內部有三相互補SPWM波形發生器,可以直接輸出6路SPWM波形信號。
2.4 PID算法
在連續時間控制系統中,PID控制器應用非常廣泛,其設計技術成熟,長期以來形成了典型的結構,參數整定方便,結構更改靈活。由於計算機程序的靈活性,數字PID控制比連續PID控制更爲優越。
2.4.1 PID控制系統簡介
連續時間PID控制系統如圖3-37所示,D(s)完成PID控制規律,稱爲PID控制器。PID控制器是一種線性控制器,用輸出量y(t)和給定量r(t)之間的誤差的時間函數e(t)=r(t)-y(t)的比例、積分和微分的線性組合構成控制量u(t),稱爲比例(Proportional)、積分(Integrating)、微分(Differentiation)控制,簡稱PID控制。
PID控制組合了比例控制、積分控制和微分控制這三種基本控制規律,通過改變調節器參數來實現控制,其基本輸入輸出關係爲:
實際應用中,可以根據受控對象的特性和控制的性能要求,靈活採用比例(P)控制器、比例+積分(PI)控制器、比例+積分+微分(PID)控制器三種不同控制組合。
2.4.2 PID參數控制效果分析
PID控制的三基本參數爲KP、KI、KD,分別對應比例,積分,微分三個模,經實驗測試,可總結出這三項參數的實際控制作用爲:
比例調節參數(KP):按比例反映系統的偏差,系統一旦出現偏差,比例調節立即進行。比例調節是主要的控制部分,但過大的比例會使系統的穩定性下降。增大KP,系統的反應變靈敏、速度加快、穩態誤差減小,但振盪次數也會加多、調節時間加長。
積分調節參數(KI):消除系統靜態(穩態)誤差 ,提高系統的控制精度。積分調節會使系統的穩定性下降,動態響應變慢,超調加大。積分控制一般不單獨作用,而是與P或者PD結合作用。
微分調節參數(KD):反映系統偏差信號的變化率,可以預見偏差的變化趨勢,產生超前控制作用,使偏差在未形成前已被消除。因此,微分控制可以提高系統的動態跟蹤性能,減小超調量,但對噪聲干擾有放大作用,過強的微分調節會使系統劇烈震盪,對抗干擾不利。
常規的PID控制系統中,減少超調和提高控制精度難以兩全其美。主要是積分作用有缺陷造成的。如果減少積分作用,靜差不易消除,有擾動時,消除誤差速度變慢;而加強積分作用時又難以避免超調,這也是常規PID控制中經常遇到的難題。
2.4.3 通俗易懂的理解PID
P就是比例的意思。它的作用最明顯,原理也最簡單。
需要控制的量,比如水溫,有它現在的『當前值』,也有我們期望的『目標值』。
當兩者差距不大時,就讓加熱器“輕輕地”加熱一下。要是因爲某些原因,溫度降低了很多,就讓加熱器“稍稍用力”加熱一下。要是當前溫度比目標溫度低得多,就讓加熱器“開足馬力”加熱,儘快讓水溫到達目標附近。
這就是P的作用,跟開關控制方法相比,是不是“溫文爾雅”了很多.實際寫程序時,就讓偏差(目標減去當前)與調節裝置的“調節力度”,建立一個一次函數的關係,就可以實現最基本的“比例”控制了~
KP越大,調節作用越激進,KP調小會讓調節作用更保守。
要是你正在製作一個平衡車,有了KP的作用,你會發現,平衡車在平衡角度附近來回“狂抖”,比較難穩住。如果已經到了這一步——恭喜你!離成功只差一小步了~
D的作用更好理解一些,所以先說說D,最後說i。
剛纔我們有了P的作用。你不難發現,只有P好像不能讓平衡車站起來,水溫也控制得晃晃悠悠,好像整個系統不是特別穩定,總是在“抖動”。
你心裏設想一個彈簧:現在在平衡位置上。拉它一下,然後鬆手。這時它會震盪起來。因爲阻力很小,它可能會震盪很長時間,纔會重新停在平衡位置。
請想象一下:要是把上圖所示的系統浸沒在水裏,同樣拉它一下 :這種情況下,重新停在平衡位置的時間就短得多。我們需要一個控制作用,讓被控制的物理量的“變化速度”趨於0,即類似於“阻尼”的作用。
因爲,當比較接近目標時,P的控制作用就比較小了。越接近目標,P的作用越溫柔。有很多內在的或者外部的因素,使控制量發生小範圍的擺動。D的作用就是讓物理量的速度趨於0,只要什麼時候,這個量具有了速度,D就向相反的方向用力,盡力剎住這個變化。kD參數越大,向速度相反方向剎車的力道就越強。
如果是平衡小車,加上P和D兩種控制作用,如果參數調節合適,它應該可以站起來了~歡呼吧
等等,PID三兄弟好想還有一位。看起來PD就可以讓物理量保持穩定,那還要I幹嘛?
因爲我們忽視了一種重要的情況:
還是以熱水爲例。假如有個人把我們的加熱裝置帶到了非常冷的地方,開始燒水了。需要燒到50℃。
在P的作用下,水溫慢慢升高。直到升高到45℃時,他發現了一個不好的事情:天氣太冷,水散熱的速度,和P控制的加熱的速度相等了。這可怎麼辦?
P兄這樣想:我和目標已經很近了,只需要輕輕加熱就可以了。
D兄這樣想:加熱和散熱相等,溫度沒有波動,我好像不用調整什麼。
於是,水溫永遠地停留在45℃,永遠到不了50℃。
作爲一個人,根據常識,我們知道,應該進一步增加加熱的功率。可是增加多少該如何計算呢?
前輩科學家們想到的方法是真的巧妙。設置一個積分量。只要偏差存在,就不斷地對偏差進行積分(累加),並反應在調節力度上。這樣一來,即使45℃和50℃相差不太大,但是隨着時間的推移,只要沒達到目標溫度,這個積分量就不斷增加。
系統就會慢慢意識到:還沒有到達目標溫度,該增加功率啦!到了目標溫度後,假設溫度沒有波動,積分值就不會再變動。這時,加熱功率仍然等於散熱功率。但是,溫度是穩穩的50℃。
Ki的值越大,積分時乘的係數就越大,積分效果越明顯。所以,I的作用就是,減小靜態情況下的誤差,讓受控物理量儘可能接近目標值。
I在使用時還有個問題:需要設定積分限制。防止在剛開始加熱時,就把積分量積得太大,難以控制。
2.4.4 數字PID控制的實現
數字PID控制是通過算法程序實現PID控制的。數字控制系統大多數是採樣數據控制系統,進入系統的連續時間信號必須經過採樣和量化後轉換爲數字量,方能進行相應的計算和處理,不論是積分還是微分,只能用數值計算去逼近。當採樣週期相當短時,用求和代替積分,用差商代替微商,將描述連續時間PID算法的微分方程變爲描述離散時間PID算法的差分方程。數字PID控制通常有以下兩種實現:
2.4.4.1 位置式PID控制算法
圖2.18爲位置式PID控制算法的實現框圖,根據此框圖得到差分方程:
此式是數字PID算法的非遞推形式,稱全量算法,其中uo爲控制量基值(n=0時的控制量);un爲第n個採樣時刻的控制量;Ts爲採樣週期。算法中爲實現求和,必須存儲系統偏差的全部值ei,得出的全量輸出un是控制量的絕對數值,這種控制量確定了執行機構在控制系統中的位置(如閥門控制中,輸出對應閥門的位置),因此將這種算法稱爲“位置算法”。
2.4.4.2 增量式PID控制算法
當執行機構需要的不是控制量的絕對值,而是控制量的增量(例如驅動步進電動機)時,需要用PID的“增量算法”,其簡化示意圖如圖2.19所示。
增量式PID算法的差分方程爲
此時已看不出P、I、D作用的直接關係,只能體現各次誤差量對控制作用的影響,但處理時只需要貯存最近的三個誤差採樣值en en-1 en-2 。
2.5 數字濾波算法
說到濾波,大家第一反應可能就是各種電阻電容電感搭建成的無源濾波器或者是以各個不同型號的運算放大器爲核心構建的有源濾波器,以上這些濾波器可以統稱爲硬件濾波,它們已經在電子行業的各個領域得到了廣泛應用,但它們都有一個致命的缺點,那就是需要硬件電路作爲支撐,費材料,費空間。隨着計算機技術的發展,目前很多微型處理器已經具備很強大的運算能力了,我們可以利用CPU強大的計算運算功能,通過某種數值運算,達到改變輸入信號中所含頻率分量的相對比例、或濾除某些頻率分量的目的,這種濾波方法我們稱之爲數字濾波。
數字濾波相對於硬件濾波來說,在某些方面有着獨到的優勢,數字濾波不需要硬件電路的支持,爲系統的設計節省了空間。我們在進行有源濾波時,需要對濾波電路中的各個運算放大器進行供電,而數字濾波就省去了這個麻煩,總之,數字濾波在業界的應用已經越來越廣泛,熟練掌握一些基本的數字濾波技巧對於一名合格的電子工程師來說是非常有必要的。
數字濾波的方法有很多種,下面介紹常用的幾種,不同的濾波方法應用的場合和環境也不用,應根據具體情況選擇使用。爲了直觀體現出這幾種濾波方法對不同噪聲的濾波效果,我們人爲生成了幾段基本信號的組合,然後在它們的波形上疊加上不同的噪聲,測試這些濾波方法在不同信號、不同噪聲下的輸出結果,實驗數據如圖2.22所示:
在這段長度爲800點,最大值爲65535的測試樣本中,組合了以下幾種情況:
① 起始階段是一段表達式近似爲x的數據,用來模擬大多數系統從0開始啓動的採樣波形,該段信號受到了約爲信號本身1/5強度的隨機噪聲的干擾,用以測試濾波函數對噪聲的過濾程度。
② 第二段是一段長度爲200點的方波信號,其上疊加了幅度爲信號本身1/10的毛刺噪聲,測試函數對直流採樣過程中毛刺的過濾效果以及對階躍信號的響應速度。
③ 第三段爲一段均勻上升的斜坡信號,但是疊加了幾個三角形的噪聲信號,用來模擬一些高慣性系統受到脈衝衝擊後產生的週期較長的干擾雜波。
④ 第四段是一段混有信號本身1/10強度的隨機噪聲與1/4強度的毛刺噪聲,模擬了平時在正弦逆變類題目中常常碰到的系統底噪與週期性開關噪聲。
⑤ 最後一段是直流信號上疊加了一個長週期的小幅正弦紋波,同時伴有一定的毛刺,用來模擬DC-DC類題目中常出現的輸出伴紋波信號。
2.5.1 限幅濾波
限幅濾波又稱爲程序判斷濾波,根據多次採集到的數據,如果當前採集值與前一次採集的數值相差一般維持在一定的偏差detaD內,則將每次採集到的數據和前一次的數據進行比較,如果他們的差的絕對值小於△D則本次採集到的數據有效,否則無效捨棄。
示例代碼
#include <stdlib.h>
/*********************限幅濾波***********************
/* sampleValue:當前採樣值
/* return 濾波輸出值
/***************************************************/
#define AMPLIMIT 8192
int lastValue = -1;
unsigned int AmpLimitFilter(unsigned int sampleValue)
{
if(-1 == lastValue)
lastValue = sampleValue;
//限幅判斷
if(abs(sampleValue - lastValue) > AMPLIMIT)
{
return lastValue;
}
else
{
lastValue = sampleValue;
return
sampleValue;
}
}
&emsp濾波效果:可以看到,那些幅值變化很大的毛刺基本都被濾除了。
&emsp適用性分析:
&emsp限幅濾波程序設計簡單、運算速度快、佔用RAM少,是一種最簡單的基本濾波方法。能夠克服偶然因素引入的脈衝干擾,也可以消除波形上的尖峯毛刺,但是不能抑制週期性的干擾,而且其完全削除大幅度的階躍信號,容易造成控制失調,一般不適用於開關電源這類變化劇烈,需要迅速反饋的場景,適用於水溫控制等變化緩慢,安全性高的應用。
2.5.2 中值濾波
其基本濾波思路是將原來的採樣間隔T進行細分,也就是在原來的採樣間隔T內採樣N次,然後把N次採樣值按照大小排序,取中間值爲本次採樣值。
示例代碼
/*********************中值濾波***********************
/* *sampleGet():採樣函數指針,返回unsigned int類型
/* return 濾波輸出值
/***************************************************/
#define MID_NUM 5
unsigned int MidFilter(unsigned int *sampleGet())
{
unsigned char i;
unsigned int value_buf[MID_NUM]={0};
for (i=0;i < MID_NUM;i++)
{
value_buf[i] = sampleGet();
}
unsigned int mid;
//冒泡排序
for(i=0;i<MID_NUM;i++)
{
int j;
for(j=i+1;j<MID_NUM;j++)
{
if(value_buf[i]>value_buf[j])
{
mid=value_buf[i];
value_buf[i]=value_buf[j];
value_buf[j]=mid;
}
}
}
mid=value_buf[MID_NUM/2];
return mid;
}
濾波效果
可以看出,其濾波效果較限幅濾波較好,毛刺基本被濾除。
適用性分析
這種濾波方法能夠有效的克服偶然因素引起的波動干擾,特別是對於像溫度、液位等變化緩慢的被測參數有良好的濾波效果,但是對於流量、速度或者其他快速變化的信號參數則不適合使用這種方法。中值濾波法的程序設計要稍複雜一些,排序可以使用冒泡法或者選擇排序法等,由於引入了排序算法,所以該方法不能處理速度要求很高的信號。其運算處理速度和佔用的RAM直接受所選擇的數值N決定。
2.5.3 算術平均濾波
該方法也是先將原來設計要求的採樣間隔T進行細分,在T內採樣N次,但是對於採集進來的數據不是進行排序,而是進行算術平均,算術平均的結果作爲本次採樣值。N值的選取比較關鍵,N值較大者處理信號的平滑度會較高,但是靈敏度降低;相反,N值較小者處理信號的靈敏度提高,但是平滑度降低。
示例代碼
/*********************均值濾波***********************
/* *sampleGet():採樣函數指針,返回unsigned int類型
/* return 濾波輸出值
/***************************************************/
#define AVG_NUM 5
unsigned int AvgFilter(unsigned int *sampleGet())
{
unsigned char i;
unsigned long int sum=0;
for (i=0;i < AVG_NUM;i++)
{
sum += (unsigned int)sampleGet();
}
return (sum / AVG_NUM);
}
濾波效果
適用性分析
這種濾波方法是適用於對具有隨機干擾的信號進行處理,並且被處理的信號必須具有一個平均值,信號在這個平均值上下波動。該方法對於高速信號並不適用。對於毛刺信號,可以看到均值濾波將其分擔到了周圍的採樣點上,不如中值濾波那樣能夠完全去除。但是對於隨機噪聲信號,由於其理論均值爲0,均值濾波對第一段噪聲有良好的濾除效果。該濾波方法運算處理速度和RAM的佔用率也受所選擇的數值N決定,可以使用時間複雜度較低的排序方法降低運算開銷。
2.5.4 遞推平均濾波
遞推平均濾波又稱爲滑動平均濾波,是將連續N個採樣值設爲一個先入先出的隊列,隊列的長度爲N,每次採樣得到的新數據加入隊尾,並扔掉原隊列的隊首,然後對隊列中的N個數據進行算術平均,獲得的結果作爲此次採樣值。
示例代碼
/*******************遞推均值濾波*********************
/* sampleQueue[SLIDE_AVG_NUM]:採樣隊列
/* sampleValue:當前採樣值
/* return 濾波輸出值
/***************************************************/
#define SLIDE_AVG_NUM 5
unsigned int sampleQueue[SLIDE_AVG_NUM] = {0};
unsigned int SlideAvgFilter(unsigned int sampleValue)
{
unsigned int i;
unsigned long int sum=0;
for(i = 0; i < SLIDE_AVG_NUM - 1; i ++) //刷新隊列
{
sampleQueue[i] = sampleQueue[i + 1];
}
sampleQueue[i] = sampleValue;
for (i=0;i < SLIDE_AVG_NUM;i++) //求和
{
sum += sampleQueue[i];
}
return (sum / SLIDE_AVG_NUM);//取平均
}
濾波效果
適用性分析
上圖爲濾波長度爲5的輸出波形,下圖爲濾波長度爲20的輸出波形。可以看到長度爲20的波形更好但延遲也更大。可見該方法對於週期性干擾有良好的抑制作用,平滑度也很高。但是靈敏度較低,對於偶然出現的脈衝干擾的抑制作用較差,不適用於脈衝干擾比較嚴重的場合,其運算處理速度和RAM的佔用率也直接受N值影響。
另外,這種方法還有一個特殊用法:製作成軟件陷波器,濾除某個單一頻率信號的干擾(如工頻干擾)。具體實現方法介紹如下:由於正弦波一個週期內任取N個等分點的幅值和爲零,其它週期波形的N等分點的幅值和爲常數C,設每次採樣值爲Xi,採樣的平均值爲
若取N=s/f(其中S爲每秒的採樣次數即採樣率;f是要消除的波形的頻率,S和N都取整數),這樣最終的結果就是Y-C,對於50Hz的工頻干擾,C爲零,只要選擇合適的N和S就可以直接將其消除,構成一個陷波器。
對於本測試樣例,我們針對最後一段的紋波設計濾波器,由於這裏是測試的一組數組,沒有採樣率概念,但是根據前面的關係換算,設置濾波點數爲100點,對最後一段紋波進行了較好的濾除,由於這一段數據較少,加之前面數據的相移影響,讀者可自己構造一段足夠長的紋波信號驗證,效果將更加明顯。
2.5.5 中值平均濾波
中值平均濾波也稱爲防脈衝干擾平均濾波,相當於中值濾波和算術平均濾波思想的結合。連續採樣N個數據,去掉其中的最大值和最小值,求剩下的N-2個數據的算術平均作爲一次採樣值。
示例代碼
/*******************中值平均濾波*********************
/* *sampleGet():採樣函數指針,返回unsigned int類型
/* return 濾波輸出值
/***************************************************/
#define MID_AVG_NUM 5
unsigned int MidAvgFilter(unsigned int *sampleGet())
{
unsigned char i;
unsigned int value_buf[MID_AVG_NUM]={0};
unsigned int max,min;
unsigned long int sum=0;
for (i=0;i < MID_AVG_NUM;i++)
{
value_buf[i] = sampleGet();
}
max=0;
min=0xffffffff;
for(i=0;i<MID_AVG_NUM;i++)
{
sum += value_buf[i];//求和
if(value_buf[i]>max)
{
max=value_buf[i]; //找出最大值
}
if(value_buf[i]<min)
{
min=value_buf[i]; //找出最小值
}
}
return (sum-min-max)/(MID_AVG_NUM-2);//去掉最大最小值,取平均
}
濾波效果
2.5.6 遞推中值平均濾波
遞推中值平均濾波也稱爲滑動中值平均濾波,與上一種不同的是採用滑動方法對序列採樣,不降低系統採樣率與採樣速度。設定一個長度爲N的先進先出隊列,同時爲了方便排序同時構造一個同樣長度爲N的已排序數組,每個週期採樣一個新的數值,插入採樣隊列隊尾並移除隊首的舊值。對這個隊列進行插入排序(其他快速排序方法均可),然後去掉用戶指定個數的較大值與較小值,取中間剩下值的平均數作爲最終結果。
示例代碼
/*******************中值平均濾波*********************
/* SLIDE_MID_AVG:數據存儲結構體,每路信號對應一個
/* *sma:本路信號對應結構體指針
/* newValue:本次採樣值
/* cutNum:排序隊列頭尾要捨棄的數量
/* return 濾波輸出值
/***************************************************/
#define SLIDE_MID_AVG_NUM 32
typedef struct SLIDE_MID_AVG
{
volatile unsigned int sample_queue[SLIDE_MID_AVG_NUM];
volatile unsigned int sort_queue[SLIDE_MID_AVG_NUM];
} SLIDE_MID_AVG;
SLIDE_MID_AVG sma;
unsigned int SlideMidAvgFilter(SLIDE_MID_AVG *sma,unsigned intnewValue,unsigned int cutNum)
{
unsigned int i;
unsigned int sum = 0;
unsigned int insert_value = newValue;
//在排序序列中移除採樣序列中最早的值
for(i = 0;i < SLIDE_MID_AVG_NUM;i ++)
{
if(sma->sort_queue[i] == sma->sample_queue[0])
{
unsigned int j;
for(j = i;j< SLIDE_MID_AVG_NUM - 1;j ++)
{
//排序序列向前縮進
sma->sort_queue[j] = sma->sort_queue[j + 1];
}
break;
}
}
//在排序序列中插入新的採樣值(插入排序加快運算)
for(i = 0;i < SLIDE_MID_AVG_NUM - 1;i ++)
{
if(insert_value < sma->sort_queue[i])
{
unsigned int j;
for(j = SLIDE_MID_AVG_NUM - 1;j > i;j --)
{
//排序序列向後縮進
sma->sort_queue[j] = sma->sort_queue[j - 1];
}
sma->sort_queue[i] = insert_value;
break;
}
else
{
if(i == SLIDE_MID_AVG_NUM - 2)
{
sma->sort_queue[SLIDE_MID_AVG_NUM - 1] = insert_value;
}
}
}
//記錄新的值到採樣隊列末尾
for(i = 0;i < SLIDE_MID_AVG_NUM - 1;i ++)
{
sma->sample_queue[i] = sma->sample_queue[i + 1]; //移位刷新
}
sma->sample_queue[SLIDE_MID_AVG_NUM - 1] = insert_value; //採樣新值
//計算中間數的平均值
for(i = cutNum; i < (SLIDE_MID_AVG_NUM - cutNum);i ++)
{
sum += sma->sort_queue[i];
}
return sum / (SLIDE_MID_AVG_NUM - (cutNum << 1));
}
濾波效果
適用性分析
上圖採用了32點濾波長度,首尾去除8個點,波形平滑,沒有突變的噪聲與毛刺現象,對各種噪聲適應性比較均衡,是我們電子競賽實際中應用的最多的一種濾波方法。但是細心的讀者可以發現,波形向後的延遲很高,差不多與濾波長度相當,這也是此方法的弊端。所以我們經常使用32點或者64點甚至更長的滑動中值平均濾波進行數據校準階段的信號濾波,在恆壓恆流等達到準確的穩態值後換用前面的中值濾波等高靈敏度方法進行PID的整定與調節,獲得系統高速的動態響應。