基于fpga的微电网模拟系统
微電網(wǎng)模擬系統(tǒng)設(shè)計報告
題目:微電網(wǎng)模擬系統(tǒng)
摘要
本文針對微電網(wǎng)模擬系統(tǒng)研究背景,設(shè)計了可編程邏輯器件FPGA為控制核心的兩個三相逆變器系統(tǒng)。本系統(tǒng)的硬件主要由逆變主電路系統(tǒng)和FPGA控制電路系統(tǒng)構(gòu)成,包括FPGA控制電路、CC2640的AD采樣電路、三相逆變驅(qū)動電路、互感器電路、輔助電源電路、調(diào)壓整流電路、濾波及緩沖電路等。由FPGA控制電路輸出六路PWM信號(PWM1-PWM6)來控制逆變器的MOS管通斷,通過電流電壓互感器對輸出進(jìn)行反饋,再經(jīng)A/D轉(zhuǎn)換器進(jìn)行采樣,傳給FPGA控制電路來調(diào)節(jié)輸出,構(gòu)成閉環(huán)控制系統(tǒng)。本系統(tǒng)軟件設(shè)計是利用Verilog HDL的FPGA邏輯門、IP核、時鐘(DMC)等資源生成SPWM模塊、并行通信模塊結(jié)合TI的CC260的A/D采集和顯示模塊。最后,將軟硬件系統(tǒng)聯(lián)合調(diào)試,經(jīng)驗證,軟硬件都達(dá)到預(yù)期目標(biāo),實際效果較好。
關(guān)鍵字:微電網(wǎng)模擬系統(tǒng);FPGA可編程邏輯;三相逆變;SPWM模塊
目錄
1 方案論證 1
1.1 主控單元的比較與選擇 1
1.2 SPWM模塊的比較與選擇 1
1.3 驅(qū)動模塊的比較與選擇 1
1.4 方案描述 2
2 理論分析與計算 2
2.1 逆變器提高效率的方法 2
2.2 運行模式控制策略 3
3 電路與程序設(shè)計 3
3.1 逆變器主電路與器件選擇 3
3.1.1 總體系統(tǒng)電路 4
3.1.2 逆變電路 4
3.1.3 濾波電路 4
3.2 控制電路與控制程序 5
3.2.1 控制電路 5
3.2.2 控制程序 6
4 測試方案與測試結(jié)果 6
4.1 測試方案及測試條件 6
4.2 測試結(jié)果 7
4.3 測試結(jié)果分析 7
5 總結(jié) 7
參考文獻(xiàn) 8
附件 8
附1:元器件明細(xì)表 8
附2:儀器設(shè)備清單 8
附3:電路圖圖紙 9
附4:PCB圖 10
附6:程序清單 11
方案論證
主控單元的比較與選擇
方案一:采用數(shù)字信號處理器DSP。傳統(tǒng)基于DSP的逆變控制的設(shè)計雖然在計算的復(fù)雜度和軟件的靈活性上有一定優(yōu)勢,但是程序為順序運行從而導(dǎo)致逆變器控制算法在計算速度上受到很大的限制。
方案二:采用可編程邏輯器件FPGA。基于FPGA的逆變器的并行特點使其非常適合產(chǎn)生SPWM,從而在速度上占很大的優(yōu)勢,適合本題目要求。
綜上所述,選擇方案二。
SPWM模塊的比較與選擇
方案一:采用比較器對正弦波和三角波進(jìn)行比較得到PWM波,然后送入驅(qū)動電路放大再驅(qū)動MOSFET。但該方案受運放參數(shù)影響較大,調(diào)試?yán)щy。
方案二:運用可編程邏輯器件FPGA產(chǎn)生PWM通過正弦值查表法來產(chǎn)生SPWM。該方案實現(xiàn)簡單,有較強(qiáng)的抗干擾能力。
綜上所述,選擇方案二。
驅(qū)動模塊的比較與選擇
方案一:采用專用驅(qū)動芯片IRS2186搭建驅(qū)動電路。驅(qū)動芯片配合外圍電路完成,該方法優(yōu)點是系統(tǒng)的集成度高,有良好的過載和短路保護(hù)功能。。
方案二:采用分立元器件搭建驅(qū)動電路。電路中選用高速開關(guān)管8050和8550,其反應(yīng)速度可以達(dá)到微秒級,可以避免信號在傳輸過程中的累加延遲,有利于減少輸出波形的失真度。但電路較復(fù)雜化,需要額外搭建保護(hù)電路。
綜上所述,選擇方案一。
方案描述
本設(shè)計的整體方案主要有FPGA控制模塊,SPWM模塊,驅(qū)動模塊,A/D采樣模塊,OLED顯示模塊和并行通信模塊組成。
圖1 總體系統(tǒng)方案框架圖
理論分析與計算
逆變器提高效率的方法
逆變器效率提升技術(shù)主要集中在兩個方面:結(jié)構(gòu)和器件等硬件;控制及調(diào)制策略。
結(jié)構(gòu)及器件上的改進(jìn),采用軟開關(guān)技術(shù)通過諧振電路,實現(xiàn)功率器件在零電壓狀態(tài)下開通或者關(guān)斷,從而有效減小換流時MOS管的開關(guān)損耗,達(dá)到提升逆變器效率的目的。
控制策略的改進(jìn),采用電壓空間矢量脈寬調(diào)制技術(shù)通過三相交流電壓綜合在一起,通過對稱排列方式,可獲得減小MOS管開關(guān)次數(shù)的效果,從而能夠進(jìn)一步減小逆變器功率器件的開關(guān)損耗。
逆變器主電路與器件選擇
本系統(tǒng)器件選擇FPGA主控,LC濾波電路,全橋AOTF298L芯片,電壓電流互感器,OLED顯示屏,以及薄膜按鍵。
總體系統(tǒng)電路
圖2 總體系統(tǒng)電路圖
逆變電路
逆變電路的設(shè)計采用全控型MOSFET三相橋式逆變電路。由FPGA控制器產(chǎn)生SPWM到IRS2186芯片搭建的驅(qū)動電路,驅(qū)動電路控制MOSFET管的通斷,逆變輸出經(jīng)過低通濾波器將SPWM波形變換成較穩(wěn)定的正弦波電壓。在此電路中存在布線電感,在開關(guān)器件關(guān)斷的過程中容易出現(xiàn)過尖峰電壓,嚴(yán)重時會損壞開關(guān)器件,因此需要設(shè)置保護(hù)電路來抑制尖峰電壓,而且設(shè)置瞬態(tài)電壓抑制器和快速二極管組成的鉗位電路可將MOSFET關(guān)斷過程產(chǎn)生的尖峰電壓限制在安全范圍內(nèi),同時可以減少開關(guān)損耗。逆變電路圖如下:
圖3 逆變電路圖
濾波電路
濾波電路的設(shè)計在逆變器的輸出中含有逆變器開關(guān)頻率和開關(guān)頻率整數(shù)倍附近的諧波,如果不濾除這些高頻諧波,將會給電路帶來諧波污染。因此本設(shè)計選擇LC濾波電路。逆變?nèi)珮蜉敵龅氖?00KHz的SPWM方波,基波為工頻50Hz,還含有低次和高次諧波,其中幅值最大的是200KHz的諧波。在實際應(yīng)用中,忽略電感對負(fù)載的分壓作用及電容對負(fù)載的分流作用,并考慮變壓器的電感,經(jīng)計算及實驗調(diào)整后,取L =100u H,C=4.7uF/100V。
控制電路與控制程序
本系統(tǒng)采用FPGA和CC2640聯(lián)合控制方案,能更好的實現(xiàn)均流和任意比例電流輸出,達(dá)到較好并聯(lián)的效果。(控制電路見附錄)
控制程序
圖 4 主程序程序流程圖
測試方案與測試結(jié)果
第一步:將四通道示波器的三個探針接在單片機(jī)輸出PWM的引腳;
第二步:記錄輸出三相波形數(shù)據(jù);
第三步:改變單片機(jī)輸出SPWM的頻率,返回第一步操作,直到調(diào)出50HZ的SPWM波測試完。
測試結(jié)果
圖 5 三相輸出波形圖
測試結(jié)果分析
結(jié)果分析由數(shù)據(jù)表明,三相逆變電源輸出每路相位相差120度的頻率可調(diào)的正弦波,電壓有效值24V,電流最大輸出3A。基本實現(xiàn)所有功能,滿足題目要求。
總結(jié)
通過比賽,大大提高了我們的創(chuàng)新精神,動手能力,團(tuán)隊協(xié)作和競爭意識。充分發(fā)揮團(tuán)隊合作精神,工作進(jìn)展很順利。我們在比賽中做到精益求精,在完成基本功能之后,又向發(fā)揮部分進(jìn)發(fā),最后完成了所有的基本功能和發(fā)揮部分,較好的達(dá)到了題目要求的各項指標(biāo)。
參考文獻(xiàn)
[1] 邱關(guān)源.電路[M].北京:高等教育出版社,2003
[2] 華成英,童詩白.模擬電子技術(shù)基礎(chǔ)[M].北京:高等教育出版社,2006
[3] 李練兵,光伏發(fā)電并網(wǎng)逆變技術(shù):化學(xué)工業(yè)出版社,2016
[4] 路秋生,中大功率開關(guān)變換器:機(jī)械工業(yè)出版社,2017
附件
附1:元器件明細(xì)表
序號 元器件 數(shù)量
1 可編程邏輯器件FPGA 2
2 TLC272 1
3 MOS管 12
4 散熱片 2
5 電容 若干
6 INA282 10
7 電阻 若干
附2:儀器設(shè)備清單
序號 儀器 數(shù)量
1 四位半數(shù)字萬用表 4
2 數(shù)字電橋 1
3 直流穩(wěn)壓電源 1
4 函數(shù)信發(fā)生器 1
5 500MHz 4GSa/s數(shù)字示波器 1
附3:電路圖圖紙
附圖 1 過壓保護(hù)電路圖
附圖 2 主控制電路圖
附6:程序清單
FPGA代碼:
module sanxiangA
(clk,ah,al,bh,bl,ch,cl,hafeh,hafel,led,key_in,key_in1,key_out,data_in,
control_jk,din,sclk,sync,enable,ldac,v_back,flag_out,flag_in);
input clk;//輸入時鐘50M
input[1:0] data_in;
input v_back;//電壓采樣反饋
input[4:0] key_in1;//映射按鍵 key[4]是并聯(lián)控制信號
input[4:0] key_in; //按鍵輸入
output[4:0] key_out; //按鍵輸出
wire[4:0] key_out;//
assign key_out[3:0]=key_in[3:0];
assign key_out[4]=key_temp;
reg key_temp;
output control_jk;//并聯(lián)繼電器控制
reg control_jk=0;//0為繼電器斷開
input flag_in;
output flag_out;
wire flag_out;
assign flag_out=flag_a;
output hafeh;//50%pwm高管
output hafel;//50%pwm低管
output[3:0] led;
parameter[25:0] pwm_timer_full = 26’d1000;//pwm總計數(shù)1000次 即1000檔
reg[9:0] pwm_timer_high = 10’d450;//pwm最高檔位 不應(yīng)大于pwm_timer_full 用于調(diào)幅
reg[9:0] pwm_hold_a = 10’d10;//pwm高電平所用計數(shù)數(shù)量
reg[9:0] pwm_hold_b = 10’d10;//pwm高電平所用計數(shù)數(shù)量
reg[9:0] pwm_hold_c = 10’d10;//pwm高電平所用計數(shù)數(shù)量
reg[25:0] count_pwm_count_a=26’d0;//a通道的pwm計數(shù)
reg[25:0] count_pwm_count_b=26’d0;//b通道的pwm計數(shù)
reg[25:0] count_pwm_count_c=26’d0;//c通道的pwm計數(shù)
parameter[25:0] spwm_timer_1hz = 26’d25_000;//spwm計數(shù) 計數(shù)值為25’d24_999_999時為1HZ 實質(zhì)為半周期
reg[7:0] spwm_f = 8’d50;//spwm頻率
reg[25:0] count_spwm = 26’d49_999;//spwm計數(shù) 即一周期pwm波的總數(shù)量 用于設(shè)置spwm波的頻率 最大為25’d24_999_999 且count_spwm= spwm_timer_1hz / spwm_f
reg[25:0] count=26’d0;
reg[3:0] led;
reg flag=0;//為0時是單通道 為1時為并聯(lián)
reg flag_a=1;//為1時為上半波 為0時為下班波
reg flag_b=1;
reg flag_c=1;
reg[25:0] data_tatol=26’d500;//總數(shù)據(jù)量
reg[15:0] datax[0:500];//偏轉(zhuǎn)值數(shù)據(jù)庫
always@(posedge clk)
begin
channel<=D;
count_spwm<=spwm_timer_1hz/spwm_f;
if(flag_a1)begin pwm_hold_a<=10’d500+(datax[count_pwm_count_a*data_tatol/count_spwm]*pwm_timer_high/pwm_timer_full); end
if(flag_b1)begin pwm_hold_b<=10’d500+(datax[count_pwm_count_bdata_tatol/count_spwm]pwm_timer_high/pwm_timer_full); end
if(flag_c==1)begin pwm_hold_c<=10’d500+(datax[count_pwm_count_cdata_tatol/count_spwm]pwm_timer_high/pwm_timer_full); end
if(flag_a==0)begin pwm_hold_a<=10’d500-(datax[count_pwm_count_adata_tatol/count_spwm]pwm_timer_high/pwm_timer_full); end
if(flag_b==0)begin pwm_hold_b<=10’d500-(datax[count_pwm_count_bdata_tatol/count_spwm]pwm_timer_high/pwm_timer_full); end
if(flag_c==0)begin pwm_hold_c<=10’d500-(datax[count_pwm_count_cdata_tatol/count_spwm]pwm_timer_high/pwm_timer_full); end
led<=4’b1110;
count<=count+26’d1;
if(count26’d1) begin ah<=1;bh<=1;ch<=1;al<=0;bl<=0;cl<=0; end
if(countpwm_hold_a) begin ah<=0; end
if(countpwm_hold_b) begin bh<=0; end
if(countpwm_hold_c) begin ch<=0; end
if((countpwm_hold_a+10’d5)&(pwm_hold_a<pwm_timer_full-10’d5)) begin al<=1; end
if((countpwm_hold_b+10’d5)&(pwm_hold_a<pwm_timer_full-10’d5)) begin bl<=1; end
if((countpwm_hold_c+10’d5)&(pwm_hold_a<pwm_timer_full-10’d5)) begin cl<=1; end
if(countpwm_timer_full-10’d5) begin al<=0;bl<=0;cl<=0; end
if(countpwm_timer_full) begin count<=26’d0;key_temp<=1;
else begin pwm_timer_high<=pwm_timer_high-10’d1; end end //反饋電壓監(jiān)控
count_pwm_count_a<=count_pwm_count_a+26’d1;
count_pwm_count_b<=count_pwm_count_b+26’d1;
count_pwm_count_c<=count_pwm_count_c+26’d1;
end
if(pwm_hold_a0) begin ah<=0; end
if(pwm_hold_b0) begin bh<=0; end
if(pwm_hold_c0) begin ch<=0; end
if((count_pwm_count_a>count_spwm)&&(count26’d0)) begin count_pwm_count_a<=8’d0;flag_a<=~flag_a;key_temp<=0; end
if((count_pwm_count_acount_spwm2/3)&&(count26’d0)) begin count_pwm_count_b<=8’d0;flag_b<=~flag_b;end
if((count_pwm_count_bcount_spwm2/3)&&(count==26’d0)) begin count_pwm_count_c<=8’d0;flag_c<=~flag_c;end
/以下為按鍵監(jiān)控/
if ( flag_key[0] )begin if(spwm_f>=8’d100)begin spwm_f<=8’d100; end else begin spwm_f<=spwm_f+8’d1; end end
if ( flag_key[1] )begin if(spwm_f<=8’d0) begin spwm_f<=8’d0; end else begin spwm_f<=spwm_f-8’d1; end end
// if ( flag_key[2] )begin if(data>=16’h3998)begin data<=16’h3998; end else begin data<=data+16’d1; end end
// if ( flag_key[3] )begin if(data16’h666) begin data<=16’h666; end else begin data<=data+16’d1; end end
if ( flag_key[2] )begin if(pwm_timer_high>=10’d475)begin pwm_timer_high<=10’d475; end else begin pwm_timer_high<=pwm_timer_high+10’d20; end end
if ( flag_key[3] )begin if(pwm_timer_high<=10’d25)begin pwm_timer_high<=10’d25; end else begin pwm_timer_high<=pwm_timer_high-10’d20; end end
if ( flag_key[4] )begin
begin flag_a<=flag_in;count_pwm_count_a<=8’d0;count<=26’d0; end
end
if ( flag_key1[0] )begin if(spwm_f>=8’d100) begin spwm_f<=8’d100; end else begin spwm_f<=spwm_f+8’d1; end end
if ( flag_key1[1] )begin if(spwm_f<=8’d0) begin spwm_f<=8’d0; end else begin spwm_f<=spwm_f-8’d1; end end
// if ( flag_key[2] )begin if(data>=16’h3998)begin data<=16’h3998; end else begin data<=data+16’d1; end end
// if ( flag_key[3] )begin if(data16’h666) begin data<=16’h666; end else begin data<=data+16’d1; end end
if ( flag_key1[2] )begin if(pwm_timer_high>=10’d480)begin pwm_timer_high<=10’d475; end else begin pwm_timer_high<=pwm_timer_high+10’d10; end end
if ( flag_key1[3] )begin if(pwm_timer_high<=10’d25)begin pwm_timer_high<=10’d25; end else begin pwm_timer_high<=pwm_timer_high-10’d10; end end
if ( flag_key1[4] )begin
begin flag_a<=flag_in;count_pwm_count_a<=8’d0;count<=26’d0; end
//以下為外部來著2640的電壓控制
// data<=16’h3fff;channel<=D;
// case(data_in)
// 1: begin if(data>=16’h3998)begin data<=16’h3998; end else begin data<=data+16’d1; end end
// 2: begin if(data<=16’h666) begin data<=16’h666; end else begin data<=data+16’d1; end end
// 3: begin data<=data; end
// default: begin data<=16’d12000;channel<=C;end
// endcase
end
/以下為50%pwm輸出/
reg[9:0] count_hafe=10’d0;
always@(posedge clk)
begin
if(count_hafe500) begin hafeh<=0; end
if(count_hafe505) begin hafel<=1; end
if(count_hafe995) begin hafel<=0; end
if(count_hafe1000)begin hafeh<=1;count_hafe<=count_hafe+10’d1; end
count_hafe<=count_hafe+10’d1;
end
/以下為按鍵設(shè)置/
reg[19:0] counttimer=20’d0;
reg[4:0] key_scan;
reg[4:0] key_scan1;
always@(posedge clk)
begin
if(counttimer ==20’d999_999) //20ms 掃描一次按鍵,20ms 計數(shù)(50M/50-1=999_999)
begin
counttimer <= 20’b0; //計數(shù)器計到 20ms,計數(shù)器清零
key_scan <= key_in; //采樣按鍵輸入電平
key_scan1 <= key_in1; //映射按鍵輸入電平
end
else counttimer <= counttimer + 20’b1; //計數(shù)器加 1
end
reg [4:0] key_scan_r;
reg [4:0] key_scan_r1;
always @(posedge clk)
begin
key_scan_r <= key_scan;
key_scan_r1 <= key_scan1;
end
wire [4:0] flag_key = key_scan_r[4:0] & (~key_scan[4:0]); //當(dāng)檢測到按鍵有下降沿變化時,代表該按鍵被按下,按鍵有效
wire [4:0] flag_key1 = key_scan_r1[4:0] & (~key_scan1[4:0]); //當(dāng)檢測到按鍵有下降沿變化時,代表該按鍵被按下,按鍵有效
//以下為dac參考電壓控制模塊設(shè)置
output din;
output sclk;
output sync;
output enable;
output ldac;
reg[1:0] channel=2’d1;
reg[15:0] data=16’d12000;
parameter A=2’d0,B=2’d1,C=2’d2,D=2’d3;
DAC8164_spi_control t1(.clk(clk),.channel(channel),.data(data),.din(din),.sclk(sclk),.sync(sync),
.enable(enable),.ldac(ldac));
endmodule
CC2640代碼:
#include <xdc/runtime/Error.h>
#include <ti/sysbios/family/arm/cc26xx/Power.h>
#include <ti/sysbios/BIOS.h>
#include “ICall.h”
#include “bcomdef.h”
#include “peripheral.h”
#include “simpleBLEPeripheral.h”
/* Header files required to enable instruction fetch cache */
#include <inc/hw_memmap.h>
#include <driverlib/vims.h>
#ifndef USE_DEFAULT_USER_CFG
#include “bleUserConfig.h”
// BLE user defined configuration
bleUserCfg_t user0Cfg = BLE_USER_CFG;
#endif // USE_DEFAULT_USER_CFG
/Exception handler/
void exceptionHandler()
{
volatile uint8_t i = 1;
while(i){}
}
#ifdef FEATURE_OAD
#if defined(IAR_SYSTEMS_ICC)
extern uint32_t __vector_table;
#elif defined (TI_COMPILER_VERSION)
extern uint32_t ti_sysbios_family_arm_m3_Hwi_resetVectors;
#endif //Compiler
#endif //FEATURE_OAD
/======== main ========/
int main()
{
PIN_init(BoardGpioInitTable);
#ifndef POWER_SAVING
Power_setConstraint(Power_SB_DISALLOW);
Power_setConstraint(Power_IDLE_PD_DISALLOW);
#endif // POWER_SAVING
/* Initialize ICall module /
ICall_init();
/ Start tasks of external images - Priority 5 /
ICall_createRemoteTasks();
/ Kick off profile - Priority 3 */
GAPRole_createTask();
SimpleBLEPeripheral_createTask();
#ifdef FEATURE_OAD
{
uint8_t counter;
uint32_t vectorTable = (uint32_t) 0x20000000;
#if defined(IAR_SYSTEMS_ICC)
uint32_t *flashVectors = &__vector_table;
#elif defined(TI_COMPILER_VERSION)
uint32_t *flashVectors = &ti_sysbios_family_arm_m3_Hwi_resetVectors;
#endif //Compiler.
// Write image specific interrupt vectors into RAM vector table.
for(counter = 0; counter < 15; ++counter)
{
*vectorTable++ = flashVectors++;
}
}
#endif //FEATURE_OAD
/ enable interrupts and start SYS/BIOS */
BIOS_start();
return 0;
}
總結(jié)
以上是生活随笔為你收集整理的基于fpga的微电网模拟系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于考证(已通过高项、CISA、CISS
- 下一篇: Linux下tomcat进程莫名消失