热度 4||
一、基础理论方面
1)PWM是脉冲宽度调制(Pulse Width Modulation)的简称,它在自动控制和计算机技术领域中都有广泛的应用。PWM调制原理 ---------PWM 波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。
正弦脉宽调制(SPWM)技术在交流调速系统中得到广泛应用,但SPWM的波形生成是应用中一个难点,目前形成SPWM的方法有:(1)由分立元件构成,结构简单,但可靠性和精度均不能满足要求;(2)采用计算机计算或查表方式,省却了硬件电路,但CPU负担很重; (3)采用专用集成电路,如SLE4520、SA4828等,但其功能固定,可扩展性差;(4)采用FPGA(现场可编门阵列),具有速度快、精度高且可以在线编程修改等优点,是一种较好的方案。
实现SPWM原理;用输出的正弦信号作为调制波,用高频三角波作为载波.。
SPWM就是在对一个正弦波进行脉宽调制时,使脉冲系列的占空比按正弦规律来排列。当正弦值为最大值时,脉冲的宽度也最大,而脉冲间的间隔则最小。反之,当正弦值较小时,脉冲的宽度也较小,而脉冲间的间隔则较
正弦波的峰值电压与三角波峰值电压之比,通常称为SPWM的模
令三角波频率与正弦波频率之比为载波比,载波比越大,产生的SPWM波的“精度”上越高。
SPWM波的具体理论和实现方法还是比较多的,这方面没有深入研究,仅想说明,笔者,也就我呢,是根据对称规则采样方法实现的。
二、基于FPGA的实现简易SPWM波的生成-------顶层文件的代码说明
module spwm(
clock,key,
A_Data,B_Data,C_Data,
tri_q,da_clk,flag,led,
SPWM_A,SPWM_B,SPWM_C
);
input clock; //系统时钟
input key;// 按键频率控制
output reg [7:0] A_Data,B_Data,C_Data;//三相正弦表格输出值,SignalTap调试中查看数据
output [8:0] tri_q; //DA数据输出
output da_clk; //DA时钟输出
output flag,led;
output SPWM_A ,SPWM_B,SPWM_C;//对外输出的相移120的正弦脉宽调制信号
wire tri_clk,tri_updn;//可逆计数器的时钟和计数方向(用于控制三角波的生成)
wire [31:0]fword;
int_div div (.clock(clock),
.clk_out(da_clk));//该部分主要是在SignalTap调试中使用的采样时钟
//调用DDS模块:按键模块控制频率控制字fword,生成三路相位120度的“数字”正弦信号,并且产生控制可逆计数器的使能计数时钟和方向信号。主要技术参数是:一个正弦波周期采样样本数据个数1024(波形ROM表格深度)
dds dds(
.clock(clock),
.fword(fword),
.A_data(A_Data),
.B_data(B_Data),
.C_data(C_Data),
.clk1(tri_updn),
.clk512(tri_clk)
);
//调用三角波模块:可逆计数器的实现产生三角波(能在每输出一个正弦值的时候产生一个三角波),与DDS产生的正弦数据值进行比较,产生SPWM波
cnt Tri(
.clk(tri_clk),
.A_data(A_Data),
.B_data(B_Data),
.C_data(C_Data),
.updn(tri_updn),
.q(tri_q),
.flag(flag),
.SPWM_A(SPWM_A),
.SPWM_B(SPWM_B),
.SPWM_C(SPWM_C),
);
//按键控制频率模块
key_debounce fre_control(
.clock(clock),
.key(key),
.fword(fword),
.led(led)//按键指示灯
);
Endmodule
2)实际中体会
第一,DDS模块是一个比较常用的用数字方式实现模拟信号的方法,以前一直只用了频率控制,这一次还通过深入理解用上了相位控制,从这个角度来讲,可以用FPGA小菜一碟的实现频率和相位可控的多通道SPWM波,然后再去外加上RC滤波电路和运放电路就可以实现可控正弦波。
第二,这里的DDS模块还有产生一个可逆计数器的计数使能时钟和方向控制时钟,需要具体说说的是,如果你输出的正弦值是8位的,那么你的计数器的计数范围是在0---255---0,如果你输出的正弦值是9位的,那么你的计数器的计数范围是在0---511---0。还有,每此计数变化后(一个“数字”三角波产生),DDS中只输出一个正弦值,进行比较。
第三、不可小觑饿三角波的生成。这个所谓的SPWM的载波,是在实现中最让我花费心思的地方。
三角波生成代码:
always @(negedge clk )
begin
if(!updn) begin
counter =counter+1'b1;
if(counter ==9'd255) counter2=9'd256;
q = counter; end
else begin
counter2 =counter2-1'b1;
if(counter2 ==9'd0) counter=-9'd1;
q = counter2; end
flag =updn;
end
上述代码是在反复调试过程中遇到问题后写出的,谈不上写得很好,毕竟自己只是FPGA的菜鸟级人物,但是还是比较理想的生成所需波形。
第四、在SPWM波生成以后,外接RC滤波电路,这里的目的呢,是滤掉高频信号,到“平滑”信号,这里的电容和电阻取得小些。再加上LM358小搭一个同相比例放大器,实现一个真正的“有源”信号输出和幅值控制。