原创 【博客大赛】基于FPGA的SPWM 波之个人实践

2012-5-28 18:29 3911 14 22 分类: FPGA/CPLD
        前些日子,因为课题需要,所以查阅了些资料,自己动手去做了一个频率可控的三相正弦信号发生器,实践中觉得利用脉宽调制的方法实现比利用DDS查表方式+DA芯片输出,不仅节省了资源,而且波形产生效果上更加理想,这一点我在实践尝试中深有体会。下面我总结一下我的辛勤劳动成果哈。。。呵呵!

                                           ------小 记

一、基础理论方面

   1)PWM是脉冲宽度调制(Pulse Width Modulation)的简称,它在自动控制和计算机技术领域中都有广泛的应用。PWM调制原理 ---------PWM 波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。

   

a1.gif
2)FPGA---SPWM

     正弦脉宽调制(SPWM)技术在交流调速系统中得到广泛应用,但SPWM的波形生成是应用中一个难点,目前形成SPWM的方法有1)由分立元件构成,结构简单,但可靠性和精度均不能满足要求;(2)采用计算机计算或查表方式,省却了硬件电路,但CPU负担很重; (3)采用专用集成电路,如SLE4520、SA4828等,但其功能固定,可扩展性差;(4)采用FPGA(现场可编门阵列),具有速度快、精度高且可以在线编程修改等优点,是一种较好的方案。 

     实现SPWM原理;用输出的正弦信号作为调制波,用高频三角波作为载波.。

     SPWM就是在对一个正弦波进行脉宽调制时,使脉冲系列的占空比按正弦规律来排列。当正弦值为最大值时,脉冲的宽度也最大,而脉冲间的间隔则最小。反之,当正弦值较小时,脉冲的宽度也较小,而脉冲间的间隔则较

   a2.gif

 

 正弦波的峰值电压与三角波峰值电压之比,通常称为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中只输出一个正弦值,进行比较。

 

a3.gif

  第三、不可小觑饿三角波的生成。这个所谓的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小搭一个同相比例放大器,实现一个真正的“有源”信号输出和幅值控制。

     a4.gif

a5.gif

a6.gif

最后星星分享DDS模块设计代码。哦,对了,还要罗嗦一句,真正的SPWM波主要还是用来做交流调压调频率的,所以还需要加死区控制,这里,我主要是生成正弦波,所以只能严谨地说,只能叫简易SPWM!

 

 

 

PARTNER CONTENT

文章评论8条评论)

登录后参与讨论

用户1843850 2015-6-30 10:40

谢谢了,想改改直接用!!!!

用户1776762 2014-8-13 13:00

怎么不把所有的都贴出来啊???贴一半出来怎么让人看啊 ?

用户1725162 2013-12-20 22:46

不错 不错 正在学习中

用户450648 2013-8-6 23:36

很不错啊啊啊啊

用户377235 2013-5-17 16:10

很好的一篇文章耶。。

用户437870 2013-4-12 09:09

学习!学习!

用户433562 2013-3-6 19:12

受教了

用户1410360 2012-6-5 18:47

我也在学习,很实用的!
相关推荐阅读
用户421530 2013-12-01 13:16
基于Altera FPGA的千兆以太网实现方案
  1 引言   在系统设备不断向小型化、集成化、网络化发展的今天,嵌入式开发成为新技术发展的最前沿,改变着系统的整体结构。FPGA由于其自身特点,成为嵌入式开发的最佳平台。Altera公司结合其最新...
用户421530 2013-07-26 22:58
不在执迷于过去,只为不断突破,寻找奋斗的归宿&价值
    好久好久,没有来到自己的博客,一切是陌生的亲切,这里面呼喊自己的回归,是奋斗与自信 ,是价值与积淀的回归,今天不是起点,只是一个开始,从大学的校园走出来,面对工作,我的选择也许不是自己的想...
用户421530 2012-08-27 22:56
常用电平标准汇编版(1)
现在常用的电平标准有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232、RS485等,还有一些速度比较高的LVDS、GTL、PGTL、CML、HSTL、SSTL等。...
用户421530 2012-07-17 00:26
于细微中见区别(1)---阻塞&非阻塞赋值(Verliog HDL)
阻塞赋值——“=” <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 非阻塞赋值——...
用户421530 2012-06-20 00:41
SOPC之软件编程学习--系统时钟API函数应用
利用sys/alt_alarm.h系统时钟服务头文件中的alt_alarm_start ()API 函数以及时钟回调函数进行精确定时。我的设计在现有源程序的基础上,添加三个时钟服务程序,分别利用不...
用户421530 2012-06-19 15:18
SOPC之软件编程学习---头文件(1)
在Altera FPGA里面的SOPC学习过程中,软件编程中遇到的第一个编程,往往是LED灯的控制,这几天断断续续的学习了些,总算了入了NIOS II 学习的门槛,开始我对FPG**上系统的探索。在软...
我要评论
8
14
关闭 站长推荐上一条 /3 下一条