• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

基于FPGA正弦逆变器,可调频、移相。

小弟今年大二结束,之前一直在学习单片机与FPGA,暑假无聊刚接触逆变,有愚拙之处敬请指出。(之所以用FPGA而不用专业的SPWM驱动芯片是因为最终的项目要实现0.1°移相、0.01HZ调频功能及其他扩展功能。(比如可能要用FPGA做光伏并网的相位、频率跟踪)这些是其它芯片所做不到的。)

这个基于FPGA的逆变器最终是要做成三相、六路的"三相工频测试源",三路恒流、三路恒压,(直接市电整流滤波供电)。且电压、电流幅值、相位、频率均可调。 目前先把单相的给大家展示一下、原理都一样。(三相的也还没完成呢,主要是H桥的驱动还是有点问题,想请大家帮下下忙,问题解决完毕后我将像老寿一样公布   所有技术资料)

 

     上图为FPGA输出SPWM波形图,为单极性调制。逻辑控制与延时是在FPGA内部做的。输出四路SPWM直接接上IR2110或TLP250,即可驱动后级H桥。

下图为FPGA生成SPWM的结构图(单相的,是用那种四个管子都一半高频、一半低频的方式调制)。

原理跟纯硬件的差不多,就是将正弦波、三角波的数据先生成好放到ROM中,用两路驱动信号分别驱动两个模块,再把输出数据进行比较就生成的SPWM了。三角波和正弦波的频率、幅值都可以很好的控制。

   上图只是说明一下FPGA产生SPWM的原理,调频模块直接用锁相环替代。逻辑控制调用非门与或门,死区用程序写的,想要多少设置多少。

空载波形:

 

带载300W波形:(波形还不错,就是散热片有点小,发热有点大,不敢再加了,且发热不均。左上管发热最严重,80度左右,右下管几乎温的。目前此问题还没有解决。)输出250V,由于示波器探头只有10倍衰减档位所以只能看一半了。

 

 


 接大电用的TLP250。FPGA一百多一块儿,怕烧。

全部回复(20)
正序查看
倒序查看
2013-08-24 16:57

 

TLP250驱动板图;

后级H桥电路比较简单应该是没有问题的,用的是老寿的图。

  

现在的问题是用TLP250驱动上管的波形输出多了一块儿,而这一块儿正好是死区。

第一张图上管G极的驱动波形和S输出波形,G极波形应该是正确的,高电平等于电源电压加上驱动电压,截止时当下管未导通,保持电源电压,导通时等于地电压。 

第二张是上管S极波形与下管G极波形,多了那一块,导致没有死区。

0
回复
2013-08-24 18:36
@朱振豪1992
[图片] TLP250驱动板图;后级H桥电路比较简单应该是没有问题的,用的是老寿的图。[图片] [图片] 现在的问题是用TLP250驱动上管的波形输出多了一块儿,而这一块儿正好是死区。第一张图上管G极的驱动波形和S输出波形,G极波形应该是正确的,高电平等于电源电压加上驱动电压,截止时当下管未导通,保持电源电压,导通时等于地电压。 第二张是上管S极波形与下管G极波形,多了那一块,导致没有死区。
楼主研究精神可嘉啊,本人也是大二,以后大家一起讨论啊。。
0
回复
IGBT2010
LV.8
4
2013-08-24 23:17
@朱振豪1992
[图片] TLP250驱动板图;后级H桥电路比较简单应该是没有问题的,用的是老寿的图。[图片] [图片] 现在的问题是用TLP250驱动上管的波形输出多了一块儿,而这一块儿正好是死区。第一张图上管G极的驱动波形和S输出波形,G极波形应该是正确的,高电平等于电源电压加上驱动电压,截止时当下管未导通,保持电源电压,导通时等于地电压。 第二张是上管S极波形与下管G极波形,多了那一块,导致没有死区。
波形很不错,楼主继续努力!!!
0
回复
2013-08-24 23:33
@朱振豪1992
[图片] TLP250驱动板图;后级H桥电路比较简单应该是没有问题的,用的是老寿的图。[图片] [图片] 现在的问题是用TLP250驱动上管的波形输出多了一块儿,而这一块儿正好是死区。第一张图上管G极的驱动波形和S输出波形,G极波形应该是正确的,高电平等于电源电压加上驱动电压,截止时当下管未导通,保持电源电压,导通时等于地电压。 第二张是上管S极波形与下管G极波形,多了那一块,导致没有死区。
用的泰克的仪器啊,感觉怎么样?
0
回复
2013-08-24 23:38
@电源网-娜娜姐
用的泰克的仪器啊,感觉怎么样?
感觉还行吧吧,比模拟的强,因为也没用过别的数字示波器。学校提供的,呵呵....
0
回复
2013-08-24 23:39
@朱振豪1992
[图片] TLP250驱动板图;后级H桥电路比较简单应该是没有问题的,用的是老寿的图。[图片] [图片] 现在的问题是用TLP250驱动上管的波形输出多了一块儿,而这一块儿正好是死区。第一张图上管G极的驱动波形和S输出波形,G极波形应该是正确的,高电平等于电源电压加上驱动电压,截止时当下管未导通,保持电源电压,导通时等于地电压。 第二张是上管S极波形与下管G极波形,多了那一块,导致没有死区。
牛逼,老弟
0
回复
2013-08-24 23:40
@已是悬崖百丈冰
牛逼,老弟
没你牛啊    你的恒流源才牛啊
0
回复
2013-08-24 23:58
@wwpwwp20088
楼主研究精神可嘉啊,本人也是大二,以后大家一起讨论啊。。
好的 谢谢关注啊
0
回复
2013-08-25 09:06
@朱振豪1992
感觉还行吧吧,比模拟的强,因为也没用过别的数字示波器。学校提供的,呵呵....
没事多来论坛学习,很多牛人能帮助到你,不过你的宿舍有点……哈哈
0
回复
2013-08-25 09:49
@电源网-娜娜姐
没事多来论坛学习,很多牛人能帮助到你,不过你的宿舍有点……哈哈
嘿嘿,这是我们卡文迪许实验室!
0
回复
2013-08-26 11:22
能否将您的FPGA程序发一份给我,谢谢longzhizi_cz@qq.com
0
回复
07611128
LV.2
13
2013-08-26 20:08
@电源一刀
能否将您的FPGA程序发一份给我,谢谢longzhizi_cz@qq.com
我现在卡到死区设置这里了,额,感觉好不爽,我用的64的dds,外接键盘基本可以控制到频率0.0001的精度了
0
回复
2013-08-26 23:31
@07611128
我现在卡到死区设置这里了,额,感觉好不爽,我用的64的dds,外接键盘基本可以控制到频率0.0001的精度了

···dds理论精度是可以达到0.0001HZ的,甚至更高。但是仅限方波,正弦波我用8位DA最高只能做到0.01,这个我做过,因为测频本身就先要把正弦变成方波,自身就存在误差。(三相工频信号源如下图)

 

 

 

 

 

·····至于你说的64DDS 我还真不知道啥意思。死区设置其实很简单,就是把信号上升沿延时一下就好了。建议你先看看纯硬件的死区设置是怎么搞得?不过FPGA设置死区网上还真找不到。我给你发一个,你参考一下兄弟...

module siqu(clk,out,in);//clk驱动信号,in输入信号,out输出信号,count死区时间设定变量
input   clk,in;
output  out;  
reg     out;
reg[7:0] count;

always @ (posedge clk) 
begin
 if(in==0)
 out=in;
 else
 begin
  count=count+1;
  if(count==10)
  begin
  out=1;
  count=0;
  end
 end
end     
endmodule

0
回复
2013-08-27 00:17
@朱振豪1992
···dds理论精度是可以达到0.0001HZ的,甚至更高。但是仅限方波,正弦波我用8位DA最高只能做到0.01,这个我做过,因为测频本身就先要把正弦变成方波,自身就存在误差。(三相工频信号源如下图)[图片]  [图片]  [图片] ·····至于你说的64DDS我还真不知道啥意思。死区设置其实很简单,就是把信号上升沿延时一下就好了。建议你先看看纯硬件的死区设置是怎么搞得?不过FPGA设置死区网上还真找不到。我给你发一个,你参考一下兄弟...modulesiqu(clk,out,in);//clk驱动信号,in输入信号,out输出信号,count死区时间设定变量input  clk,in;output out;  reg    out;reg[7:0]count;always@(posedgeclk) begin if(in==0) out=in; else begin  count=count+1;  if(count==10)  begin  out=1;  count=0;  end endend   endmodule
这才是好东西,另外想问下,你的FPGA功耗如何。
0
回复
07611128
LV.2
16
2013-08-27 01:09
@朱振豪1992
···dds理论精度是可以达到0.0001HZ的,甚至更高。但是仅限方波,正弦波我用8位DA最高只能做到0.01,这个我做过,因为测频本身就先要把正弦变成方波,自身就存在误差。(三相工频信号源如下图)[图片]  [图片]  [图片] ·····至于你说的64DDS我还真不知道啥意思。死区设置其实很简单,就是把信号上升沿延时一下就好了。建议你先看看纯硬件的死区设置是怎么搞得?不过FPGA设置死区网上还真找不到。我给你发一个,你参考一下兄弟...modulesiqu(clk,out,in);//clk驱动信号,in输入信号,out输出信号,count死区时间设定变量input  clk,in;output out;  reg    out;reg[7:0]count;always@(posedgeclk) begin if(in==0) out=in; else begin  count=count+1;  if(count==10)  begin  out=1;  count=0;  end endend   endmodule
reg[63:0] freq_count,tri_freq_count;
就是他的计数啊,fpga理论上可以搞到128位的,谢谢啦,我试一下这个死区的~~
0
回复
2013-08-27 09:32
@lizlk
这才是好东西,另外想问下,你的FPGA功耗如何。
FPGA用的是ALTERA公司的EP4CE622C8N,功耗不太清楚,也不太关心。反正长时间工作也不发热,驱动能力挺强的,可以直接驱动TLP250。
0
回复
Graysky
LV.3
18
2013-08-28 10:43

厉害!

0
回复
ma19926123
LV.1
19
2013-08-31 13:10
@朱振豪1992
好的谢谢关注啊

楼主您好,我也用fpga这样做过,没有用fpga处理过死区时间,用的是2110驱动全桥的,最后出来的波形确实丑的不行,当时滤波处理的不好

0
回复
ma19926123
LV.1
20
2013-08-31 13:36
@电源一刀
能否将您的FPGA程序发一份给我,谢谢longzhizi_cz@qq.com
同求,谢谢楼主379463010@qq.com
0
回复
IGBT2010
LV.8
21
2015-06-27 11:19
@朱振豪1992
···dds理论精度是可以达到0.0001HZ的,甚至更高。但是仅限方波,正弦波我用8位DA最高只能做到0.01,这个我做过,因为测频本身就先要把正弦变成方波,自身就存在误差。(三相工频信号源如下图)[图片]  [图片]  [图片] ·····至于你说的64DDS我还真不知道啥意思。死区设置其实很简单,就是把信号上升沿延时一下就好了。建议你先看看纯硬件的死区设置是怎么搞得?不过FPGA设置死区网上还真找不到。我给你发一个,你参考一下兄弟...modulesiqu(clk,out,in);//clk驱动信号,in输入信号,out输出信号,count死区时间设定变量input  clk,in;output out;  reg    out;reg[7:0]count;always@(posedgeclk) begin if(in==0) out=in; else begin  count=count+1;  if(count==10)  begin  out=1;  count=0;  end endend   endmodule
最好用状态机实现,思路清晰明了。
0
回复