با استفاده از پایتون و کتابخانههای NumPy برای محاسبات ریاضی و Matplotlib برای رسم نمودار، میتوان موج سینوسی مدولاسیون عرض پالس (Sinusoidal Pulse Width Modulation – SPWM) را تولید و نمایش داد.
SPWM با مقایسه یک موج سینوسی مرجع (Reference Sine Wave) با یک موج مثلثی یا دندانهارهای حامل (Carrier Triangular/Sawtooth Wave) با فرکانس بسیار بالاتر ایجاد میشود. خروجی PWM هنگامی که موج سینوسی بالاتر از موج حامل باشد، بالا (High) و در غیر این صورت پایین (Low) است.
در اینجا یک نمونه کد پایتون برای تولید و رسم نمودار SPWM آورده شده است:
کد پایتون برای تولید و رسم SPWM
import numpy as np
import matplotlib.pyplot as plt
# --- پارامترهای موج ---
# زمان شبیهسازی
t_stop = 0.05 # 50 میلیثانیه
# فرکانس نمونهبرداری (Sampling Frequency) - باید خیلی بالا باشد
f_sampling = 50000 # 50 کیلوهرتز
# فرکانس موج مرجع سینوسی (Reference Sine Wave Frequency)
f_ref = 50 # 50 هرتز
# فرکانس موج حامل مثلثی (Carrier Triangular Wave Frequency)
f_carrier = 1000 # 1 کیلوهرتز
# شاخص مدولاسیون دامنه (Amplitude Modulation Index - Ma) - بین 0 و 1
Ma = 0.8
# --- تولید زمان و موجها ---
# بردار زمان
t = np.linspace(0, t_stop, int(t_stop * f_sampling), endpoint=False)
# موج مرجع سینوسی (Reference Sine Wave)
# دامنه موج مرجع = Ma
sine_ref = Ma * np.sin(2 * np.pi * f_ref * t)
# موج حامل مثلثی (Carrier Triangular Wave)
# از تابع np.mod برای ایجاد شکل موج دورهای (تناوبی) استفاده میکنیم
# دامنه موج حامل را 1 در نظر میگیریم
carrier_period = 1 / f_carrier
carrier_phase = np.mod(t, carrier_period) / carrier_period
# تبدیل فاز دورهای به موج مثلثی بین -1 و 1
# برای موج مثلثی میتوان از توابع دیگر یا پیادهسازی دستی هم استفاده کرد
# اینجا از یک تقریب موج دندانهارهای معکوس و متقارن استفاده شده
carrier_wave = 2 * (carrier_phase - 0.5)
# تبدیل به شکل مثلثی
carrier_wave = 2 * np.abs(carrier_wave) - 1
# --- تولید موج SPWM ---
# مقایسه: SPWM هنگامی که موج سینوسی > موج حامل است، High (1) و در غیر این صورت Low (0) است
# از np.where برای اجرای شرط استفاده میشود
spwm_wave = np.where(sine_ref > carrier_wave, 1, 0)
# --- رسم نمودار ---
plt.figure(figsize=(12, 8))
# نمودار موج مرجع سینوسی و موج حامل مثلثی
plt.subplot(2, 1, 1) # ایجاد دو نمودار در یک ستون، نمودار اول
plt.plot(t * 1000, sine_ref, label='موج مرجع سینوسی (Sine Ref)', color='blue')
plt.plot(t * 1000, carrier_wave, label='موج حامل مثلثی (Carrier Tri)', color='red', linewidth=0.5)
plt.title('موج مرجع سینوسی و موج حامل مثلثی')
plt.xlabel('زمان (میلی ثانیه)')
plt.ylabel('دامنه (Amplitude)')
plt.grid(True, linestyle='--')
plt.legend()
plt.ylim(-1.1, 1.1)
# نمودار موج SPWM
plt.subplot(2, 1, 2) # ایجاد دو نمودار در یک ستون، نمودار دوم
plt.plot(t * 1000, spwm_wave, label='موج SPWM', color='green')
plt.title('موج Sinusoidal PWM (SPWM)')
plt.xlabel('زمان (میلی ثانیه)')
plt.ylabel('پالس خروجی (0 یا 1)')
plt.grid(True, linestyle='--')
plt.legend()
plt.ylim(-0.1, 1.1)
plt.tight_layout() # تنظیم فاصله مناسب بین نمودارها
plt.show()
توضیح کد
- وارد کردن کتابخانهها:
import numpy as np: برای انجام محاسبات آرایهای سریع و تولید دادهها.import matplotlib.pyplot as plt: برای رسم نمودار.
- تعیین پارامترها:
- f_sampling: فرکانس نمونهبرداری باید حداقل ۱۰ برابر بالاتر از f_carrier باشد تا وضوح کافی برای نمایش پالسها فراهم شود.
- f_ref: فرکانس موج سینوسی مرجع (فرکانس خروجی مورد نظر).
- f_carrier: فرکانس موج حامل (فرکانس سوییچینگ).
- M_a: شاخص مدولاسیون دامنه (نسبت دامنه سینوسی به دامنه حامل) که میزان پهنای پالسها را کنترل میکند.
- تولید بردار زمان (t):
- با استفاده از
np.linspaceیک آرایه از نقاط زمانی با فاصله نمونهبرداری ثابت ایجاد میشود.
- با استفاده از
- تولید موج مرجع سینوسی (
sine_ref):- با استفاده از فرمول A⋅sin(2πft) و دامنه M_a.
- تولید موج حامل مثلثی (
carrier_wave):- از توابع پیمانهای (
np.mod) و توابع ریاضی برای شبیهسازی یک موج مثلثی با فرکانس f_carrier بین ±1 استفاده شده است.
- از توابع پیمانهای (
- تولید موج SPWM (
spwm_wave):- قلب برنامه:
np.where(sine_ref > carrier_wave, 1, 0)عملیات مقایسه را انجام میدهد. هر جا که مقدار موج سینوسی مرجع از موج حامل مثلثی بیشتر باشد، خروجی ۱ (High) و در غیر این صورت ۰ (Low) خواهد بود.
- قلب برنامه:
- رسم نمودار:
- از
plt.subplotبرای رسم دو نمودار در کنار هم استفاده شده است:- نمودار بالا: نمایش موج سینوسی مرجع و موج حامل.
- نمودار پایین: نمایش موج نهایی SPWM.
- نهایتاً با
plt.show()نمودارها نمایش داده میشوند.
- از
این ویدئو به شما نشان میدهد که چگونه میتوان یک موج سینوسی ساده را در پایتون رسم کرد، که پایهای برای ساخت و رسم موج SPWM است.
سایت آموزشی الکترونیک و کامپیوتر اوپن مقاله های آموزشی الکترونیک و کامپیوتر و فن آوری