本篇文章主要介绍用于逆变电路的双极性SPWM波生成。
SPWM波就是脉冲宽度按正弦规律变化和正弦波等效的PWM波形,用于控制逆变电路中开关器件的通断,使其输出的脉冲电压的面积与所希望输出的正弦波在相应区间内的面积相等,经滤波后可以得到正弦波输出(也就是交流电)。通过改变调制波的频率和幅值则可调节逆变电路输出电压的频率和幅值。
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