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
) 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:
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İ.
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
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
NI-MAX ARABİRİMİ
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 kodunun terminaldeki çıktısı:
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
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İ.
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
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
NI-MAX ARABİRİMİ
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
Son düzenleme: