本篇文章主要介绍用于逆变电路的双极性SPWM波生成。
SPWM波就是脉冲宽度按正弦规律变化和正弦波等效的PWM波形,用于控制逆变电路中开关器件的通断,使其输出的脉冲电压的面积与所希望输出的正弦波在相应区间内的面积相等,经滤波后可以得到正弦波输出(也就是交流电)。通过改变调制波的频率和幅值则可调节逆变电路输出电压的频率和幅值。
-
1、SPWM波生成
简单来说,spwm波就是以正弦波为调制波,三角波为载波调制生成的。接下来就介绍一下正弦波和三角波是怎么生成的吧。
-
2、三角波生成
三角波生成挺简单的,利用计数器递增就行了,在这里其实可以用三角波,也可以用锯齿波,但一般来说,用三角波效果应该会好很多。因为我写的代码是verilog,就直接把verilog代码贴出来吧。
module tri_rom
(
input clk,
input rst_n,
input [11:0]top,
output reg [11:0]tri_wave
);
reg [11:0]cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt<=12'd0;
else
begin
if(cnt<top)
cnt<=cnt+12'd1;
else
cnt<=12'd0;
if(cnt<(top/2))
tri_wave<=cnt*2;
else
tri_wave<=(top-cnt)*2;
end
end
endmodule
或者这个
module tri_rom(
input clk,
input [15:0] top,
output reg [15:0] tri_wave
);
reg [15:0] cnt=16'd0;
always@(posedge clk)
begin
if(cnt<top)
cnt<=cnt+1'd1;
else
cnt<=15'd0;
if(cnt<(top/2))
tri_wave<=cnt*8;
else
tri_wave<=(top-cnt)*8;
end
endmodule
也可以用波表来生成。
原理大家自己理解,挺简单的,不做过多描述
-
3、正弦波生成
正弦波的生成就是靠波表。先在matlab生成一个正弦波波表。
然后在quatus中创建一个ROM
把matlab中生成的正弦波表导入进来
ROM就设置好了,需要注意的是,ROM读取的位数和容量要和matlab生成的波表一致。在verilog中读取波表的频率可以自行控制,主要的方法是:假设我们波表中有1000个数,也就是说,一个周期的正弦波采样1000个数形成波表。现在用50KHz的时钟,以10为步进读取波表,那么显然需要读取1000/10=100次才能输出一个正弦波表。也就是说,我们需要50KHz/100=500Hz的频率输出一个波表,即输出正弦波的频率为500Hz。
顺表提一下,为了精确的控制频率,这个步进10(也可以说是频率控制字)可以用定点数进行运算。
再贴一下正弦波生成的代码
module sin(
input clk,
input rst_n,
input [10:0]KW,
output [10:0]out_sin
);
reg [20:0]phase;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
phase<=21'd0;
else
phase<=phase+KW;
end
wire [10:0]addr_sin=(phase[20:10]>11'd1024)?(phase[20:10]-11'd1024):phase[20:10];
sin_rom rom_sin_inst
(
.address ( addr_sin ),
.clock ( clk ),
.q ( out_sin )
);
endmodule
-
4、生成SPWM波
将三角波和正弦波进行比较就可以得到SPWM波。在逆变中,要考虑到调制度以及偏置的问题,如下图:
-
5、单极性SPWM波和双极性SPWM波的区别
最后想说一下单极性和双极性的区别。主要就是单极性在峰值(±1)处的占空比最大,占空比变化规律是从小到大,再从大到小。单极性应该可以用余弦波代替正弦波生成(如果不是,希望指正!)