Shand
Shand
خواندن ۲ دقیقه·۴ سال پیش

پروژه pwm به زبان وریلاگ(درس طراحي سيستم ديجيتال)

مدلاسیون پهنای پالس یا pulse with modulation مخفف کلمه pwm می باشد.PWM یک مدلاسیون پهنای پالس است.کاربرد آن تبدیل ولتاژ ورودی به ولتاژ خروجی قابل کنترل می باشد.

این مدلاسیون فقط عرض سیگنال را تغییر میدهد یعنی فرکانس در آن همیشه ثابت است.مهم ترین مشخصه آن چرخه وظیفه یا Duty cycle می باشدبا استفاده از آن می توان ولتاژ پایه های خروجی میکروکنترلر یعنی سرعت موتور و قطعات را تنظیم کرد.

pwm
pwm


کاربرد pwm

  • کنترل نور LED ها
  • کنترل سرعت موتور های DC
  • انتقال پیام
  • مبدل های ولتاژکاربرد مهمpwm در اینورتر ها می باشد.

نمونه ای از pwm در بازار

نمونه ای از pwm
نمونه ای از pwm

مشخصه Duty cycle

نسبت زمان روشن بودن به خاموش بودن مدار را چرخه وظیفه مدار می گویند.

برای افزایش یا کاهش ولتاژ باید خروجی PWM را با duty cycle افزایش داد.

مشخصه Duty cycle برحسب درصد بیان می شود.

Duty cycle 50%

به معنای 50% روشن بودن مدار و 50% خاموش بودن مدار است.

Duty cycle 25%

به معنای 25% روشن بودن و 75% خاموش بودن مدار است.

Duty cycle
Duty cycle

Duty cycle=(on Time)/period×100%

Period= on time+offtime


Code of PWM

`timescale 100 ns / 1 ps
module PWM_Generator (clk,increase_duty, cycledecrease_duty, cyclePWM_OUT );
input clk;
input increase_duty;
input decrease_duty;
output PWM_OUT;
wire slow_clk_enable; // slow clock enable signal for debouncing FFs
reg[27:0] counter_debounce=0; // counter for creating slow clock enable signals
wire tmp1,tmp2,duty_inc; // temporary flip-flop signals for debouncing the increasing button
wire tmp3,tmp4,duty_dec; // temporary flip-flop signals for debouncing the decreasing button
reg[3:0] counter_PWM=0; // counter for creating 10Mhz PWM signal
reg[3:0] DUTY_CYCLE=5; // initial duty cycle is 50%
always @(posedge clk)
begin
counter_debounce <= counter_debounce + 1;
if(counter_debounce>=1)
counter_debounce<= 0;
end
// assign slow_clk_enable = counter_debounce == 25000000 ?1:0;
assign slow_clk_enable = counter_debounce == 1 ?1:0;
// debouncing FFs for increasing button
DFF_PWM PWM_DFF1(clk,slow_clk_enable,increase_duty,tmp1);
DFF_PWM PWM_DFF2(clk,slow_clk_enable,tmp1, tmp2);
assign duty_inc = tmp1 & (~ tmp2) & slow_clk_enable;
// debouncing FFs for decreasing button
DFF_PWM PWM_DFF3(clk,slow_clk_enable,decrease_duty, tmp3);
DFF_PWM PWM_DFF4(clk,slow_clk_enable,tmp3, tmp4);
assign duty_dec = tmp3 & (~ tmp4) & slow_clk_enable;
// vary the duty cycle using the debounced buttons above
always @(posedge clk)
begin
if(duty_inc==1 && DUTY_CYCLE <= 9)
DUTY_CYCLE <= DUTY_CYCLE + 1;// increase duty cycle by 10%
else if(duty_dec==1 && DUTY_CYCLE>=1)
DUTY_CYCLE <= DUTY_CYCLE - 1;//decrease duty cycle by 10%
end
// Create 10MHz PWM signal with variable duty cycle controlled by 2 buttons
always @(posedge clk)
begin
counter_PWM <= counter_PWM + 1;
if(counter_PWM>=9)
counter_PWM <= 0;
end
assign PWM_OUT = counter_PWM < DUTY_CYCLE ? 1:0;
endmodule
// Debouncing DFFs for push buttons on FPGA
module DFF_PWM(clk,en,D,Q);
input clk,en,D;
output reg Q;
always @(posedge clk)
begin
if(en==1) // slow clock enable signal
Q <= D;
end
endmodule

Testbench for PWM

`timescale 1 ns / 1 ps
module tb_PWM_Generator_Verilog;
// Inputs
reg clk;
reg increase_duty;
reg decrease_duty;
// Outputs
wire PWM_OUT;
// Instantiate the PWM Generator with variable duty cycle in Verilog
PWM_Generator_Verilog PWM_Generator_Unit(.clk(clk),.increase_duty(increase_duty),.decrease_duty(decrease_duty),
.PWM_OUT(PWM_OUT));
// Create 100Mhz clock
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
increase_duty = 0;
decrease_duty = 0;
#100
increase_duty = 1;
#100;// increase duty cycle by 10%
increase_duty = 0;
#100;

increase_duty = 1;
#100;// increase duty cycle by 10%
increase_duty = 0;
#100;
decrease_duty = 0;
#100;
increase_duty = 1;
#100;// increase duty cycle by 10%
increase_duty = 0;
#100;
increase_duty = 1;
#100;// increase duty cycle by 10%
increase_duty = 0;
#100;
increase_duty = 1;

#100;// increase duty cycle by 10%
increase_duty = 0;
#100;
decrease_duty = 1;
#100;//decrease duty cycle by 10%
decrease_duty = 0;
#100;
decrease_duty = 1;
#100;//decrease duty cycle by 10%
decrease_duty = 0;
#100;
decrease_duty = 1;
#100;//decrease duty cycle by 10%
decrease_duty = 0;
end
endmodule

شکل موج خروجی به شکل زیر خواهد بود:

pwm
pwm

از توجه شما به این مقاله سپاس گزاریم.


طراحی سیستم دیجیتالpwmمدلاسیون پهنای پالسسخت افزار
از نوجوانی علاقه بسیار زیادی به نوشتن و تولید متن در هر محتوایی داشتم. تا اینکه به تازگی با ویرگول آشنا شدم و....
شاید از این پست‌ها خوشتان بیاید