热度 22
2012-5-28 18:29
3904 次阅读|
8 个评论
前些日子,因为课题需要,所以查阅了些资料,自己动手去做了一个频率可控的三相正弦信号发生器,实践中觉得利用脉宽调制的方法实现比利用DDS查表方式+DA芯片输出,不仅节省了资源,而且波形产生效果上更加理想,这一点我在实践尝试中深有体会。下面我总结一下我的辛勤劳动成果哈。。。呵呵! ------小 记 一、基础理论方面 1)PWM是脉冲宽度调制(Pulse Width Modulation)的简称,它在自动控制和计算机技术领域中都有广泛的应用。PWM调制原理 ---------PWM 波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。 2)FPGA---SPWM 正弦脉宽调制(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 A_Data,B_Data,C_Data;//三相正弦表格输出值,SignalTap调试中查看数据 output tri_q; //DA数据输出 output da_clk; //DA时钟输出 output flag,led; output SPWM_A ,SPWM_B,SPWM_C;//对外输出的相移120的正弦脉宽调制信号 wire tri_clk,tri_updn;//可逆计数器的时钟和计数方向(用于控制三角波的生成) wire 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小搭一个同相比例放大器,实现一个真正的“有源”信号输出和幅值控制。 最后星星分享DDS模块设计代码。哦,对了,还要罗嗦一句,真正的SPWM波主要还是用来做交流调压调频率的,所以还需要加死区控制,这里,我主要是生成正弦波,所以只能严谨地说,只能叫简易SPWM!