将新一代太阳能光伏逆变器接入智慧电网,逆变器必须有越来越高的智慧程度进行配合。本文叙述创新技术以谐波分析引擎(HAE)方式改善智慧电网的整合度,为其监控电源品质和增强稳定度。


太阳能光伏逆变器转换来自太阳能面板的电能,并能高效的将其佈署到公用电网中。早期太阳能PV逆变器只是将电能转储到公用电网的模组。但是,新设计要求太阳能光伏逆变器对电网的稳定性作出贡献。


本文叙述最新的ADI技术如何以谐波分析引擎(HAE)的方式改善智慧电网的整合度,并监控电网上的电源品质,进而大幅增强电网稳定。


智慧电网

什么是智慧电网?IMS Research将智慧电网定义为「一种自身能够高效匹配和管理发电和用电并可最大程度地利用各种可用资源的公用供电基础设施」。若要将新一代太阳能光伏逆变器接入智慧电网,则逆变器需要越来越高的智慧程度才能实现。这本身就是一个难题,主要是因为当电力需求在別处时,此处却连接了过多的电网,从而发生不平衡。


基于此原因,如前文所述,太阳能光伏逆变器需要具备更高的智慧程度,并且这种智慧应侧重于电网整合,其中系统需协助稳定电网,而非作为电网的一个简单电源使用。



图一 : ADSP-CM403 HAE框图(source:ADI)
图一 : ADSP-CM403 HAE框图(source:ADI)

这要求能更佳对注入电网的电能进行测量、控制和品质分析。当然,这会促成新指令的发表以及更高的技术要求,进而直接导致新技术的产生。


ADSP-CM403XY HAE周边模组

HAE模组本质上是一个数位PLL,其简化原理图如图二所示。HAE连续接收V和I资料,并且数个週期后将锁定至输入波形的基波。HAE模组的输入范围为45 Hz至66 Hz。最多可分析40个谐波,每次12个。对于每个谐波,PLL会试图锁定至所需的讯号频率。



图二 : HAE简化数位PLL
图二 : HAE简化数位PLL

谐波引擎硬体模组与谐波分析仪共同处理结果。由于谐波引擎产生的结果为最终格式,这些结果资料保存在结果记忆体中。HAE引擎在无衰减的2.8 kHz通带内计算谐波资讯(相当于3.3 kHz的-3 dB频宽),用于45 Hz至66 Hz范围内的缐路频率。



图三 : HAE通带频率
图三 : HAE通带频率

同时可使用相电流和来分析零缐电流。在新採样週期的最初时刻,谐波引擎在含有资料RAM内的预定义位置迴圈,该资料RAM含有分析仪处理结果。若有需要, 内容可进一步处理。


电压和电流资料可来自Sinc模组或ADC(两者均储存在SRAM中),并输入至HAE模组,速率为8 kHz。该速率下可产生一个中断,提示太阳能光伏逆变器输入可用数据。进行资料分析并执行下列计算时,HAE模组将产生另一次中断,提示太阳能光伏系统准备显示谐波分析数据。ADSP-CM403还可将HAE至DMA的全部结果资料直接传输至SRAM,之后系统代码便可显示结果。这会导致整个HAE系统的代码开销很小。


ADSP-CM403XY HAE结果

图四中的HAE结果清楚显示观察电压均方根资料时,系统中存在哪些谐波。图中50 Hz基波清晰可见,但250 Hz 和350 Hz处的较低谐波(如谐波5和7)亦可在本示例结果中看到。



图四 : HAE的V rms示例结果(谐波1-12)
图四 : HAE的V rms示例结果(谐波1-12)

关于这些计算中採用的特定等式,同时适用于基波和谐波计算,例如谐波引擎输出和储存值的暂存器的对应。


程式设计示例

INT HAE_CONFIG(VOID)


{ INT I;


HAE_INPUT_DATA(VOUTPUT, SINC_VEXT_DATA);


HAE_INPUT_DATA(IOUTPUT, SINC_IMEAS_DATA);


RESULT = ADI_HAE_OPEN(DEVNUM, DEVMEMORY, MEMORY_SIZE, &DEV);


RESULT = ADI_HAE_REGISTERCALLBACK(DEV, HAECALLBACK, 0);


RESULT = ADI_HAE_SELECTLINEFREQ(DEV, ADI_HAE_LINE_FREQ_50);


RESULT = ADI_HAE_CONFIGRESULTS(DEV, ADI_HAE_RESULT_MODE_IMMEDIATE, ADI_HAE_SETTLE_TIME_512, ADI_HAE_UPDATE_RATE_128000);


RESULT = ADI_HAE_SETVOLTAGELEVEL (DEV, 1.0);


RESULT = ADI_HAE_ENABLEINPUTPROCESSING(DEV, FALSE, FALSE); /* FILTER ENABLED */


/* ENABLE ALL HARMONICS (IN ORDER) */


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_1, 1);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_2, 2);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_3, 3);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_4, 4);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_5, 5);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_6, 6);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_7, 7);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_8, 8);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_9, 9);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_10, 10);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_11, 11);


RESULT = ADI_HAE_HARMONICINDEX (DEV, ADI_HAE_HARMONIC_INDEX_12, 12);


RESULT = ADI_HAE_SUBMITTXBUFFER(DEV, &TXBUFFER1[0], SIZEOF(TXBUFFER1));


RESULT = ADI_HAE_SUBMITTXBUFFER(DEV, &TXBUFFER2[0], SIZEOF(TXBUFFER2));


RESULT = ADI_HAE_ENABLEINTERRUPT(DEV, ADI_HAE_INT_RX, TRUE);


RESULT = ADI_HAE_ENABLEINTERRUPT(DEV, ADI_HAE_INT_TX, TRUE);


RESULT = ADI_HAE_CONFIGSAMPLEDIVIDER(DEV, 100000000);


RESULT = ADI_HAE_RUN(DEV, TRUE);


// RESULT = ADI_HAE_CLOSE(DEV);


}


/* EVENTS */


VOID HAECALLBACK(VOID* PHANDLE, UINT32_T EVENT, VOID* PARG) /* ISR ROUTINE TO LOAD / UNLOAD DATA FROM HAE


{


UINT32_T N;


ADI_HAE_EVENT EEVENT = (ADI_HAE_EVENT)EVENT; /* RESULTS RECEIVED FROM HAE 128MS */


IF (EEVENT == ADI_HAE_EVENT_RESULTS_READY)


{ /* GET RESULTS */


PRESULTS = (ADI_HAE_RESULT_STRUCT*)PARG; /* POINTER TO TXBUFFER1 OR TXBUFFER2 */


/* DO SOMETHING WITH THE RESULTS */


FOR (N=0; N


{


IRMS[N] = PRESULTS[N].IRMS;


VRMS[N] = PRESULTS[N].VRMS;


ACTIVEPWR[N] = PRESULTS[N].ACTIVEPWR;


}


} /* TRANSMIT INPUT SAMPLES TO HAE – 8KHZ */


IF (EEVENT == ADI_HAE_EVENT_INPUT_SAMPLE)


{ /* FIND LATETS SAMPLES FROM SINC BUFFER . */


ADI_HAE_INPUTSAMPLE(DEV, (SINC_IMEAS_DATA[PWM_SINC_LOOP]),(SINC_VEXT_DATA[PWM_SINC_LOOP]));


INDEX++;


IF (INDEX >= NUM_SAMPLES) INDEX = 0;


}


COUNT++;


}


(本文作者Martin Murnane为ADI系统架构师)