查看: 1570|回复: 0
打印 上一主题 下一主题

基于FPGA的SPWM 设计

[复制链接]
跳转到指定楼层
沙发
发表于 2015-6-6 17:31:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、基础理论方面
   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  [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小搭一个同相比例放大器,实现一个真正的“有源”信号输出和幅值控制。
     

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表