基于fpga的微电网模拟系统
微電網模擬系統設計報告
題目:微電網模擬系統
摘要
本文針對微電網模擬系統研究背景,設計了可編程邏輯器件FPGA為控制核心的兩個三相逆變器系統。本系統的硬件主要由逆變主電路系統和FPGA控制電路系統構成,包括FPGA控制電路、CC2640的AD采樣電路、三相逆變驅動電路、互感器電路、輔助電源電路、調壓整流電路、濾波及緩沖電路等。由FPGA控制電路輸出六路PWM信號(PWM1-PWM6)來控制逆變器的MOS管通斷,通過電流電壓互感器對輸出進行反饋,再經A/D轉換器進行采樣,傳給FPGA控制電路來調節輸出,構成閉環控制系統。本系統軟件設計是利用Verilog HDL的FPGA邏輯門、IP核、時鐘(DMC)等資源生成SPWM模塊、并行通信模塊結合TI的CC260的A/D采集和顯示模塊。最后,將軟硬件系統聯合調試,經驗證,軟硬件都達到預期目標,實際效果較好。
關鍵字:微電網模擬系統;FPGA可編程邏輯;三相逆變;SPWM模塊
目錄
1 方案論證 1
1.1 主控單元的比較與選擇 1
1.2 SPWM模塊的比較與選擇 1
1.3 驅動模塊的比較與選擇 1
1.4 方案描述 2
2 理論分析與計算 2
2.1 逆變器提高效率的方法 2
2.2 運行模式控制策略 3
3 電路與程序設計 3
3.1 逆變器主電路與器件選擇 3
3.1.1 總體系統電路 4
3.1.2 逆變電路 4
3.1.3 濾波電路 4
3.2 控制電路與控制程序 5
3.2.1 控制電路 5
3.2.2 控制程序 6
4 測試方案與測試結果 6
4.1 測試方案及測試條件 6
4.2 測試結果 7
4.3 測試結果分析 7
5 總結 7
參考文獻 8
附件 8
附1:元器件明細表 8
附2:儀器設備清單 8
附3:電路圖圖紙 9
附4:PCB圖 10
附6:程序清單 11
方案論證
主控單元的比較與選擇
方案一:采用數字信號處理器DSP。傳統基于DSP的逆變控制的設計雖然在計算的復雜度和軟件的靈活性上有一定優勢,但是程序為順序運行從而導致逆變器控制算法在計算速度上受到很大的限制。
方案二:采用可編程邏輯器件FPGA。基于FPGA的逆變器的并行特點使其非常適合產生SPWM,從而在速度上占很大的優勢,適合本題目要求。
綜上所述,選擇方案二。
SPWM模塊的比較與選擇
方案一:采用比較器對正弦波和三角波進行比較得到PWM波,然后送入驅動電路放大再驅動MOSFET。但該方案受運放參數影響較大,調試困難。
方案二:運用可編程邏輯器件FPGA產生PWM通過正弦值查表法來產生SPWM。該方案實現簡單,有較強的抗干擾能力。
綜上所述,選擇方案二。
驅動模塊的比較與選擇
方案一:采用專用驅動芯片IRS2186搭建驅動電路。驅動芯片配合外圍電路完成,該方法優點是系統的集成度高,有良好的過載和短路保護功能。。
方案二:采用分立元器件搭建驅動電路。電路中選用高速開關管8050和8550,其反應速度可以達到微秒級,可以避免信號在傳輸過程中的累加延遲,有利于減少輸出波形的失真度。但電路較復雜化,需要額外搭建保護電路。
綜上所述,選擇方案一。
方案描述
本設計的整體方案主要有FPGA控制模塊,SPWM模塊,驅動模塊,A/D采樣模塊,OLED顯示模塊和并行通信模塊組成。
圖1 總體系統方案框架圖
理論分析與計算
逆變器提高效率的方法
逆變器效率提升技術主要集中在兩個方面:結構和器件等硬件;控制及調制策略。
結構及器件上的改進,采用軟開關技術通過諧振電路,實現功率器件在零電壓狀態下開通或者關斷,從而有效減小換流時MOS管的開關損耗,達到提升逆變器效率的目的。
控制策略的改進,采用電壓空間矢量脈寬調制技術通過三相交流電壓綜合在一起,通過對稱排列方式,可獲得減小MOS管開關次數的效果,從而能夠進一步減小逆變器功率器件的開關損耗。
逆變器主電路與器件選擇
本系統器件選擇FPGA主控,LC濾波電路,全橋AOTF298L芯片,電壓電流互感器,OLED顯示屏,以及薄膜按鍵。
總體系統電路
圖2 總體系統電路圖
逆變電路
逆變電路的設計采用全控型MOSFET三相橋式逆變電路。由FPGA控制器產生SPWM到IRS2186芯片搭建的驅動電路,驅動電路控制MOSFET管的通斷,逆變輸出經過低通濾波器將SPWM波形變換成較穩定的正弦波電壓。在此電路中存在布線電感,在開關器件關斷的過程中容易出現過尖峰電壓,嚴重時會損壞開關器件,因此需要設置保護電路來抑制尖峰電壓,而且設置瞬態電壓抑制器和快速二極管組成的鉗位電路可將MOSFET關斷過程產生的尖峰電壓限制在安全范圍內,同時可以減少開關損耗。逆變電路圖如下:
圖3 逆變電路圖
濾波電路
濾波電路的設計在逆變器的輸出中含有逆變器開關頻率和開關頻率整數倍附近的諧波,如果不濾除這些高頻諧波,將會給電路帶來諧波污染。因此本設計選擇LC濾波電路。逆變全橋輸出的是200KHz的SPWM方波,基波為工頻50Hz,還含有低次和高次諧波,其中幅值最大的是200KHz的諧波。在實際應用中,忽略電感對負載的分壓作用及電容對負載的分流作用,并考慮變壓器的電感,經計算及實驗調整后,取L =100u H,C=4.7uF/100V。
控制電路與控制程序
本系統采用FPGA和CC2640聯合控制方案,能更好的實現均流和任意比例電流輸出,達到較好并聯的效果。(控制電路見附錄)
控制程序
圖 4 主程序程序流程圖
測試方案與測試結果
第一步:將四通道示波器的三個探針接在單片機輸出PWM的引腳;
第二步:記錄輸出三相波形數據;
第三步:改變單片機輸出SPWM的頻率,返回第一步操作,直到調出50HZ的SPWM波測試完。
測試結果
圖 5 三相輸出波形圖
測試結果分析
結果分析由數據表明,三相逆變電源輸出每路相位相差120度的頻率可調的正弦波,電壓有效值24V,電流最大輸出3A。基本實現所有功能,滿足題目要求。
總結
通過比賽,大大提高了我們的創新精神,動手能力,團隊協作和競爭意識。充分發揮團隊合作精神,工作進展很順利。我們在比賽中做到精益求精,在完成基本功能之后,又向發揮部分進發,最后完成了所有的基本功能和發揮部分,較好的達到了題目要求的各項指標。
參考文獻
[1] 邱關源.電路[M].北京:高等教育出版社,2003
[2] 華成英,童詩白.模擬電子技術基礎[M].北京:高等教育出版社,2006
[3] 李練兵,光伏發電并網逆變技術:化學工業出版社,2016
[4] 路秋生,中大功率開關變換器:機械工業出版社,2017
附件
附1:元器件明細表
序號 元器件 數量
1 可編程邏輯器件FPGA 2
2 TLC272 1
3 MOS管 12
4 散熱片 2
5 電容 若干
6 INA282 10
7 電阻 若干
附2:儀器設備清單
序號 儀器 數量
1 四位半數字萬用表 4
2 數字電橋 1
3 直流穩壓電源 1
4 函數信發生器 1
5 500MHz 4GSa/s數字示波器 1
附3:電路圖圖紙
附圖 1 過壓保護電路圖
附圖 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]是并聯控制信號
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;//并聯繼電器控制
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總計數1000次 即1000檔
reg[9:0] pwm_timer_high = 10’d450;//pwm最高檔位 不應大于pwm_timer_full 用于調幅
reg[9:0] pwm_hold_a = 10’d10;//pwm高電平所用計數數量
reg[9:0] pwm_hold_b = 10’d10;//pwm高電平所用計數數量
reg[9:0] pwm_hold_c = 10’d10;//pwm高電平所用計數數量
reg[25:0] count_pwm_count_a=26’d0;//a通道的pwm計數
reg[25:0] count_pwm_count_b=26’d0;//b通道的pwm計數
reg[25:0] count_pwm_count_c=26’d0;//c通道的pwm計數
parameter[25:0] spwm_timer_1hz = 26’d25_000;//spwm計數 計數值為25’d24_999_999時為1HZ 實質為半周期
reg[7:0] spwm_f = 8’d50;//spwm頻率
reg[25:0] count_spwm = 26’d49_999;//spwm計數 即一周期pwm波的總數量 用于設置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時為并聯
reg flag_a=1;//為1時為上半波 為0時為下班波
reg flag_b=1;
reg flag_c=1;
reg[25:0] data_tatol=26’d500;//總數據量
reg[15:0] datax[0:500];//偏轉值數據庫
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 //反饋電壓監控
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
/以下為按鍵監控/
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
/以下為按鍵設置/
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 計數(50M/50-1=999_999)
begin
counttimer <= 20’b0; //計數器計到 20ms,計數器清零
key_scan <= key_in; //采樣按鍵輸入電平
key_scan1 <= key_in1; //映射按鍵輸入電平
end
else counttimer <= counttimer + 20’b1; //計數器加 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]); //當檢測到按鍵有下降沿變化時,代表該按鍵被按下,按鍵有效
wire [4:0] flag_key1 = key_scan_r1[4:0] & (~key_scan1[4:0]); //當檢測到按鍵有下降沿變化時,代表該按鍵被按下,按鍵有效
//以下為dac參考電壓控制模塊設置
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;
}
總結
以上是生活随笔為你收集整理的基于fpga的微电网模拟系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于考证(已通过高项、CISA、CISS
- 下一篇: Linux下tomcat进程莫名消失