İçindekiler:

Dual Trace Osiloskop: 11 Adım (Resimlerle)
Dual Trace Osiloskop: 11 Adım (Resimlerle)

Video: Dual Trace Osiloskop: 11 Adım (Resimlerle)

Video: Dual Trace Osiloskop: 11 Adım (Resimlerle)
Video: Tektronix 2235 - 100Mhz Dual Trace, Dual Time Base Oscilloscope 2024, Temmuz
Anonim
Çift İz Osiloskopu
Çift İz Osiloskopu

Önceki mini osiloskopumu kurduğumda, en küçük ARM mikro denetleyicimi bir STM32F030 (F030) performansını ne kadar iyi yapabileceğimi görmek istedim ve iyi bir iş çıkardı.

Yorumlardan birinde, STM32F103'e (F103) sahip bir "Mavi Hap"ın daha iyi olabileceği, F030'lu geliştirme kartından daha küçük ve muhtemelen daha da ucuz olabileceği öne sürüldü. Ama mini osiloskop için geliştirme kartını değil F030'u daha da küçük bir SMD-DIP kartında kullandım, bu yüzden orada bir Mavi Hap kesinlikle daha küçük olmazdı ve daha ucuz olacağından şüpheliyim.

Kod artık Gitlab'da mevcut:

gitlab.com/WilkoL/dual-trace-oscilloscope

Gereçler

Parça listesi: - plastik kutu - perfboard (çift taraflı prototip kartı 8x12cm) - Mavi Hap - ST7735s TFT ekran - lityum iyon pil - HT7333 3.3V düşük çıkış regülatörü - MCP6L92 çift opamp - TSSOP8 - DIP8 kartı - 12 MHz kristal (gerekli değil)) - döner kodlayıcı artı düğme (2x) - güç anahtarı - muz terminalleri (4x) - lityum iyon şarj kartı - birkaç direnç ve kapasitör - naylon ara parçalar, somunlar ve vidalar

Aletler:

- lehimleme istasyonu - 0,7 mm lehim - biraz tel - yan kesici - gözlük ve büyüteç - matkap - multimetre - osiloskop - STLink-V2

Yazılım:

- STM32IDE - STM32CubeMX - STLink Yardımcı Programı - LowLayer kitaplığı - ST7735'ler için uyarlanmış kitaplık - Notepad++ - Kicad

Adım 1: Araya Ekleme veya Eşzamanlı Mod

Interleave veya Eşzamanlı Mod
Interleave veya Eşzamanlı Mod
Interleave veya Eşzamanlı Mod
Interleave veya Eşzamanlı Mod

Mavi hap

Ama fikir oradaydı ve F103'ün iki ADC'si olduğunu biliyordum! STM32F407 (F407) ile daha önce yaptığım bir şey olan "interleave" modunda bu iki ADC'yi birlikte kullansaydım ne olurdu? Örnekleme hızı iki katına çıkar. Bunu, daha hızlı bir mikro denetleyici ile birleştirirseniz, mini osiloskopun büyük bir halefi olur.

Ara ekleme modu Tuhaf bir şekilde, F103'teki ADC'ler, F030'daki (ve F407)'dekinden daha az gelişmiştir, çözünürlüğü seçemezsiniz. Daha da önemlisi, iki ADC arasındaki zamanlamayı da değiştiremezsiniz. Şimdi, interleave modunu kullandığınızda, genellikle herhangi bir örnekleme arasında en kısa süre ile örneklemenin mümkün olduğu kadar hızlı olmasını istersiniz, ancak bir osiloskop ile zamanlamayı değiştirmek gereklidir. Belki hala yapılabilir, ben profesyonel bir osiloskop tasarımcısı değilim, ancak araya girme modunu kullanma planından vazgeçtim.

eşzamanlı mod

Ancak, iki ADC'ye sahip olmak çok daha fazla seçenek sunar, iki ADC de "normal-eşzamanlı" moda ayarlanabilir. Çift iz osiloskopa ne dersiniz?

Çift izli bir osiloskop yapmaya karar verdiğimde, mini osiloskopta olmayan bir seçenek olan değişken giriş hassasiyetine de sahip olmak istedim. Bu, girişlerde bir zayıflatıcı (ve yükseltici) anlamına gelir. Ve belki daha fazlasını istedim? Bu yüzden küçük bir "olması güzel şeyler" listesi yaptım.

İSTEK LİSTESİ

iki kanal

her iki kanalda değişken hassasiyet

her iki kanalda tetikleme

her iki kanalda değişken tetik seviyesi

değişken ofset

tek pil gücü

mini osiloskopla aynı kutuya sığdır

2. Adım: Prototipleme

prototipleme
prototipleme
prototipleme
prototipleme

Her zamanki gibi bu projelere bir breadboard üzerinde başladım. (Resme bakın) Ve her şeyi perfboard'a lehimlemeden önce, seçilen proje kutusuna sığıp sığmayacağını ve nasıl sığacağını bulmaya çalışıyorum. Uygun, ama sadece. Bazı kısımlar ekranın altına, bazıları Mavi Hapın altına gizlenmiştir. Ve yine, çoğu projemde olduğu gibi, bu sadece bir kerelik bir proje ve bunun için bir PCB tasarlamayacağım.

Adım 3: Zayıflatıcılar

zayıflatıcılar
zayıflatıcılar

Normal osiloskoplarda giriş zayıflatıcıları, küçük sinyal röleleri ile dirençleri açıp kapatarak zayıflama ve amplifikasyonu değiştiren devrelerdir. Bu rölelerden bazılarına sahip olsam da, bunların 4 Volt'tan daha azına geçmeyeceklerini biliyorum, bu da onların yalnızca tam dolu bir Lityum İyon pil (4.2V) ile çalışacakları anlamına geliyor. Bu yüzden bu dirençleri değiştirmek için başka bir yola ihtiyacım vardı. Tabii ki sadece mekanik anahtarlar takabilirdim, ama bu kesinlikle aklımdaki proje kutusuna sığmayacaktı, belki tekrar daha iyi bir dijital potansiyometre deneyebilirdim (sahip olduğum çok gürültülü).

Sonra kendime dijital bir potansiyometre yapabileceğim "analog anahtarlar" düşündüm. Parça koleksiyonumda CD4066'yı dört analog anahtarla buldum. Buradaki fikir, geri besleme direncine paralel dirençleri açıp kapatarak bir opamp değişkeninin geri besleme direncini yapmaktır.

Çok iyi çalışıyor, ancak 4066'da sadece 4 anahtara sahip olmak ve 2 kanala sahip olmak, üçten fazla hassasiyet seviyesi yapmak mümkün değildi. En çok kullandığım voltaj seviyeleri olduğu için bölüm başına 500mV, 1V ve 2V seçtim. Ekran 6 bölüme ayrılmıştır, böylece -1,5V ila +1,5V, -3V ila +3V ve -6V ila 6V aralıkları sağlanır.

"Sanal-zemin" ile bu aralıkları yukarı ve aşağı hareket ettirebilirsiniz, böylece 0v ila +12V bile mümkündür.

4. Adım: Sanal Zemin

Sanal Zemin
Sanal Zemin
Sanal Zemin
Sanal Zemin

Osiloskop tek bir güç rayı (3.3V) kullandığından, opampların sanal bir zemin seviyesine ihtiyacı vardır, aksi takdirde çalışmazlar. Bu sanal zemin seviyesi, TIM4'ün bir çıkış kanalında PWM ile yapılır, görev döngüsü sadece yüzde birkaçtan neredeyse yüzde yüze değişir. 1k dirençli ve 10 uF kapasitörlü düşük geçişli bir filtre, bunu (neredeyse) 0V ila (neredeyse) 3.3V arasında bir voltaja dönüştürür. Kare dalganın frekansı 100kHz'in hemen altındadır, bu nedenle basit düşük geçiş filtresi yeterince iyidir.

Bu osiloskopun yapımında oldukça geç, kanallar için iki ayrı ofsetiniz olamayacağını fark ettim. Bunun nedeni, tek bir güç kaynağı ile giriş-zemin seviyesinin opampların gerçek zemin seviyesinden ayrı olması gerektiğidir. Böylece her iki kanal da GND ayarını değiştirdiğinizde aynı şekilde hareket eder.

Adım 5: Döner Kodlayıcılar ve Hata Ayıklama

Döner Kodlayıcılar ve Hata Ayıklama
Döner Kodlayıcılar ve Hata Ayıklama
Döner Kodlayıcılar ve Hata Ayıklama
Döner Kodlayıcılar ve Hata Ayıklama

Mini osiloskopta tüm fonksiyonlar için sadece bir döner kodlayıcı kullandım. Bu, ikili bir osiloskopun kullanımını çok zorlaştırır, bu yüzden burada iki taneye ihtiyacım var. Zayıflatıcılar ve sanal zemin seviyesi için bir kodlayıcı ve zaman tabanı ve tetikleme için diğer kodlayıcı. Ne yazık ki, tıpkı diğer projemde olduğu gibi, bu döner kodlayıcılar çok "gürültülü". O kadar kötüler ki, onları okumanın standart yolu olan "kodlayıcı modunda" zamanlayıcılarla çalışmazlar. Her 100us'da bir kodlayıcıları kontrol ederek, zamanlayıcı TIM2 ile bir geri tepme mekanizması yapmak zorunda kaldım. Bu zamanlayıcı sırayla (yalnızca) enkoderlerde bir aktivite olduğunda başlatılır, bu, giriş portlarındaki EXTI işlevselliği ile kontrol edilir. Şimdi kodlayıcılar iyi çalışıyor.

Ve görebileceğiniz gibi, bir ekrana sahip olmak, hata ayıklama bilgilerini görüntülemek için de çok kullanışlı olabilir.

6. Adım: Görüntüleme ve Zaman Tabanı

Ekran ve Zaman Tabanı
Ekran ve Zaman Tabanı

Ekranın 160 x 128 piksel çözünürlüğü var, bu nedenle bir ekran için gereken 160 örnek var, ADC'leri saniyede 1,6 milyon örnek yapacak şekilde hızlandırmayı başardım ve bu, çok fazla hız aşırtmalı mikrodenetleyici ile (daha fazlası için), verir bölüm başına minimum 20us zaman tabanı (ekran başına 100us). Böylece 10kHz'lik bir dalga formu tüm ekranı dolduracaktır.

Bu, daha önce yaptığım mini osiloskoptan sadece iki kat daha hızlı. Eh, şimdi iki kanallı:-).

Söylendiği gibi, ekran 160 piksel genişliğindedir, bu nedenle ekran başına yalnızca 160 değer gereklidir. Ancak tüm arabellekler aslında 320 örnek içerir. Böylece DMA, bir iletim tamamlama kesintisini (TC) tetiklemeden önce 320 değeri depolar. Bunun nedeni, tetiklemenin yazılımda yapılmasıdır. Örnekleme rastgele bir anda başlar, bu nedenle arabellekteki ilk değerin tetikleme noktasının olması gereken yer olması pek olası değildir.

Bu nedenle trace_x_buffer üzerinden okunarak tetikleme noktası bulunur, değer istenen tetikleme değerinde ise en önceki değer hemen altındaysa tetikleme_noktası bulunur. Bu oldukça iyi çalışıyor, ancak gerçek ekran boyutundan daha büyük bir arabelleğe ihtiyacınız var.

Daha düşük zaman tabanı ayarlarındaki yenileme hızının beklediğinizden daha yavaş olmasının nedeni de budur. 200ms/div ayarını kullandığınızda, veri dolu bir ekran 1 saniyedir, ancak dönüşüm miktarı iki katına çıktığı için bu 2 saniye sürer. Daha hızlı zaman tabanı ayarlarında bunu çok fazla fark etmeyeceksiniz.

TIM3, zaman tabanını oluşturmak için kullanılır. Seçilen zaman tabanı ayarının gerektirdiği hızda ADC'leri tetikler. TIM3'ün saati 120 MHz'dir (bkz. OVERCLOCKING), saydığı maksimum sayı (ARR), diğerlerinin nasıl taşacağını veya ST dilinde güncelleneceğini belirler. TRGO aracılığıyla bu güncelleme darbeleri ADC'leri tetikler. Ürettiği en düşük frekans 160 Hz, en yüksek frekans ise 1,6 MHz'dir.

Adım 7: ADC'ler ve DMA

ADC'ler ve DMA
ADC'ler ve DMA

İki ADC, girişlerindeki voltajı aynı anda dönüştürür, bu iki 12 bitlik değeri tek bir 32 bit değişkende saklar. Bu nedenle DMA'nın aktarılacak (çift) dönüşüm başına yalnızca bir değişkeni vardır.

Bu nedenle bu değerleri kullanmak için onları iki değere bölmek gerekir, böylece iki izi görüntülemek için kullanılabilirler. Söylendiği gibi, F103'teki ADC'ler 12 bitten başka çözünürlüklere ayarlanamaz. Her zaman 12 bit modundadırlar ve bu nedenle dönüşümler her zaman aynı sayıda saat darbesi alır. Yine de, ADC'lerin hız aşırtması ile saniyede 1,6 MSörnek yapılabilir (bkz. Ekstra: Hız Aşırtma).

ADC'lerin referansı, 3.3V ray olan Vdd'dir. Bunu daha uygun değerlere dönüştürmek için (bölme başına) zayıflatıcıların değerlerini hesapladım, çünkü bu hesaplamalardan çıkan tam direnç değerlerine sahip değilim çünkü yazılımda bazı düzeltmeler yapıldı.

Bu projede DMA'yı "normal modda" kullanıyorum. Bu modda, kelime sayısı (veya yarım kelime veya bayt) tümü aktarıldığında DMA veri aktarımını (de ADC'lerden belleğe) durdurur. Diğer olası mod olan "dairesel mod"da, DMA kendini sıfırlar ve kesintisiz olarak veri aktarmaya devam eder. Bu F103 ile çalışmadı, o kadar hızlı ki programın geri kalanı onu okuyamadan adc_buffer içindeki verilerin üzerine yazar. Yani şimdi süreç aşağıdaki gibidir:

- DMA'yı aktarılacak veri sayısına ayarlayın ve DMA'yı etkinleştirin

- ADC'lerin tetiklenmesini başlatın, bunlar her (çift) dönüşümden sonra DMA transferleri isteyecektir

- ayarlanan sayıda dönüşüm aktarıldıktan sonra DMA durur

- ayrıca ADC'lerin tetiklenmesini derhal durdurun

- bellekteki veriler üzerinde gereken tüm işlemleri yapın

- ekranda izleri göster

- işlemi yeniden başlatın

Adım 8: Kullanıcı Arayüzü

Kullanıcı arayüzü
Kullanıcı arayüzü

160 x 128 piksellik bir ekran çok büyük değil ve mümkün olduğu kadar çok kullanmak istiyorum. Yani akım ayarları için ayrılmış bir parçası yoktur. Son birkaç satırda dikey hassasiyet, zaman tabanı, tetikleme seviyesi ve tetikleme kanalı görüntülenir, ancak sinyaller yeterince büyük olduğunda aynı alanda görünecektir. Aktif olan seçenek sarı, kalanı beyaz olarak gösterilir.

9. Adım: Bina ve Olası İyileştirmeler

Bina ve Olası İyileştirmeler
Bina ve Olası İyileştirmeler
Bina ve Olası İyileştirmeler
Bina ve Olası İyileştirmeler
Bina ve Olası İyileştirmeler
Bina ve Olası İyileştirmeler
Bina ve Olası İyileştirmeler
Bina ve Olası İyileştirmeler

Bu proje için oldukça mutluyum. İyi çalışıyor ve işi yapıyor, ancak daha iyi olabilirdi.

Proje kutusu, her şeyi rahatça sığdırmak için çok küçüktür, bu da bileşenlerin Mavi Hap'ın altına yerleştirilmesine neden olur. Bunu mümkün kılmak için Mavi Hap, doğrudan "ana karta" lehimlenemezdi. Ve bu, her şeyi çok yüksek yaptığı için, BOOT0 ve BOOT1'i (hiç kullanmadığım şeyler) seçmek için atlama telleri gibi Mavi Hap'dan birçok parçayı çıkarmak zorunda kaldım ve hatta kristali yukarıdan aşağıya doğru hareket ettirmek zorunda kaldım. pcb.

BNC veya SMA konektörleri yerine banana konektörleri kullanarak hayatı daha zor hale getirdim, bu, perfboard'un büyük bir kısmının "gitmesi yasak alan" olduğu anlamına geliyordu, bunu netleştirmek için kendimi önlemek için üzerine kapton bant koydum üzerine parçalar koymaktan.

Her şeyi bu kadar küçük bir proje kutusuna koymanın bir başka sorunu da analog ve dijital devrelerin birbirine çok yakın olmasıdır. Her iki izde de oldukça fazla gürültünün göründüğünü görebilirsiniz. Bu, breadboard'da bile yoktu! Analog ve dijital devreler için güç hatlarını olabildiğince uzağa taşıyarak küçük bir iyileştirme yapıldı, ancak benim zevkime göre yeterli değildi. Analog devrelerdeki tüm direnç değerlerini benim yaptığımdan daha da azaltmak (giriş direnci 1MOhm yerine 100kOhm'dur) yardımcı olmadı. Harika olmayan en hızlı zaman tabanı ayarında (20us/div) tetiklemenin de sinyallerde daha az gürültü ile iyileşeceğinden şüpheleniyorum.

Bu tasarımı, tüm smd parçaları ve analog, dijital ve güç için ayrı katmanlarla (bu 4 katman!) "gerçek" bir pcb üzerinde yaparsanız, muhtemelen çok iyi çalışacaktır. Çok daha küçük olacak, tam bir Mavi Hap kullanmayacak, sadece F103 kullanacak ve bu, ADC'ler için ayrı (temiz) bir analog Vdda ile tedarik edilmesini mümkün kılacaktır.

Son bir dokunuş olarak kutuyu siyaha boyamaya karar verdim, sahip olduğu tüm bej kutulardan bir değişiklik yapıyor.

Adım 10: Kod ve Kısa Bir Video

11. Adım: EKSTRA: Hız Aşırtma

EKSTRA: Hızaşırtma
EKSTRA: Hızaşırtma

Tıpkı F03'te yaptığım gibi, bir F103'ün ne kadar iyi hız aşırtılabileceğini görmek istedim. Bu mikrodenetleyicinin özellikleri, maksimum saat hızının 72MHz'i geçmemesi gerektiğini iddia ediyor (elbette ki zaten F030'dan daha hızlıdır), ancak birkaç blogda hız aşırtmanın kolay olduğunu okumuştum, neden olmasın?

Mavi Hap 8 MHz kristal ile sağlanır, PLL bunu 9 ila 72 MHz faktörü ile çarpar. PLL, 128 MHz'lik bir saat vererek 16'ya kadar artırılabilir. Mavi Hapım için bu hiç sorun değildi, aslında tüm Mavi Haplarım 128MHz'de sorunsuz çalışıyor.

Ama şimdi gerçek sınırın ne olduğunu öğrenmek istiyordum. Bu yüzden 8MHz kristalini çıkardım ve yerine 12MHz kristalinden biriyle değiştirdim. Mikrodenetleyici sonunda vazgeçene kadar PLL çarpanını tekrar artırdım. Bu 168MHz'deydi! 156MHz'de hala iyi çalıştı. Saatlerce o hızda çalıştırdım ve çarptığını hiç görmedim. Bu osiloskopta, 12MHz kristal ve 10'da PLL ile ve ayrıca 8 MHz kristal ve 15'te PLL ile seçilebilen bir hız olan 120MHz'e karar verdim. (Main.c'de SystemClock_Config'e bakın)

ADC'ler artık daha hızlı çalışıyor, onları 30MHz'de (14 yerine) çalıştırıyorum, hala 60MHz'de iyi çalışıyorlardı, STMicroelectronics bazı güzel donanımlar yapıyor!

STMicroelectronics bu limitleri veri sayfasında iyi bir nedenle koyar, mikrodenetleyicinin her koşulda belirtilen 72MHz'de çalışmasını garanti eder.

Ancak mikrodenetleyiciyi -40 Santigratta, +85 Santigratta, sadece 2.0 Voltta veya 3.6 Voltta kullanmadığım için, overclock yapmanın güvenli olduğunu düşünüyorum. Mikrodenetleyicileri olan bir cihazı satmayı düşündüğünüzde bunu YAPMAYIN, nerede kullanılacağını asla bilemezsiniz.

Önerilen: