Verilog实现占空比可调的PWM信号

文章介绍了PWM信号在模拟控制中的应用,通过计数器和时钟频率调整实现占空比控制。测试中发现高频失真问题,经调整计数器大小解决了波形毛刺,验证了示波器带宽限制是原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PWM信号是一种通过数字的方式来实现模拟控制的方法,常用于发动机,电机转数,飞机机翼舵机,灯的无极调光,发热量等信号控制,是常用的信号控制方法。

具体实现方法为:设定一个计数器,例如N==1000,在一个时钟的频率为50Mhz,即1S内有50 000 000个CLK周期,即可以计数50 000个轮回,每个计数周期内,可以设定个值X,让输出信号在这个值的附近产生变化,就将1000个CLK个周期内部分开了,X/N就是占空比,这里的1000,影响的就是PWM调制的丝滑程度,代码如下:

module PWM 
    #(parameter Boundry ='d400,
      parameter MAXCount ='d1000)//这里的Boundry/MAXCount=40%就是占空比
(
    input  clk,
    input  areset, 
    output reg OutSingal
);
    reg [31:0]Count ;
    always @(posedge clk or negedge areset) begin
        if (areset==0) begin
            Count <= 'b1;
        end
        else if(Count == MAXCount) begin
            Count <= 'b1;
        end
        else
            Count <= Count + 1'b1;
    end
    always @(posedge clk or negedge areset) begin
        if (areset==0) begin
            OutSingal <= 'b1;
        end
        else if(Count<Boundry) begin
            OutSingal <= 'b0;
        end
        else
            OutSingal <= 'b1;
    end
endmodule //PWM

测试用例如下:

`timescale  1ns / 1ps
module PWM_tb;
// PWM Parameters
parameter PERIOD    = 10   ;
parameter MAXCount  = 'h3E7;
parameter Boundry   = 'h18F;
// PWM Inputs
reg   clk      = 0 ;
reg   areset      = 0 ;
// PWM Outputs
wire  OutSingal    ;
initial
begin
    forever #(PERIOD/2)  clk=~clk;
end
initial
begin
    #(PERIOD*2) areset  =  1;
end

PWM #(
    .Boundry (Boundry),
    .MAXCount ( MAXCount ))
 u_PWM (
    .clk                     ( clk         ),
    .areset                   ( areset       ),
    .OutSingal               ( OutSingal   )
);
endmodule

仿真波形如下:

上板验证波形结果如下:

观察现象,确实实现了占空比可调的PWM信号,但是发现上升沿和下降沿处波形会有一个毛刺,

后经过深入分析研究,发现这是示波器带宽限制导致的高频失真,于是我们将PWM信号的频率f降低,具体降低的方法是增加计数器和边界值的大小,放大1000,PWM周期则会下降1000倍。

    #(parameter Boundry ='d400000,
      parameter MAXCount ='d1000000)//这里的Boundry/MAXCount=40%就是占空比
(

上板验证后,波形如图:

成功验证该毛刺是示波器带宽不足引起的高频失真。

知识浅薄,有疑惑可发邮件相互探讨:619743936@qq.com

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值