在光伏控制系統(tǒng)中,因為日照、溫度等條件的變化,光伏電池的輸出功率也是在不斷變化的,為保證使得光伏電池的輸出功率保持在最大點,需要調整光伏電池輸出電壓(日照強度發(fā)生變化時,短路電流變化大,開路電壓受影響小;環(huán)境溫度發(fā)生變化時,短路電流受影響小,開路電壓變化大)。另外,光伏電池的輸出電壓和電流也和負載有很大關系,負載大,輸出電壓大,輸出電流小;負載小,輸出電壓小,輸出電流大。光伏電池的MPP中的電壓是指光伏電池的輸出電壓。
MPPT算法選擇
目前,MPPT算法有開路電壓比率(離線)、短路電流比率(離線)、觀察調節(jié)(在線)、極限追蹤控制法(在線)。
開路電壓比率法——這可以說是非常經典也相當古老的方法了,又名“固定電壓法”。簡單來說,算法基于最大功率電壓和開路電壓的線性關系式 ,系數(shù) 取值由設計師決定,一般介于0.71到0.78之間,大多數(shù)設定為0.76。MPPT在追蹤時,首先開路DC端來測量開路電壓,然后通過算法來計算最大功率電壓并且定位最大功率點。MPPT會保持在該功率點一段時間,然后重復開路測算并且重新定位。固定電壓法的最大優(yōu)點就是制作便宜并且應用簡單。相反,缺點也十分明顯:精確值和追蹤效率較低。盡管固定電壓法被稱之為“追蹤”算法,事實上它依然是在整個工作循環(huán)中的一個計算設定值而非即時追蹤值。其次,此方法完全且單純依賴于組串的開路電壓值而放棄了對于工作電流的追蹤。當局部陰影出現(xiàn)在陣列時,實際最大功率點和MPPT設定功率點就會出現(xiàn)相當大的偏差,偏差范圍取決于陰影遮蓋程度。最后,每次機器進行開路電壓測量時,太陽能系統(tǒng)是無法輸出功率的,隨著時間和次數(shù)累計此算法會造成一定量的能量流失。總體來說,差評。
短路電流比率法——和固定電壓法的算法相似,可以表述為 , 是一個變量系數(shù),通常變化范圍在0.78至0.92。和固定電壓法不同的是,短路電流比率法要求在轉換器內置一個高頻開關來測量短路電流。比較推薦的是在組串和DC link的電容之間安裝一個FET(field-effect transistor)。由于電流受到光照強度的影響非常大,通常機器還需要一個DSP(digital signal processor)來保證IV曲線的全掃描和數(shù)據的準確度。這也讓短路電流比率法設計更加復雜且難以應用。差評。
觀察調節(jié)法——站在巨人肩頭發(fā)展出來的算法你敢不服?目前,P&O依然應用在世界各大主流的逆變器中也是最廣泛的被應用的算法,沒有之一。相比于ESC,P&O可以在更短的時間內追蹤時觸碰更大的區(qū)域,掃描更多地數(shù)據。這進一步提高了P&O的追蹤效率和準確率。由于它在短時間內可以處理大量的數(shù)據,這也一定程度抵制了突變光照強度對于追蹤精確度的影響。缺點的話,由于它掃描的范圍較大,會一定程度的導致輸出功率缺乏穩(wěn)定性,但是抖動程度基本都在±4%以內。所以我還要給它32個贊!P&O還有一個姐妹版本,還是“爬山”邏輯,但是并入了“試錯”法(trial and error)。處理器會根據下一刻追蹤點的移動趨勢,比較功率的正增量或負增量。如果功率持續(xù)增加,處理器將會繼續(xù)同方向移動追蹤點,不停比較直到功率達到峰值。
極限追蹤控制法——該算法第一次提出在19世紀20年代,也是目前全球最流行的“觀測調節(jié)法”(Perturb and Observe)的前身。算法的創(chuàng)新點是引入了向量在P-V曲線中。處理器根據電壓的增量或減量來比較對應的功率增減量,進而確定追蹤功率點的移動方向。具體判定方法請參照圖二,一目了然。
ESC算法的巨大成功是相比于之前的固定電壓法,通過漸進向量引入了“爬山法”的概念,進而開啟了動態(tài)追蹤的算法。ESC極大地拓寬了MPPT對于DC端輸入能量的捕捉,顯著地提高了追蹤效率。由于ESC對于后代MPPT算法的影響深遠,導致它的短板也一并被繼承下來并至今“禍害”眾多一線品牌的逆變器。ESC對于陡然變化的光照反應強烈,舉個通俗例子,MPPT正專注的比較著功率和電壓的變量,“嗯,正向移動的電壓同步伴隨著功率的增加,明顯最大功率點還在正向(右邊),那我繼續(xù)向右移動”。此時云層擋住了陽光,稍稍影響了輸入的直流功率,使之略微下降,“慢著!正向移動的電壓竟然導致功率減小了!我肯定錯過了最大功率點,快掉頭!”于是,追蹤點就離它的歸宿越來越遠的地方飄去。。。我在實驗室模擬測試時,親眼看到最多達到70%左右的偏差。基于ESC這種一級(first stage)追蹤的設計理念,這種現(xiàn)象,無解。但是欣賞它對后世的正面影響以及理念創(chuàng)新,還是好評!
綜合考慮,MPPT的算法采用極限追蹤控制法來進行軟件實現(xiàn),即采集PN側電壓、流向PN側的電流數(shù)據,計算 、 和 ,判斷 與 的關系, 大于 ,此時應按 減小PN側的目標電壓;若 小于 ,此時應按 增加PN側的目標電壓。
MPPT硬件選擇
MPPT的實現(xiàn)是通過調節(jié)光伏電池輸出電壓來實現(xiàn)的,若光伏電池輸出電壓直接連接到DC/AC的PN側,那么光伏電池輸出電壓波動就會直接影響PN側電壓,最好是在光伏電池和DC/AC之間加一個中間環(huán)節(jié),通過這個中間環(huán)節(jié)來調整輸入電壓,保持輸出電壓穩(wěn)定,增加或減小輸出電流。這個功能一般有BUCK、BOOST、BUCK-BOOST、CUK電路和開關電路可以選擇,但BUCK電路是連續(xù)向負載供電、間接從電源取電;BOOST電路時間接向負載供電、連續(xù)從電源取電,為保證光伏電池板的發(fā)電效率得到較好使用,一般選擇BOOST電路來實現(xiàn)MPPT。
選擇BOOST電路來實現(xiàn)MPPT算法,其結構拓撲如下圖。
考慮成本問題,再加上光伏電池輸出的所有最大功率點對應的輸出電壓差別不是很大,MPPT不使用DC/DC電路來實現(xiàn),在現(xiàn)有的DC/AC平臺上進行實現(xiàn)。
MPPT程序實現(xiàn)
變流器的工作流程為:
啟動——預充電——PN側抬壓——接入光伏電池——輸出(MPPT)。
可以確定,MPPT的作用是在電壓環(huán)上作用,并且是在變流器進入工作狀態(tài)后開始工作。
采用現(xiàn)有的DC/AC平臺來實現(xiàn)MPPT,存在兩個問題:控制步長(時間間隔)問題、擾動步長 問題、判斷精度問題。
控制步長問題——PN側電壓在MPPT過程中會產生一定的波動,但因為對于光伏電池來說(結合下面兩圖),其最大功率點對應的電壓大致都在一個不大的范圍內,并且都接近開路電壓,所以,對于在DC/AC上實現(xiàn)MPPT,要考慮多長時間對PN側目標電壓進行一次更新。目前State Manage函數(shù)是0.1ms進入一次,可以考慮MPPT的控制步長為0.2~0.5ms,步長暫定為0.3ms。
相同光照、不同溫度
相同溫度,不同光照
擾動步長問題——考慮在變流器進入工作狀態(tài)后,其PN側電壓為較穩(wěn)定的值,即使光照強度、環(huán)境溫度發(fā)生變化,光伏電池的最大功率點電壓的變動范圍不會很大。根據其采集回來的PN側電壓和光伏電池輸出電流,并計算和前一時刻的功率差值 ,根據電導增量法進行判斷,然后在目標跟蹤電壓上增加或減小一定的步長 。因為在光伏電池開始工作后,PN側電壓不是從0開始的,而是在光伏電池最大功率點對應電壓附近,所以 的值會比較小,K值的設置通過調試程序獲得,K暫定為5。
判斷精度問題——由導納法的工作流程圖(下圖)可以知道,在流程中存在 、 與0的關系的判斷,程序中總是會存在誤差,并且檢測中也會存在,如果以0為判斷準值,考慮實際應用中的誤差因素,用一個小的閥值來替代0。閥值暫定為0.1V和0.1A。
MPPT算法C程序實現(xiàn)
#include "16F877.h"
#device ADC = 8 // 一個8位寄存器ADC模式
#fuses HS, NOWDT, PUT, NOPROTECT, BROWNOUT, NODEBUG, NOLVP // High-Speed 20MHz, No Watchdog, No Protection, Brownout Protection,
#use delay(clock=20000000) // 20MHz Crystal
//int is defined as 8-bit unsigned integer using CCS compiler
void main (void)
{
signed int direction;
int delta;
int pwm;
int upperbound;
int lowerbound;
float power;
float powerold;
float voltage;
float voltagedrop;
float voltagedifference;
float currentma;
float measuredvoltage;
float measuredvoltagedrop;
direction = 1; // Set initial direction to positive
delta = 1; // Amount by which to adjust the PWM - 7-bit resolution so duty step of 2%
pwm = 26; // Initial position of the PWM - 50% Duty Cycle with 7-bit resolution.
upperbound = 49; // Upper bound of the PWM %
lowerbound = 1; // Lower bound of the PWM %
power = 0; // Initial Value of Power
setup_adc(ADC_CLOCK_DIV_32); // ADC clock
setup_adc_ports(ALL_ANALOG); // Set all inputs to analog
output_low(PIN_C1); // Set CCP1 output low
setup_ccp1(ccp_pwm); // setup pin CCP1 (RC2) to do PWM
setup_timer_2(T2_DIV_BY_1,12,1); // 384.615kHz
while (1)
{
//delay_ms(1000) // Wait 1 Second
set_adc_channel(0); // Select RA0
//delay_ms(20); // Wait to Read ADC
measuredvoltage = read_adc(); // Read the voltage input from ADC channel 0
set_adc_channel(1); // Select RA1
//delay_ms(20); // Wait to Read ADC
measuredvoltagedrop = read_adc(); // Read the Voltage dropped across the R from ADC channel 1
voltage = measuredvoltage/51; // Measured Voltage is 51 steps per Volt at a Reference Voltage of 5V
voltagedrop = measuredvoltagedrop/51;
voltagedifference = voltage - voltagedrop;
currentma = voltagedifference; // Calculating Current using 1K Resistance
powerold = power; // Calculate the Power from the inputs
power = voltage * currentma;
pwm = pwm + direction*delta; // Adjust Pulse Width Modulation Value by Delta value
if (power < powerold) // If at top of curve, change direction
{
direction = -direction;
continue;
}
if (pwm > upperbound) // If at maximum PWM, Stop here
{
pwm = upperbound;
continue;
}
if (pwm < lowerbound) // If at mi
nimum PWM, Stop here
{
pwm = lowerbound;
continue;
}
set_pwm1_duty(pwm); // Set PWM Mark-Space Radio to approx 50%
}
}