Siglent SDS2000 serisi osiloskopta logic analizör kullanımı

Sercan

--
Katılım
17 Mart 2019
Mesajlar
5,406
Teori ve mantık bakımından fikrim olsa da logic analizör ile çok fazla tecrübem olmadı. Daha önce aşağıdaki Japon üretimi Sansei marka 3100A logic probum ile çok daha basit gözlemler yapabiliyordum.

20230224_022745.jpg


Şimdi de yeni cihaz ile bilgileri tazelemek, eksikleri tamamlamak ve en önemlisi bilgilerin daha kalıcı olması için bazı denemeler yapmaya karar verdim. Bu çerçevede bugün ilk defa yeni osiloskopumdaki logic analizör özelliğini Arduino ile basitçe tecrübe ettim. Test düzeneğim şöyle; Arduino'a aşağıdaki seri terminale çıktı veren kodu yazdım. Arduino'nun TX bacağını logic analizörün 0. pinine bağladım. Osiloskop'un decode özelliği ile gelen UART sinyalini çözdüm.

C++:
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("**************");
  delay(2000);
}
Not: Kod içindeki print metnini * ile değiştirdim. Merak edenler HEX'den ASCI dönüşümün yapabilirler.
"0x4D, 0x65, 0x6B, 0x61, 0x74, 0x72, 0x6F, 0x6E, 0x69, 0x6B, 0x2E, 0x6F, 0x72, 0x67, 0x0D, 0x0A"


Bu sinyali daha önce nasıl görüyordum? Aşağıdaki videoda yeşil ışığın yandığı sinyali biraz daha aşağıdaki ekran görüntüsündeki sinyal ile aynı.



Osiloskoptaki ekran görüntüsü. Ekran görüntüsü, triger ile yakalanmış sinyalin ekrana tam sığdığı halidir.

ScreenImg.png



Ben fırsat buldukça öğrendiklerimi ve tecrübelerimi aktarmaya çalışacağım fakat merak ettiğiniz bir test koşulu varsa bildirin. İmkanlar dahilinde ise merak ettiklerinizde test edebilirim.
 
Lojik analizörün asıl bereketini çok sayıda dijital sinyal varsa görürsün. Mesela 8 bitlik dijital veriyi Aruino portundan yazdır, aynı veriyi de bir analog çıkışa yazdır. Sonra dijital veriyi lojik analizör ile kaydet, analog veriyi de osiloskobun analog kanallarından birisi ile kaydet. Sonra ikisini aynı anda görüntüle.
 
Jeatronik.org text içindeki metin :tamam1
@Sercan elinize sağlık.
@taydin bir sorum var. Bazı kaynaklarda I2C addreslerinin 7 bit bazı kaynaklarda da 10 bit olabildiği yazıyor. Lojik analizör konusu açılmışken sorayım. 10 bit adrese sahip i2c ile uğraştınız mı?

Bir ara konusunu açtığım Pantum P3500DN yazıcı toner çipi sanırım 10 bit adrese sahip çünkü linuxte i2cDetect -y 1 komutu ile adres taraması yapınca 15-20 tane adres geliyor ama 2-3 tanesi hariç adreslere ulaşamıyordum. Ulaştığım adreslerde de okuduğum veri 0 yada 254 idi.
1677225935778.png


Konu burada.

Toner çipini nasıl okuyabilirim?
 
Son düzenleme:
10 bit i2c adresi olan aygıtla hiç uğraşmadım. Osiloskop kullanarak gerçekten 10 bit olup olmadığını doğrulayabilirsin. Ben pek ihtimal vermiyorum 10 bit olacağına çünkü o yazıcıda kaç tane i2c aygıt olabilir ki, 7 bit adres yetmemiş olsun da 10 bit adrese geçiş gerekli olsun. Aşağıdaki 10 bit adreslemede paket yapısını anlatıyor, bu yapıyı görüyorsan gerçekten 10 bittir. Belki de tersine mühendisliği zorlaştırmak için 10 bit yapmış olabilirler.

 
Teori ve mantık bakımından fikrim olsa da logic analizör ile çok fazla tecrübem olmadı. Daha önce aşağıdaki Japon üretimi Sansei marka 3100A logic probum ile çok daha basit gözlemler yapabiliyordum.

22431 eklentisine bak

Şimdi de yeni cihaz ile bilgileri tazelemek, eksikleri tamamlamak ve en önemlisi bilgilerin daha kalıcı olması için bazı denemeler yapmaya karar verdim. Bu çerçevede bugün ilk defa yeni osiloskopumdaki logic analizör özelliğini Arduino ile basitçe tecrübe ettim. Test düzeneğim şöyle; Arduino'a aşağıdaki seri terminale çıktı veren kodu yazdım. Arduino'nun TX bacağını logic analizörün 0. pinine bağladım. Osiloskop'un decode özelliği ile gelen UART sinyalini çözdüm.

C++:
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("**************");
  delay(2000);
}
Not: Kod içindeki print metnini * ile değiştirdim. Merak edenler HEX'den ASCI dönüşümün yapabilirler.
"0x4D, 0x65, 0x6B, 0x61, 0x74, 0x72, 0x6F, 0x6E, 0x69, 0x6B, 0x2E, 0x6F, 0x72, 0x67, 0x0D, 0x0A"


Bu sinyali daha önce nasıl görüyordum? Aşağıdaki videoda yeşil ışığın yandığı sinyali biraz daha aşağıdaki ekran görüntüsündeki sinyal ile aynı.

22432 eklentisine bak

Osiloskoptaki ekran görüntüsü. Ekran görüntüsü, triger ile yakalanmış sinyalin ekrana tam sığdığı halidir.

22433 eklentisine bak


Ben fırsat buldukça öğrendiklerimi ve tecrübelerimi aktarmaya çalışacağım fakat merak ettiğiniz bir test koşulu varsa bildirin. İmkanlar dahilinde ise merak ettiklerinizde test edebilirim.

Eski yazılımlarda dalga formuna zoom-out, zoom-in yapınca dalga ile metin arasındaki hizalama kayıyordu. Sonra düzeldi gibi hatırlıyorum. ancak uzun bir kayıt alıp yaklaşarak onu bir deneyebilirsiniz.
 
Lojik analizörün asıl bereketini çok sayıda dijital sinyal varsa görürsün. Mesela 8 bitlik dijital veriyi Aruino portundan yazdır, aynı veriyi de bir analog çıkışa yazdır. Sonra dijital veriyi lojik analizör ile kaydet, analog veriyi de osiloskobun analog kanallarından birisi ile kaydet. Sonra ikisini aynı anda görüntüle.
Güzel bir gözlem olur. Deneyeceğim.
 
Ben araç kullanmamıştım. :dusun2: :dusun2: :dusun2:
 
Bugün yukarıdaki testi yapmak için UNO'daki bütün dijital portları kullanan bir desen oluşturdum. Desen basitçe bütün dijtal portları 1 yapıyor ve sonra merdiven şekli olacak gibi 10 milisaniyede ilerliyor. Desen ilk bakışta çok iyi görünüyor.

ScreenImg.png


Fakat bu desenin zamanla kaydığını fark ettim. Bu kayma, yüksek seviyeli programlamadan dolayı oluyor.

Aşağıda yukaridaki ekran görüntüsündeki tetiğin D0'ın yükselme zamanındaki noktana yakınlaştırma yapılmış halini görüyorsunuz.

ScreenImg(1).png


İlk kod şu şekilde.

C++:
void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop() {
  setAll(0x1);
  delay(10);
  setAll(0x0);

  portPulse(0);
  portPulse(1);
  portPulse(2);
  portPulse(3);
  portPulse(4);
  portPulse(5);
  portPulse(6);
  portPulse(7);
  portPulse(8);
  portPulse(9);
  portPulse(10);
  portPulse(11);
  portPulse(12);
  portPulse(13);
}
void setAll(uint8_t v) {
  digitalWrite(0, v);
  digitalWrite(1, v);
  digitalWrite(2, v);
  digitalWrite(3, v);
  digitalWrite(4, v);
  digitalWrite(5, v);
  digitalWrite(6, v);
  digitalWrite(7, v);
  digitalWrite(8, v);
  digitalWrite(9, v);
  digitalWrite(10, v);
  digitalWrite(11, v);
  digitalWrite(12, v);
  digitalWrite(13, v);
}

void portPulse(int p) {
  digitalWrite(p, 0x1);
  delay(10);
  digitalWrite(p, 0x0);
}
 
Yukarıdaki kodu, port manipülasyonu ile portarı doğrudan yazacak şekilde aşağıdaki gibi düzenledim.

C++:
void setup() {
  DDRD = 0xFF;
  DDRB = 0x3F;
}
void loop() {
  PORTD = 0xFF;
  PORTB = 0x3F;
  delay(10);
  PORTD = 0x00;
  PORTB = 0x00;

  PORTD = 0x01; //portSweep
  delay(10);
  PORTD = 0x02;
  delay(10);
  PORTD = 0x04;
  delay(10);
  PORTD = 0x08;
  delay(10);
  PORTD = 0x10;
  delay(10);
  PORTD = 0x20;
  delay(10);
  PORTD = 0x40;
  delay(10);
  PORTD = 0x80;
  delay(10);
  PORTD = 0x00;  //reset D
  PORTB = 0x01;
  delay(10);
  PORTB = 0x02;
  delay(10);
  PORTB = 0x04;
  delay(10);
  PORTB = 0x08;
  delay(10);
  PORTB = 0x10;
  delay(10);
  PORTB = 0x20;
  delay(10);
  PORTB = 0x00;  //reset B
}

Şimdi zamanlama daha doğru çalışıyor. En azından çıkışları 0 yaptığım anda senkronizasyon daha iyi.


ScreenImg(2).png
ScreenImg(3).png
 
Bu koda bir de analog değer eklemek istiyorum ama nasıl ya da ne yapmam gerektiğini bilmiyorum. Aslında PWM çıkışı verdiğim portun birine bir kondansatör ile sinüs çıktı alabilirim sanırım. Bu noktada tavsiye iyi olur.
 
Sadece kondansatörle düzgün bir form vermeniz zor. Genlik de çok küçük oluyor.

Aşağıda Add Ohms kanalında bir RC network ile önce üçgen dalga elde ederek sinüs elde etme uygulaması var. İşinize yarayabilir:

 
PWM olarak niye yazdırıyorsun? Analog çıkışa yazdır. Bir sinüs dalgası üret ve dijitalini PORTB ye analogunu da analog pine yazdır.
 
Üstat ESP32'de 2 adet DAC çıkışı var ama Arduino'ya DAC koymamışlar. O yüzden ya harici DAC eklemek gerekiyor ya da PWM ile filan üretmek gerekiyor. Arduino'da sadece analog giriş var.
 
Konu aşağıdaki sayfaya dallandı.

 
DAC çıkışı yoksa dijital ve analog sinüs aynı anda görüntülemek zor olacak. Ama aşağıdaki gibi gerçek bir problem senaryosunu deneyebilirsin:

Hardware yapılandırması şu: Arduino PORTB nin her çıkışına, 5 mA çeken dirençler bağlı. Arduino'yu harici güç kaynağı ile besliyoruz ve güç kaynağının limit akımını öyle bir değere getiriyoruz ki, 6 veya daha PORTB çıkışı ON ise güç kaynağı akım sınırlama moduna giriyor. Ama buradaki senaryonun amacı açısından, güç kaynağındaki bu akım limitleme olayından haberimiz yokmuş gibi davranıyoruz. Bu durum, suni olarak yaratılmış bir durum olsa da, gerçek hayatta farklı şekilde karşımıza çıkabilir. Besleme hatları fazla uzun, fazla incedir. Fazla endüktiftir. Veya güç kaynağı marjinaldır vs vs.

Yukarıda problemin kaynağı ile ilgili bilgileri şu anda unuttuk. Karşımızdaki tablo şu: Arduino'da bir program çalışıyor. Arduino programı ilk çalıştığında bir "başla" komutu bekliyor terminalden. Bu komut gelince de PORTB yı OUTPUT olarak yapılandırıyor ve sırayla, 500 ms arayla PORTB ye rastgele değerler yazıyor. Program bir süre çalışıyor ama bir süre sonra artık çıkışlarda hiçbir değişiklik olmuyor. Bu problemi debug etmeye çalışıyoruz.

İlk önce, besleme voltajının çökebiliyor olacağından şüpheleniyoruz ve programı çalıştırıp besleme voltajını takip ediyoruz. Öyle bir trigger tanımlıyoruz ki, besleme voltajı çöktüğünde osiloskop trigger etsin ve o andaki besleme voltajını görelim. (Bu triggeri tanımla ve çalıştığını göster)

Problemin besleme voltajının çökmesinden kaynaklandığını doğruluyoruz. Bu çökme oluştuğunda dijital çıkışlarda ne var onu görmek istiyoruz. (Bu ölçümü yapılandır ve sonuçları göster).
 
Problemi mesela 10 kez oluşturuyoruz. Her problem oluştuğunda PORTB de farklı bir pattern var. Ama yeterince kez problemi gördükten sonra, belli sayıdan fazla çıkış ON ise bu problemin tetiklendiğini farkediyoruz ve sonra da çözüm için gerekeni yapıyoruz.
 
Bu soru beni maziye götürdü, duygulandım. :D

Bu senaryoyu ekteki yazarlarından biri olduğum makaleye konu olan makineyi yaparken yaşadım ve Ali hocam -bana manevi evladım der- ile birlikte çözmüştük. Yıl 2004 filandı sanırım, 7 gün hiç uyumadan bu makineden Moldcell için 2 tane yaptım. Birebir aynı devre olmasına rağmen biri sorunsuz çalışyordu. Diğeriyse Start sinyali gelidiğinde üfleyici çalışıyordu ve sonra mikroişlemci sapıtıyordu. Çözümü ise zaten şemada düşünülmüş olan bypass kondansatörünü işlemciye daha yakın bir noktaya taşımak şeklinde bulmuştuk.

Şimdi üşenmeden bilgileri tazelemek adına yukarıdaki senaryoyu bir daha kurayım.

1677590924135.png
 

Ekler

  • Microcontroller_Based_Remote_Controlled_Lottery_Machine-IKS2004_E0601.pdf
    240.8 KB · Görüntüleme: 134

Çevrimiçi personel

Forum istatistikleri

Konular
6,952
Mesajlar
118,763
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top