世纪电源网社区logo
社区
Datasheet
标题
返回顶部
原创

基于FPGA的PWM发生器

[复制链接]
查看: 1871 |回复: 3
1
莫见愁
  • 积分:280
  • |
  • 主题:7
  • |
  • 帖子:45
积分:280
LV3
助理工程师
  • 2018-9-6 16:29:45
什么叫做PWM?借用维基百科的解释就是:脉冲宽度调制(英语:Pulse Width Modulation,缩写:PWM),简称脉宽调制,是将模拟信号变换为脉冲的一种技术,一般变换后脉冲的周期固定,但脉冲的占空比会依模拟信号的大小而改变。
在开关电源中,PWM是作为电压调节的一项重要因素,其控制开关管的导通通过反馈调节以达到稳压的效果。但开关电源的输出都会产生相应的纹波电压,对于高精度的芯片,严重影响其性能。那么如何降低开关电源的纹波呢?可以通过提高PWM的频率来解决问题。普通的开关电源IC一般驱动频率都在2M以下。由此我想到了用FPGA作为PWM的发生器。
下图展示的有相应的逻辑图和Verilog代码
//-----------------------------------------------------------------\//Title:    PWM_Driver//Time:2018.9.6//Author:莫见愁//-----------------------------------------------------------------/module Motor_Driver(            //system interface            input                   sclk                            ,            input                   rst_n                           ,            //Motor     Driver  interface            output              Motor_A                     ,            output              Motor_B                     ,            output              Motor_C                     ,            output              Motor_D                     ,            //Other     interface            input                   Dial_1                      ,            input                   Dial_2  );//===================================================================\//********************Define    interface******************************//===================================================================/ reg     [ 0:23]             PWM_CNT                         ;reg                             Motor_out                       ;reg                             Motor_A_reg                     ;reg                             Motor_B_reg                     ;reg                             Motor_C_reg                     ;reg                             Motor_D_reg                     ;wire                                Dial_flag_R                     ;wire                                Dial_flag_L                     ;localparam                      pwm_cnt     =   24'd100     ;localparam                      pwm_comp        =   24'd20      ;                                   //===================================================================\//***************************Main   Code*****************************//===================================================================/ //计数器always@(posedge sclk or negedge rst_n)    if(rst_n==1'b0)        PWM_CNT <=  24'd0;    else if(PWM_CNT==pwm_cnt-1'd1)        PWM_CNT <=  24'd0;    else        PWM_CNT <=  PWM_CNT+1'd1;            always@(posedge sclk or negedge rst_n)        if(rst_n==1'b0)            Motor_out   <=  1'd0    ;        else    if(PWM_CNT>=pwm_comp)                    Motor_out   <=  1'd1    ;        else            Motor_out   <=  1'd0    ;            //正反转assign  Dial_flag_R =   (Dial_1==1'b1)  ?   1'd1    :   1'd0    ;assign  Dial_flag_L =   (Dial_2==1'b1)  ?   1'd1    :   1'd0    ;always@(posedge sclk or negedge rst_n)        if(rst_n==1'b0)            begin                Motor_A_reg <=  1'd1    ;                Motor_B_reg <=  1'd1    ;                Motor_C_reg <=  1'd1    ;                Motor_D_reg <=  1'd1    ;            end        else    if(Dial_flag_R==1'b1)            begin                Motor_A_reg <=  Motor_out   ;                Motor_B_reg <=  1'd1    ;                Motor_C_reg <=  1'd1    ;                Motor_D_reg <=  Motor_out   ;            end        else    if(Dial_flag_L==1'b1)            begin                Motor_A_reg <=  1'd1    ;                Motor_B_reg <=  Motor_out   ;                Motor_C_reg <=  Motor_out   ;                Motor_D_reg <=  1'd1    ;            end        else            begin                Motor_A_reg <=  1'd1    ;                Motor_B_reg <=  1'd1    ;                Motor_C_reg <=  1'd1    ;                Motor_D_reg <=  1'd1    ;            endassign  Motor_A=Motor_A_reg;assign  Motor_D=Motor_D_reg;assign  Motor_B=Motor_B_reg;assign  Motor_C=Motor_C_reg;endmodule

PWM.png
Time.png
莫见愁
  • 积分:280
  • |
  • 主题:7
  • |
  • 帖子:45
积分:280
LV3
助理工程师
  • 2018-9-6 16:31:02
  • 倒数3
 
这个网站太不友好了
莫见愁
  • 积分:280
  • |
  • 主题:7
  • |
  • 帖子:45
积分:280
LV3
助理工程师
  • 2018-9-6 16:38:58
  • 倒数2
 
源码我用附件的形式上传了,我采用的MAX10M02SCM153的片子,同时上传RTL View 和波形仿真。
RTL.png
仿真.png

PWM.rar

222.02 KB, 下载次数: 7, 下载积分: 财富 -2

世纪电源网-九天
  • 积分:35855
  • |
  • 主题:691
  • |
  • 帖子:4034
积分:35855
超级版主
最新回复
  • 2018-9-6 16:41:30
  • 倒数1
 
hhh论坛近期会改版,期待一下编辑页面进一步升级吧~~
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号