Siglent Bode Plot Testere Dişi Gürültüsünü Python ve SCPI ile Kontrol Etmek

  • Konbuyu başlatan Konbuyu başlatan TA3UIS
  • Başlangıç tarihi Başlangıç tarihi

TA3UIS

Katılımcı Üye
Katılım
14 Kas 2023
Mesajlar
129
Puanları
56
Bugün Siglent SDS 1104X-E osiloskop ve SDG 2042X awg ile bir test daha yaptım.

Bu cihazların kendi içlerinde bir Bode Plot uygulaması var zaten. Ancak özellikle düşük frekanslarda 10Hz - 1kHz arası grafiğinde testere dişi şeklinde zıplamalar ve gürültülerle karşılaşmıştım.

Biraz vakit harcadıktan sonra fark ettim ki sorun cihazın donanımında değil, otomatik moddaki sabırsızlığında, şurada önceki testlerim mevcut
Cihaz vites değiştirirken dalganın tam oturmasını beklemeden ölçüm alıyordu.
Bu sorunu osiloskobu LAN üzerinden Python ve SCPI ile kontrol ederek çözdüm. Bu arada cihazları Python ve SCPI ile uzun zamandır nasıl kontrol edebilirimi araştırıyordum.

Şimdi bu cihazları network analizör gibi (fazla iddialı olmadıysa :D) nasıl çalıştırdığımı anlatmaya çalışacağım.

1. Yazılım yükleme
Cihazlarla bilgisayarı konuşturmak için şu üçlüyü kurmanız şart:
NI-VISA Runtime: Bilgisayarın osiloskobu bir ölçüm cihazı olarak tanımasını sağlayan temel sürücü arayüzü. National Instruments sitesinden ücretsiz indirebilirsiniz.
Python 3.x: Scripti çalıştırmak için olmazsa olmazımız.
Kütüphaneler: Terminale şu komutu yazarak gerekli kütüphaneleri ekledim:
pip install pyvisa matplotlib numpy

2. Donanım ve Cihaz Ayarları
Testi 1kΩ direnç ve 100nF kondansatörden oluşan basit bir alçak geçiten filtre 1.59 kHz kesim frekanslı üzerinde yaptım.
Osiloskop SDS 1104X-E ayarları:
Bağlantı: Cihazı ethernet kablosuyla modeme bağladım (192.168.50.200).
Problar: Hem CH1 hem CH2 10X modunda ve osiloskop menüsünden de 10X seçili.
Kanal menüsünden 20MHz BW Limit seçili yaptım.


Jeneratör SDG 2042X Ayarları:
Bağlantı: LAN (IP: 192.168.50.195).
Çıkış: Load: Hi-Z modunda.
Sinyal: 5Vpp Sinüs.

3. Python Kodlama yapısı
Cihazın kendi yazılımını neden devre dışı bıraktım, çünkü Python ile şunları yapabilmeyi başardım:
Sinyal küçüldükçe osiloskoba vites düşür diyorum ama vites değiştikten sonra rölelerin sakinleşmesi için 1.5 saniye bekletiyorum. Gözlemlerime göre testere dişini yok eden ana şey bu bekleme süresiydi.

Her frekansta tek bir ölçüm yerine 5 ölçüm alıp ortalamasını aldım. Bu işlem gürültüyü hızlıca siliyor ama test süreyi biraz daha uzatıyor
Frekans arttıkça osiloskobun Time/div ayarını da otomatik güncelletiyorum ki ekranda hep 3-4 dalga boyu kalsın istedim.


1V/div sabit skalada aldığım ilk pürüzsüz grafikte, sinyal -25dB altına indiğinde osiloskobun çözünürlüğü ile çakıştığını gözlemledim..

SCPI KOMUTLARI İLE OLUŞAN NI-MAX GRAFİĞİ SADECE ALÇAK FREKANSLAR TAMAM. YÜKSEK FREKANSLAR DA HAFİF BOZULMA TIPKI ÖNCEKİ TESTİMDEKİ GİBİ.
1769717085600.webp



Python kodunu optimize edip akıllı vites yapacak şekilde güncelledim.Kod artık sinyal seviyesini takip ediyor, dikey skalayı (V/div) otomatik optimize ediyor ama cihazın içindeki Otomatik modun aksine, her skala değişiminden sonra röle gürültüsünün bitmesi için 2 saniye süre tanıması yetti.

Sonuç:
Sondaki o dijital basamaklar da kayboldu.
Cihazın özellikle otomatik moddaki yazılımsal eksikliği nedeniyle oluşan ölçüm kirliliğini Python kodları ile temizleyerek, devrenin olması gereken ölçüm sonucunu elde ettim.

Aldığım son alçak ve yüksek frekanslardaki pürüssüz grafik bunu gösteriyor. 1.6 kHz civarında -3 dB düşüşü yakaladım.
Cihazımı SCPI komutları ile upgrade etttim sanırım :D

SCPI KOMUTLARI İLE OLUŞAN NI-MAX GRAFİĞİ ALÇAK YÜKSEK FREKANSLARIN DÜZELMİŞ HALİ: Python KODLARI İLE BUNU DA REVİZE ETTİM

1769716661184.webp
WhatsApp Image 2026-01-25 at 23.12.55 (1).webp


NI-MAX ARABİRİMİ
1769716689937.webpWhatsApp Image 2026-01-29 at 23.10.18.webpWhatsApp Image 2026-01-29 at 23.10.18 (3).webpWhatsApp Image 2026-01-29 at 23.10.18 (1).webpWhatsApp Image 2026-01-29 at 23.10.18 (4).webpWhatsApp Image 2026-01-29 at 23.10.18 (1) (1).webp


Bu da ağ üzerinden cihazların haberleşmesini sağlayan, cihazın otomatik moddaki hatalarını tamamen bertaraf eden ve kullanıcı kontrollü olmasını sağlayan, üsteki testi yaptığım Python SCPI kodlarım:

Ekleme:
Temel SCPI komutları için Siglent dökümanlarına baktım.
PyVISA kütüphanesinin standart örnekleri üzerine kendi yaşadığım testere dişi ve skala sorunlarını çözecek bekleme sürelerini ve ortalama alma döngülerini ekledim.
Biraz deneme yanılma ile en sorunsuz sonucu bu kodlarla elde ettim:


C++:
import pyvisa
import time
import numpy as np
import matplotlib.pyplot as plt

SKOP_ADRESI = 'TCPIP0::192.168.50.200::inst0::INSTR'
JEN_ADRESI = 'TCPIP0::192.168.50.195::inst0::INSTR'

visa_yoneticisi = pyvisa.ResourceManager('C:/Windows/System32/visa64.dll')

try:
    skop = visa_yoneticisi.open_resource(SKOP_ADRESI)
    jenerator = visa_yoneticisi.open_resource(JEN_ADRESI)
    print("Cihazlara bağlantı başarılı!")
 

    skop.write("C1:BWL ON")
    skop.write("C2:BWL ON")

    # Osiloskob Yüksek Çözünürlük modu.
    skop.write("ACQ TYPE,HRES")

    skop.write("C1:VDIV 1V")
    skop.write("C2:VDIV 1V")
    skop.write("TDIV 50MS") # 10HZ için başlangıç

 
except Exception as hata_detayi:
    print(f"Bağlantı hatası: {hata_detayi}")
    exit()

baslangic_frekansi = 10
bitis_frekansi = 100000
onluk_basina_nokta = 10
genlik_degeri = 5.0
ortalama_sayisi = 5 # 5 kez ölçüm  ve ortalaması alsın

voltaj_kademeleri = [1.0, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01, 0.005]
su_anki_vites_kanal2 = 1.0

onluk_katlar = np.log10(bitis_frekansi) - np.log10(baslangic_frekansi)
toplam_olcum_sayisi = int(onluk_katlar * onluk_basina_nokta)
frekans_listesi = np.logspace(np.log10(baslangic_frekansi), np.log10(bitis_frekansi), toplam_olcum_sayisi)

sonuclar_db = []

print(f"{'Frekans (Hz)':<15} | {'Gain (dB)':<10} | {'Durum'}")
print("-" * 45)

jenerator.write(f"C1:BSWV WVTP,SINE,AMP,{genlik_degeri},OFST,0")
jenerator.write("C1:OUTP ON")

for frekans in frekans_listesi:
    jenerator.write(f"C1:BSWV FRQ,{frekans}")
 
    yeni_zaman_tabani = 1.0 / frekans / 4 # Ekrana 4-5 periyot sığdırması için
    if yeni_zaman_tabani < 1e-9: yeni_zaman_tabani = 1e-9 # Limit kontrolüni yap
    skop.write(f"TDIV {yeni_zaman_tabani}")
 
    bekleme_suresi = 1.2 if frekans < 100 else 0.3
    time.sleep(bekleme_suresi)

    try:
        kanal2_kontrol = float(skop.query("C2:PAVA? PKPK").split(',')[-1].strip().replace('V',''))
        if kanal2_kontrol < (su_anki_vites_kanal2 * 3) and su_anki_vites_kanal2 > 0.005:
            indeks = voltaj_kademeleri.index(su_anki_vites_kanal2)
            su_anki_vites_kanal2 = voltaj_kademeleri[indeks + 1]
            skop.write(f"C2:VDIV {su_anki_vites_kanal2}V")
            time.sleep(1.5) # Rölelerin oturması için sabırla bekle (Testere dişini engeller)
    except:
        pass
 
    giris_voltajlari = []
    cikis_voltajlari = []
 
    guncel_ortalama = 10 if frekans > 5000 else ortalama_sayisi
 
    for _ in range(guncel_ortalama):
        try:
            #  Veriyi çek ve temizlik yap
            v1_ham = skop.query("C1:PAVA? PKPK").split(',')[-1].strip().replace('V','')
            v2_ham = skop.query("C2:PAVA? PKPK").split(',')[-1].strip().replace('V','')
            giris_voltajlari.append(float(v1_ham))
            cikis_voltajlari.append(float(v2_ham))
            time.sleep(0.05) # Kısa bekleme
        except:
            continue

    if giris_voltajlari and cikis_voltajlari:
        giris_ortalamasi = sum(giris_voltajlari) / len(giris_voltajlari)
        cikis_ortalamasi = sum(cikis_voltajlari) / len(cikis_voltajlari)
 
        kazanc = 20 * np.log10(cikis_ortalamasi / giris_ortalamasi)
        sonuclar_db.append(kazanc)
        print(f"{frekans:>12.2f} Hz | {kazanc:>8.2f} dB | {len(giris_voltajlari)} Örnek TMM")
    else:
        sonuclar_db.append(None)
        print(f"{frekans:>12.2f} Hz | HATA!")

plt.figure(figsize=(12, 7))
plt.semilogx(frekans_listesi, sonuclar_db, 'b-s', linewidth=2, markersize=5, label='Frekans Yanıtı (Python + Smart Scaling)')
plt.axhline(y=-3, color='r', linestyle='--', label='-3dB Kesim Noktası')
plt.title(f'SCPI BODE PLOT', fontsize=14)
plt.xlabel('Frekans (Hz)', fontsize=12)
plt.ylabel('Kazanç (dB)', fontsize=12)
plt.grid(True, which="both", ls="-", alpha=0.6)
plt.legend()
plt.show()

jenerator.write("C1:OUTP OFF")



Python kodunun terminaldeki çıktısı:

Kod:
PS C:\Users\coder\Desktop\pyhhon> python.exe .\bode-plot.py
Cihazlara bağlantı başarılı!
Frekans (Hz)    | Gain (dB)  | Durum
---------------------------------------------
       10.00 Hz |     0.21 dB | 5 Örnek TMM
       12.66 Hz |     0.21 dB | 5 Örnek TMM
       16.04 Hz |     0.21 dB | 5 Örnek TMM
       20.31 Hz |     0.21 dB | 5 Örnek TMM
       25.72 Hz |     0.21 dB | 5 Örnek TMM
       32.57 Hz |     0.14 dB | 5 Örnek TMM
       41.25 Hz |     0.14 dB | 5 Örnek TMM
       52.23 Hz |     0.17 dB | 5 Örnek TMM
       66.15 Hz |     0.14 dB | 5 Örnek TMM
       83.77 Hz |     0.14 dB | 5 Örnek TMM
      106.08 Hz |     0.14 dB | 5 Örnek TMM
      134.34 Hz |     0.14 dB | 5 Örnek TMM
      170.13 Hz |     0.14 dB | 5 Örnek TMM
      215.44 Hz |     0.14 dB | 5 Örnek TMM
      272.83 Hz |     0.01 dB | 5 Örnek TMM
      345.51 Hz |     0.00 dB | 5 Örnek TMM
      437.55 Hz |    -0.14 dB | 5 Örnek TMM
      554.10 Hz |    -0.43 dB | 5 Örnek TMM
      701.70 Hz |    -0.64 dB | 5 Örnek TMM
      888.62 Hz |    -1.05 dB | 5 Örnek TMM
     1125.34 Hz |    -1.47 dB | 5 Örnek TMM
     1425.10 Hz |    -2.26 dB | 5 Örnek TMM
     1804.72 Hz |    -3.19 dB | 5 Örnek TMM
     2285.46 Hz |    -4.33 dB | 5 Örnek TMM
     2894.27 Hz |    -5.67 dB | 5 Örnek TMM
     3665.24 Hz |    -7.18 dB | 5 Örnek TMM
     4641.59 Hz |    -8.69 dB | 5 Örnek TMM
     5878.02 Hz |   -10.51 dB | 10 Örnek TMM
     7443.80 Hz |   -12.19 dB | 10 Örnek TMM
     9426.68 Hz |   -14.04 dB | 10 Örnek TMM
    11937.77 Hz |   -15.84 dB | 10 Örnek TMM
    15117.75 Hz |   -17.82 dB | 10 Örnek TMM
    19144.82 Hz |   -19.65 dB | 10 Örnek TMM
    24244.62 Hz |   -21.50 dB | 10 Örnek TMM
    30702.91 Hz |   -23.32 dB | 10 Örnek TMM
    38881.55 Hz |   -25.20 dB | 10 Örnek TMM
    49238.83 Hz |   -27.06 dB | 10 Örnek TMM
    62355.07 Hz |   -28.82 dB | 10 Örnek TMM
    78965.23 Hz |   -30.57 dB | 10 Örnek TMM
   100000.00 Hz |   -32.23 dB | 10 Örnek TMM
 

Ekli dosyalar

  • WhatsApp Image 2026-01-25 at 23.12.55 (1).webp
    WhatsApp Image 2026-01-25 at 23.12.55 (1).webp
    168.3 KB · Görüntüleme: 1

Forum istatistikleri

Konular
133,380
Mesajlar
971,000
Kullanıcılar
459,228
Son üye
saidkaradogu

Yeni konular

Çevrimiçi üyeler

Geri
Üst