نسخه پیشرفته شبیه‌سازی یک تقویت‌کننده عملیاتی

در این نسخه پیشرفته شبیه‌سازی یک تقویت‌کننده عملیاتی (Op-Amp)، دو ویژگی مهم را اضافه می‌کنیم:

  1. نرخ چرخش (Slew Rate): در دنیای واقعی، ولتاژ خروجی Op-Amp نمی‌تواند “آنی” تغییر کند. یک سرعت حداکثر برای تغییر ولتاژ وجود دارد (مثلاً $0.5 V/\mu s$). این باعث می‌شود اگر ورودی موج مربعی باشد، خروجی به شکل ذوزنقه‌ای درآید.
  2. نویز (Noise): هیچ سیگنالی کاملاً تمیز نیست. ما نویز حرارتی یا محیطی را به ورودی اضافه می‌کنیم تا ببینیم چگونه تقویت می‌شود.

برای نشان دادن بهترِ Slew Rate، سیگنال ورودی را از سینوسی به موج مربعی تغییر دادم، زیرا تغییرات ناگهانی موج مربعی، اثر Slew Rate را به وضوح نشان می‌دهد.

کد پایتون: شبیه‌سازی پیشرفته Op-Amp

import numpy as np
import matplotlib.pyplot as plt

class RealOpAmp:
    def __init__(self, open_loop_gain=100000, v_pos=15, v_neg=-15, slew_rate=0.5):
        """
        :param slew_rate: حداکثر نرخ تغییر ولتاژ بر حسب ولت بر میکروثانیه (V/us)
        """
        self.Aol = open_loop_gain
        self.v_pos = v_pos
        self.v_neg = v_neg
        self.slew_rate = slew_rate * 1e6  # تبدیل به ولت بر ثانیه
        self.prev_output = 0  # ذخیره وضعیت قبلی خروجی

    def update(self, target_voltage, dt):
        """
        محاسبه خروجی بعدی با در نظر گرفتن Slew Rate و Saturation
        :param target_voltage: ولتاژی که مدار می‌خواهد به آن برسد
        :param dt: فاصله زمانی بین نمونه‌ها
        """
        # 1. محاسبه تغییر مورد نیاز
        delta_v = target_voltage - self.prev_output
        
        # 2. محاسبه حداکثر تغییر مجاز در این بازه زمانی (Slew Rate Limit)
        max_change = self.slew_rate * dt
        
        # 3. اعمال محدودیت سرعت تغییر
        if abs(delta_v) > max_change:
            # اگر تغییر زیاد بود، فقط به اندازه max_change جلو برو (با حفظ جهت)
            actual_change = max_change * np.sign(delta_v)
        else:
            actual_change = delta_v
            
        # 4. محاسبه خروجی جدید
        new_output = self.prev_output + actual_change
        
        # 5. اعمال محدودیت اشباع (Saturation - Rails)
        if new_output > self.v_pos:
            new_output = self.v_pos
        elif new_output < self.v_neg:
            new_output = self.v_neg
            
        # ذخیره برای دور بعدی
        self.prev_output = new_output
        return new_output

# --- پارامترهای شبیه‌سازی ---
duration = 0.0001  # 100 میکروثانیه (زمان خیلی کوتاه برای دیدن دقیق Slew Rate)
sampling_rate = 10000000 # 10 مگاهرتز (رزولوشن زمانی بالا)
time = np.linspace(0, duration, int(duration * sampling_rate))
dt = time[1] - time[0]

# --- تنظیمات مدار ---
# OpAmp با Slew Rate برابر 0.5 ولت بر میکروثانیه (کند)
my_opamp = RealOpAmp(v_pos=10, v_neg=-10, slew_rate=0.5)

# مدار تقویت‌کننده معکوس با بهره -2
gain = -2

# --- تولید سیگنال ورودی ---
# 1. سیگنال اصلی: موج مربعی
freq = 20000 # 20 کیلوهرتز
ideal_input = 3.0 * np.sign(np.sin(2 * np.pi * freq * time))

# 2. اضافه کردن نویز سفید (Gaussian Noise)
noise_level = 0.2 # شدت نویز
noisy_input = ideal_input + np.random.normal(0, noise_level, len(time))

# --- حلقه شبیه‌سازی ---
v_out_signal = []

for v_in in noisy_input:
    # هدف مدار: Vout = Gain * Vin
    target_v_out = v_in * gain
    
    # محاسبه خروجی واقعی با محدودیت‌های OpAmp
    real_out = my_opamp.update(target_v_out, dt)
    v_out_signal.append(real_out)

# --- رسم نمودار ---
plt.figure(figsize=(12, 8))

# نمودار ورودی (با نویز)
plt.subplot(2, 1, 1)
plt.plot(time * 1e6, noisy_input, color='gray', alpha=0.7, label='Noisy Input')
plt.plot(time * 1e6, ideal_input, color='blue', linestyle='--', alpha=0.5, label='Ideal Input')
plt.title('Input Signal (Square Wave + Noise)')
plt.ylabel('Voltage (V)')
plt.legend()
plt.grid(True)

# نمودار خروجی (اثر Slew Rate)
plt.subplot(2, 1, 2)
# رسم خروجی ایده‌آل (اگر OpAmp کامل بود)
plt.plot(time * 1e6, ideal_input * gain, color='green', linestyle='--', alpha=0.4, label='Ideal Output (Infinite SR)')
# رسم خروجی واقعی
plt.plot(time * 1e6, v_out_signal, color='red', linewidth=2, label='Real Output (Slew Limited)')

plt.title('Output Signal (Showing Slew Rate & Gain)')
plt.xlabel('Time (microseconds)')
plt.ylabel('Voltage (V)')
plt.legend()
plt.grid(True)

plt.tight_layout()
plt.show()

تحلیل نتایج نمودار

پس از اجرای کد بالا، دو نمودار خواهید دید که نکات زیر در آن‌ها مشهود است:

  1. اثر Slew Rate (مهم‌ترین بخش):
    • به نمودار قرمز رنگ (خروجی) دقت کنید. در حالی که ورودی (موج مربعی) به‌صورت عمودی و ناگهانی تغییر می‌کند، خروجی به صورت مورب (شیب‌دار) بالا و پایین می‌رود.
    • این همان Slew Rate است. Op-Amp نمی‌تواند سریع‌تر از $0.5 V/\mu s$ حرکت کند، بنابراین موج مربعی تبدیل به ذوزنقه می‌شود. اگر فرکانس را خیلی بالا ببرید، این موج تبدیل به مثلث می‌شود.
  2. اثر نویز:
    • ورودی دارای “لرزش” یا “پرز” است (خط خاکستری).
    • چون بهره مدار ما 2- است، این نویز در خروجی نیز تقویت شده است. اگر دقت کنید ضخامت خط قرمز (خروجی) به دلیل وجود نویز تقویت شده، کمی زیاد است.
  3. تأخیر فاز (ناشی از کندی):
    • به دلیل اینکه Op-Amp زمان می‌خواهد تا از پایین به بالا برود (Slew Rate)، قله‌ی موج خروجی کمی دیرتر از قله‌ی موج ورودی تثبیت می‌شود.

همچنین بررسی کنید

ساخت پروب اسیلوسکوپ برای اندازه گیری توان (قسمت دوم)

در قسمت یک، ما محدودیت های پهنای باند پروب های غیرفعال را پوشش دادیم و …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *