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