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

TA3UIS

Doğan
Katılım
15 Kasım 2023
Mesajlar
3,001
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.png







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.png






NI-MAX ARABİRİMİ
1769716689937.png


WhatsApp Image 2026-01-29 at 23.10.18.jpeg
WhatsApp Image 2026-01-29 at 23.10.18 (3).jpeg
WhatsApp Image 2026-01-29 at 23.10.18 (1).jpeg
WhatsApp Image 2026-01-29 at 23.10.18 (4).jpeg
WhatsApp Image 2026-01-29 at 23.10.18 (1).jpeg




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:

Python:
import pyvisa
import time
import numpy as np
import matplotlib.pyplot as plt

# Cihazların Bağlantı Bilgileri
SKOP_ADRESI = 'TCPIP0::192.168.50.200::inst0::INSTR'
JEN_ADRESI = 'TCPIP0::192.168.50.195::inst0::INSTR'

# NI-VISA klasör yolu
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ı!")
 
    # --- ÖN AYARLAR ---
    # 20MHz limiti aç
    skop.write("C1:BWL ON")
    skop.write("C2:BWL ON")

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

    # Skala manuel sabitleme.
    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()

#  TEST PARAMETRE
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

# Akıllı vites için skala listesi ve takibi
voltaj_kademeleri = [1.0, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01, 0.005]
su_anki_vites_kanal2 = 1.0

# Frekans listesi
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)

# Jeneratörü öölçime hazırla
jenerator.write(f"C1:BSWV WVTP,SINE,AMP,{genlik_degeri},OFST,0")
jenerator.write("C1:OUTP ON")

for frekans in frekans_listesi:
    # Frekansı Ayarla
    jenerator.write(f"C1:BSWV FRQ,{frekans}")
 
    # Ekranda hep 2-3 dalga oluştur, osiloskobun ölçüm hatasını azalt.
    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}")
 
    # Sinyali bekle
    bekleme_suresi = 1.2 if frekans < 100 else 0.3
    time.sleep(bekleme_suresi)

    # Sinyal küçüldüyse hassasiyeti artırır (Sondaki bozulmaları silen bölüm)
    try:
        # Hızlı ön ölçüm
        kanal2_kontrol = float(skop.query("C2:PAVA? PKPK").split(',')[-1].strip().replace('V',''))
        # Eğer sinyal dikeyde 3 kareden az yer kaplıyorsa vites düşür
        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
 
    # Ortalama bir ölçüm yap!
    giris_voltajlari = []
    cikis_voltajlari = []
 
    # Yüksek frekans gürültüsünden dolayı örnek sayısını arttırdım
    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

    # Tüm Değer tamam ise ortalama hesapla
    if giris_voltajlari and cikis_voltajlari:
        giris_ortalamasi = sum(giris_voltajlari) / len(giris_voltajlari)
        cikis_ortalamasi = sum(cikis_voltajlari) / len(cikis_voltajlari)
 
        # Gaini hesaplar
        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!")

# --- final grafiğimi yap ---
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
 

Ekler

  • WhatsApp Image 2026-01-25 at 23.12.55 (1).jpeg
    WhatsApp Image 2026-01-25 at 23.12.55 (1).jpeg
    327.8 KB · Görüntüleme: 18
Son düzenleme:
Aynı skoptan bende de var. Ve skoba ağ üzerinden erişim için güzel bir uygulama oldu. Elimde frekans jeneratörü yok ama skoba python kodları ile erişip parametre değiştirmek bile son derce keyifli. Pythonun görünmez gücünü bir defa daha hissettim.

Elinize sağlık.
 
Rica ederim, beğenmenize çok sevindim.
Aynı cihazı kullanan birinden geri bildirim almak daha değerli.

Kesinlikle haklısınız, Python bu cihazların üzerindeki o fabrikasyon sınırları kaldırıp dizginleri tamamen bize veriyor.
Elinizde harici bir jeneratör olmasa bile osiloskobu ağ üzerinden kontrol etmenin çok keyifli ve pratik yanları var.

Otomatik ekran görüntüsü, veri loglama, kendi ölçüm parametrelerinizi gibi işlemler yapılabilir.

Python ile bu cihaz artık bir osiloskop değil; bilgisayarın güçlü, yüksek çözünürlüklü bir sensörü haline gelmiş oluyor.
 
Rica ederim, beğenmenize çok sevindim.
Aynı cihazı kullanan birinden geri bildirim almak daha değerli.

Kesinlikle haklısınız, Python bu cihazların üzerindeki o fabrikasyon sınırları kaldırıp dizginleri tamamen bize veriyor.
Elinizde harici bir jeneratör olmasa bile osiloskobu ağ üzerinden kontrol etmenin çok keyifli ve pratik yanları var.

Otomatik ekran görüntüsü, veri loglama, kendi ölçüm parametrelerinizi gibi işlemler yapılabilir.

Python ile bu cihaz artık bir osiloskop değil; bilgisayarın güçlü, yüksek çözünürlüklü bir sensörü haline gelmiş oluyor.
Kesinlikle haklısınız.
Bu arada elimde Frekans Jeneratörü varmış. Yok yazmıştım biliyorum ama elimdeki İsviçre Çakısını unutmuşum.
Analog Discovery 3.
Üzerinde frekans jeneratörü de vardı. Ayrıyeten kendi kütüphanesi ile de olsa, o da Python ile "full function" kullanılabiliyor.
Ama zaman ayırmak lazım. Çok derin dehlizleri olan bir konu. Özellikle birden fazla özelliği bir arada kullanmak için.
 
Son düzenleme:

Çok teşekkür ederim, üstad lık haddimize değil ama meraklı, kurcalamayı, araştırmayı seviyoruz diyelim. Uzun zamandır araştırma halindeyim :)

Aslında her şey bu cihazın donanımı bu kadar iyiyken neden grafikte bu testere dişlerini görüyorum? merakıyla başladı.

Sorunun donanımda değil, yazılımsal acelecilikte (örnekleme süresinde) olduğunu araştırıp bulunca, araştırmalarım ile birlikte kontrolü Python a devretmek de bir seçenek oldu.

Cihazın içindeki gizli potansiyeli bir kaç satır kodla açığa çıkarabilmek gerçekten çok keyifli, merak uyandırıcı, heyecan vericiydi.
 
Bu arada SDS1104X-E parametrelerin bulunduğu pdf belgesi yada linki paylaşır mısınız? Bi ara bakmak istiyorum.
 
Kesinlikle haklısınız.
Bu arada elimde Frekans Jeneratörü varmış. Yok yazmıştım biliyorum ama elimdeki İsviçre Çakısını unutmuşum.
Analog Discovery 3.
Üzerinde frekans jeneratörü de vsrdı. Ayrıyeten kendi kütüphanesi ile de olsa o da Python ile "full function" kullanılabiliyor.
Ama zaman ayırmak lazım. Çok derin dehlizleri olan bir konu. Özellikle birden fazla özelliği bir arada kullanmak için.


Analog Discovery 3 gerçek bir cevher oldupuna eminim! :)

AD3 gerçekten taşınabilir laboratuvar dünyasının İsviçre Çakısı bence de, bir ara ben de temin etmeyi düşünmüştüm.


AD3'ün jeneratör çıkışını kaynak olarak kullanıp, osiloskop olarak Siglent'i (ağ üzerinden) devreye sokan bir Python scripti hazırlanabilir.

AD3'ün esnekliği ile Siglent'in yüksek örnekleme hızını ve analog gücünü birleşmiş olur diye tahmin ediyorum. Riya Takımı gibi!

Zaman ayırma konusuna kesinlikle katılıyorum.
Kendimden biliyorum en başta sabır ve büyük bir araştırma süreci, hata ayıklama vs istiyor ama bittiğinde aldığınız o pürüzsüz grafikler tüm yorgunluğu alıp harcanan emeği de taçlandırıyor.
 
Son düzenleme:

Ekler

Son düzenleme:
Konu ile alakalı değil ama Gemini şu kodu yazdı ve güzel çalışıyor.
Analog discovery 3 üzerinde sinyl jeneratörü 10Hz sinüs dalga üretip skopla bu dalgayı takip ediyor. Sonucu da matplotlib ile görselleştiriyor.
Python:
import time
import sys
import matplotlib.pyplot as plt
from ctypes import *

# --- Kütüphane Yükleme ---
if sys.platform.startswith("win"):
    dwf = cdll.dwf
elif sys.platform.startswith("darwin"):
    dwf = cdll.LoadLibrary("/Library/Frameworks/dwf.framework/dwf")
else:
    dwf = cdll.LoadLibrary("libdwf.so")

# --- Sabitler (DWF Header'dan) ---
funcSine = c_byte(1)
AnalogOutNodeCarrier = c_int(0)
filterDecimate = c_int(0)

# --- Cihazı Açma ---
hdwf = c_int()
print("Analog Discovery 3 aranıyor...")
dwf.FDwfDeviceOpen(c_int(-1), byref(hdwf))

if hdwf.value == 0:
    print("HATA: Cihaz bulunamadı! WaveForms yazılımının kapalı olduğundan emin olun.")
    sys.exit()

print("Cihaz bağlandı. İşlemler başlıyor...")

# ---------------------------------------------------------
# 1. BÖLÜM: SİNYAL JENERATÖRÜ (WAVEGEN) AYARLARI
# ---------------------------------------------------------
# Kanal 0 = W1 (Sarı Kablo)

# Kanalı aktif et
dwf.FDwfAnalogOutNodeEnableSet(hdwf, c_int(0), AnalogOutNodeCarrier, c_bool(True))
# Fonksiyon Tipi: Sinüs
dwf.FDwfAnalogOutNodeFunctionSet(hdwf, c_int(0), AnalogOutNodeCarrier, funcSine)
# Frekans: 10 Hz
dwf.FDwfAnalogOutNodeFrequencySet(hdwf, c_int(0), AnalogOutNodeCarrier, c_double(10.0))
# Genlik (Amplitude): 1.5V (Bu, 3V Peak-to-Peak demektir)
dwf.FDwfAnalogOutNodeAmplitudeSet(hdwf, c_int(0), AnalogOutNodeCarrier, c_double(1.5))
# Offset: 0V
dwf.FDwfAnalogOutNodeOffsetSet(hdwf, c_int(0), AnalogOutNodeCarrier, c_double(0.0))

# Jeneratörü Başlat
dwf.FDwfAnalogOutConfigure(hdwf, c_int(0), c_bool(True))
print("Wavegen: 10Hz 3Vpp Sinüs üretiliyor...")

# ---------------------------------------------------------
# 2. BÖLÜM: OSİLOSKOP (SCOPE) AYARLARI
# ---------------------------------------------------------
# Kanal 0 = 1+ (Turuncu Kablo)

# Kanalı aktif et
dwf.FDwfAnalogInChannelEnableSet(hdwf, c_int(0), c_bool(True))
# Giriş Aralığı: 5V (Sinyalimiz 3Vpp olduğu için sığar)
dwf.FDwfAnalogInChannelRangeSet(hdwf, c_int(0), c_double(5.0))

# Örnekleme Frekansı: 10Hz sinyali güzel görmek için 1000Hz (1kHz) yeterli
sample_rate = 1000.0
dwf.FDwfAnalogInFrequencySet(hdwf, c_double(sample_rate))

# Buffer Boyutu: Ekranda 3 tam dalga (300ms) görmek isteyelim.
# 1000 örnek/sn * 0.3 sn = 300 örnek
buffer_size = 300
dwf.FDwfAnalogInBufferSizeSet(hdwf, c_int(buffer_size))

# Tetikleme (Trigger) Ayarı: Sinyal ekranda kaymasın diye
dwf.FDwfAnalogInTriggerSourceSet(hdwf, c_byte(2)) # 2 = DetectorAnalogIn
dwf.FDwfAnalogInTriggerTypeSet(hdwf, c_int(0))    # 0 = Edge
dwf.FDwfAnalogInTriggerChannelSet(hdwf, c_int(0)) # Scope Kanal 1
dwf.FDwfAnalogInTriggerLevelSet(hdwf, c_double(0.0)) # 0V'da tetikle
dwf.FDwfAnalogInTriggerConditionSet(hdwf, c_int(0)) # 0 = Rising Edge (Yükselen Kenar)

# Osiloskop birimini başlat (Hazır ol)
dwf.FDwfAnalogInConfigure(hdwf, c_bool(True), c_bool(True))

# ---------------------------------------------------------
# 3. BÖLÜM: GÖRSELLEŞTİRME VE DÖNGÜ
# ---------------------------------------------------------

# Grafik hazırlığı
plt.ion() # İnteraktif mod
fig, ax = plt.subplots()
line, = ax.plot([], [], 'r-') # Kırmızı çizgi
ax.set_ylim(-2.0, 2.0) # Y ekseni -2V ile +2V arası
ax.set_xlim(0, buffer_size/sample_rate) # Zaman ekseni
ax.grid(True)
plt.title("Analog Discovery 3 - Canlı İzleme (10Hz)")
plt.xlabel("Zaman (s)")
plt.ylabel("Voltaj (V)")

print("Grafik penceresi açıldı. Çıkmak için Ctrl+C'ye basın.")

rgdSamples = (c_double * buffer_size)()
sts = c_byte()

try:
    while True:
        # Yeni bir okuma başlat
        # FDwfAnalogInConfigure 2. parametresi False = Reconfigure (mevcut ayarlarla devam)
        # 3. parametre True = Start acquisition
        dwf.FDwfAnalogInConfigure(hdwf, c_bool(False), c_bool(True))

        # Okumanın bitmesini bekle (Trigger yakalayıp buffer dolana kadar)
        while True:
            dwf.FDwfAnalogInStatus(hdwf, c_bool(True), byref(sts))
            if sts.value == 2: # 2 = Done (Tamamlandı)
                break
            time.sleep(0.01)

        # Veriyi cihazdan bilgisayara çek
        dwf.FDwfAnalogInStatusData(hdwf, c_int(0), rgdSamples, buffer_size)

        # Veriyi Python listesine çevir
        data = [rgdSamples[i] for i in range(buffer_size)]
        
        # Zaman eksenini oluştur
        time_axis = [i / sample_rate for i in range(buffer_size)]

        # Grafiği güncelle
        line.set_xdata(time_axis)
        line.set_ydata(data)
        fig.canvas.draw()
        fig.canvas.flush_events()
        
        # CPU'yu rahatlat
        time.sleep(0.05)

except KeyboardInterrupt:
    print("\nÇıkış yapılıyor...")

# ---------------------------------------------------------
# KAPANIŞ
# ---------------------------------------------------------
dwf.FDwfAnalogOutReset(hdwf, c_int(0)) # Jeneratörü kapat
dwf.FDwfDeviceCloseAll()
print("Cihaz bağlantısı kesildi.")

1769773807269.png
 
Konu ile alakalı değil ama Gemini şu kodu yazdı ve güzel çalışıyor.
Analog discovery 3 üzerinde sinyl jeneratörü 10Hz sinüs dalga üretip skopla bu dalgayı takip ediyor. Sonucu da matplotlib ile görselleştiriyor.
Python:
import time
import sys
import matplotlib.pyplot as plt
from ctypes import *

# --- Kütüphane Yükleme ---
if sys.platform.startswith("win"):
    dwf = cdll.dwf
elif sys.platform.startswith("darwin"):
    dwf = cdll.LoadLibrary("/Library/Frameworks/dwf.framework/dwf")
else:
    dwf = cdll.LoadLibrary("libdwf.so")

# --- Sabitler (DWF Header'dan) ---
funcSine = c_byte(1)
AnalogOutNodeCarrier = c_int(0)
filterDecimate = c_int(0)

# --- Cihazı Açma ---
hdwf = c_int()
print("Analog Discovery 3 aranıyor...")
dwf.FDwfDeviceOpen(c_int(-1), byref(hdwf))

if hdwf.value == 0:
    print("HATA: Cihaz bulunamadı! WaveForms yazılımının kapalı olduğundan emin olun.")
    sys.exit()

print("Cihaz bağlandı. İşlemler başlıyor...")

# ---------------------------------------------------------
# 1. BÖLÜM: SİNYAL JENERATÖRÜ (WAVEGEN) AYARLARI
# ---------------------------------------------------------
# Kanal 0 = W1 (Sarı Kablo)

# Kanalı aktif et
dwf.FDwfAnalogOutNodeEnableSet(hdwf, c_int(0), AnalogOutNodeCarrier, c_bool(True))
# Fonksiyon Tipi: Sinüs
dwf.FDwfAnalogOutNodeFunctionSet(hdwf, c_int(0), AnalogOutNodeCarrier, funcSine)
# Frekans: 10 Hz
dwf.FDwfAnalogOutNodeFrequencySet(hdwf, c_int(0), AnalogOutNodeCarrier, c_double(10.0))
# Genlik (Amplitude): 1.5V (Bu, 3V Peak-to-Peak demektir)
dwf.FDwfAnalogOutNodeAmplitudeSet(hdwf, c_int(0), AnalogOutNodeCarrier, c_double(1.5))
# Offset: 0V
dwf.FDwfAnalogOutNodeOffsetSet(hdwf, c_int(0), AnalogOutNodeCarrier, c_double(0.0))

# Jeneratörü Başlat
dwf.FDwfAnalogOutConfigure(hdwf, c_int(0), c_bool(True))
print("Wavegen: 10Hz 3Vpp Sinüs üretiliyor...")

# ---------------------------------------------------------
# 2. BÖLÜM: OSİLOSKOP (SCOPE) AYARLARI
# ---------------------------------------------------------
# Kanal 0 = 1+ (Turuncu Kablo)

# Kanalı aktif et
dwf.FDwfAnalogInChannelEnableSet(hdwf, c_int(0), c_bool(True))
# Giriş Aralığı: 5V (Sinyalimiz 3Vpp olduğu için sığar)
dwf.FDwfAnalogInChannelRangeSet(hdwf, c_int(0), c_double(5.0))

# Örnekleme Frekansı: 10Hz sinyali güzel görmek için 1000Hz (1kHz) yeterli
sample_rate = 1000.0
dwf.FDwfAnalogInFrequencySet(hdwf, c_double(sample_rate))

# Buffer Boyutu: Ekranda 3 tam dalga (300ms) görmek isteyelim.
# 1000 örnek/sn * 0.3 sn = 300 örnek
buffer_size = 300
dwf.FDwfAnalogInBufferSizeSet(hdwf, c_int(buffer_size))

# Tetikleme (Trigger) Ayarı: Sinyal ekranda kaymasın diye
dwf.FDwfAnalogInTriggerSourceSet(hdwf, c_byte(2)) # 2 = DetectorAnalogIn
dwf.FDwfAnalogInTriggerTypeSet(hdwf, c_int(0))    # 0 = Edge
dwf.FDwfAnalogInTriggerChannelSet(hdwf, c_int(0)) # Scope Kanal 1
dwf.FDwfAnalogInTriggerLevelSet(hdwf, c_double(0.0)) # 0V'da tetikle
dwf.FDwfAnalogInTriggerConditionSet(hdwf, c_int(0)) # 0 = Rising Edge (Yükselen Kenar)

# Osiloskop birimini başlat (Hazır ol)
dwf.FDwfAnalogInConfigure(hdwf, c_bool(True), c_bool(True))

# ---------------------------------------------------------
# 3. BÖLÜM: GÖRSELLEŞTİRME VE DÖNGÜ
# ---------------------------------------------------------

# Grafik hazırlığı
plt.ion() # İnteraktif mod
fig, ax = plt.subplots()
line, = ax.plot([], [], 'r-') # Kırmızı çizgi
ax.set_ylim(-2.0, 2.0) # Y ekseni -2V ile +2V arası
ax.set_xlim(0, buffer_size/sample_rate) # Zaman ekseni
ax.grid(True)
plt.title("Analog Discovery 3 - Canlı İzleme (10Hz)")
plt.xlabel("Zaman (s)")
plt.ylabel("Voltaj (V)")

print("Grafik penceresi açıldı. Çıkmak için Ctrl+C'ye basın.")

rgdSamples = (c_double * buffer_size)()
sts = c_byte()

try:
    while True:
        # Yeni bir okuma başlat
        # FDwfAnalogInConfigure 2. parametresi False = Reconfigure (mevcut ayarlarla devam)
        # 3. parametre True = Start acquisition
        dwf.FDwfAnalogInConfigure(hdwf, c_bool(False), c_bool(True))

        # Okumanın bitmesini bekle (Trigger yakalayıp buffer dolana kadar)
        while True:
            dwf.FDwfAnalogInStatus(hdwf, c_bool(True), byref(sts))
            if sts.value == 2: # 2 = Done (Tamamlandı)
                break
            time.sleep(0.01)

        # Veriyi cihazdan bilgisayara çek
        dwf.FDwfAnalogInStatusData(hdwf, c_int(0), rgdSamples, buffer_size)

        # Veriyi Python listesine çevir
        data = [rgdSamples[i] for i in range(buffer_size)]
     
        # Zaman eksenini oluştur
        time_axis = [i / sample_rate for i in range(buffer_size)]

        # Grafiği güncelle
        line.set_xdata(time_axis)
        line.set_ydata(data)
        fig.canvas.draw()
        fig.canvas.flush_events()
     
        # CPU'yu rahatlat
        time.sleep(0.05)

except KeyboardInterrupt:
    print("\nÇıkış yapılıyor...")

# ---------------------------------------------------------
# KAPANIŞ
# ---------------------------------------------------------
dwf.FDwfAnalogOutReset(hdwf, c_int(0)) # Jeneratörü kapat
dwf.FDwfDeviceCloseAll()
print("Cihaz bağlantısı kesildi.")

46533 eklentisine bak


Elinize sağlık!
AD3 zaten yazılım tabanlı bir mimariye sahipti değil mi?.

Aslında AD3 ile bu testi yapmanız çok iyi bir karşılaştırma sunuyor:
AD3 bizim masaüstü osiloskoplardaki gibi mekanik röleler (sanırım) bulunmadığı için, 10 Hz gibi düşük frekanslarda tık-tık vites değiştirme gürültülerini ve bende oluşan o testere dişi zıplamaları muhtemelen hiç yoktur.
Dijital kontrol burada büyük avantaj galiba.

YZ bazı konularda büyük bir fırsat.

AD3 ile 10 Hz - 100 KHz arası bir tarama yapıp grafik almayı denediniz mi?
Otomatik pilot ile Siglent gibi donanımların zorlandığı düşük frekans bölgesinde, AD3 yazılımsal sonucu ne olurdu acaba?
 
Son düzenleme:

python ile değil ama Waveforms üzerinden yaptım.
10 sn içinde 10Hz ile 100KHz arasında sweep ekran görüntüsü.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
8,857
Mesajlar
144,115
Üyeler
3,558
Son üye
Tan Er

Son kaynaklar

Back
Top