PC Arayüzü ile Arduino Yüksek Hızlı Osiloskop: 8 Adım

PC Arayüzü ile Arduino Yüksek Hızlı Osiloskop: 8 Adım

İçindekiler:

Anonim

Arduino'nuzu ve PC'nizi bir hızlı Depolama Osiloskopu.

Arduino, 141 ila 153 KiloHertz arasındaki voltaj değerlerini güvenilir bir şekilde toplayabilir.

Yaklaşık 6.8ms'de 1000 veri okuma yapılabilir.

Bir PC'ye aktarıldığında, bu noktalar olabilir tam olarak zamana karşı komplo.

Bu Bilgi Tablosu, analog girişin tekrar tekrar 1000 baytlık bir tampona nasıl eklenebileceğini ve ardından bir seri monitöre aktarılabileceğini gösterecektir. Veriler, süresi doğru bir şekilde belirlenebilen yüksek frekanslı bir kesme kullanılarak toplanır. Bir dizi olası periyot üretmek için frekans değiştirilebilir.

Verileri görüntülemek ve arduinoyu kontrol etmek için bir PC arayüzü yazdım. Bilgisayarımın programı olduğu gibi sunuluyor - açıklanması çok uzun zaman alabilir!

Arduino'dan veri çıkışı karmaşık değil. Başkalarının kendi seçtikleri işletim sistemi için arayüz yazacağına eminim.

Arduino veri yakalama için biraz farklı iki versiyon yazdım. Birisi, osiloskop tetiklemeden önce gerilimde doğru bir değişiklik gerektiğinde, yazılım tetiklemesinden yararlanır. İkincisi, Arduino pin 2'deki bir kesmeye dayanarak donanım kenarı tetikleyicisini kullanır. Donanım versiyonu en yüksek frekansta biraz daha hızlı çalışır.

Bugün küçük bir yeniden yazma yaptım (31/8/2014). PC arayüzü şimdi, gerilim referansını Arduino "5V" hattının gerçek değerini doğru bir şekilde yansıtacak şekilde ayarlama seçeneğini içerir. Arduino yazılımında küçük ayarlamalar da vardır.

09.09.2014 tarihi itibariyle Software Triggered versiyonunun biraz değiştirilmiş bir versiyonunu geliştirdim. Mega'da 227.3 KHz, doğrudan tek bir okuma okurlarını kontrol etmek için kayıt komutlarını kullanarak. Eğer ilgi varsa bilmeme izin ver.

ADC Arduino Mega bilgileri, Amtel atmega328p kılavuzunun 242-260. Sayfalarında bulunabilir.

29/9/2015 tarihi itibariyle PC ve Arduino yazılımı güncellendi.

Video en iyi Yüksek çözünürlüklü (720p), tam ekran izlenir:

Gereçler:

1. Adım: Gereksinimler

Arduino Mega 2560 (Diğer arduino tipleri çalışıp çalışmadığını bana bildirin)

Aşağıdaki bileşen işleri alternatifler uygulanabilir olabilir (program ayarlamasıyla - Bunu size bırakıyorum!)

LCD Tuş Kalkanı http: //www.hobbytronics.co.uk/arduino-lcd-keypad -…

Analog voltajları kabul etmek için basit Tampon kutusu: (Sadece voltaj tamponları yoksa gereklidir)

NE5534P op amp

22pf, 10nf kondansatörler

İki adet 100K değişken direnç

22K, 4k7, 12K, iki 470K direnç, 0.25W tamam

10K hassas direnç (% 1)

İki adet 1K değişken direnç

10 uF elektrolitik kondansatör, 16V veya daha fazla

Bakır Şerit, Plastik Kutu, Konnektörler ve lehimleme ekipmanları

Bir multimetre

Dengeli + -9V besleme (NE5534P'nin çıkışta 5V üretmesini sağlamak için en az + -6V gerekir)

Windows işletim sistemine sahip bir bilgisayar. Arayüzümü XP, Windows 7 ve Windows 8'de test ettim.

(Veya kendi yazılım arayüzünüzü oluşturun.)

Adım 2: Özellikler

Arduino programı:

Her iki sürümde de örnek Analog bağlantı noktası 1.

Veriler bir tetikleyici ile veya tetikleyici olmadan yakalanabilir.

Örnekleme frekansı kontrol edilebilir ve farklı örnekleme periyotlarına izin verilir.

Bazı metin bilgileri seri port ve lcd ekranına gönderilir.

LCD ekran düğmeleri, eğimi, örnekleme periyodunu ve örneklemeyi tetikler.

Voltaj verileri bir tamponda bayt olarak verilir. (Bu hız içindir)

Ham verileri yakalamak için bir program gereklidir.

1) Osiloskop.

Yazılım tetikleme sürümü.

Tetikleyici seviye mV cinsinden belirtilebilir. Örnekleme, gerilim, müteakip iki örnekleme değeri arasında, tetik değerinden daha yüksek bir değere (veya altına düştüğünde) başlar.

Trigger seviyesi, a / d portunun çözünürlüğü ile sınırlı olan en uygun seçimdir.

Referans voltajı ayarlanabilir.("5V" çizgisini 5V'da bulmazsanız veya referansı tamamen farklı bir cihaz kullanıyorsanız kullanışlıdır.)

2) OsiloskopExt.ino

Donanım tetikleme sürümü.

Tetik, dijital bağlantı noktası 2 tarafından kontrol edilen donanımdır.

Girişinizi analog port 1 ve dijital port 2'ye bağlayın.

Sıfır olmayan, pozitif, tetikleyici bir seviye ayarlanarak etkinleştirilir.

Ortak özellikleri

Gerçek zamanlı Osiloskop kesintilerini kullanarak.

Seri, LCD ve flash bellek desteği.

LCD düğme desteği. (Lcd adc portu lcdport değişkeni tarafından belirtilir)

Seri Monitör, 115200 baud'a ayarlandı.

SDCARD gelecekteki gelişim için tespit edildi.

Gerekirse, aşağıdaki donanım test edilmiştir:

  • Mantıksal Dönüşüm V2 ile Düzenlenen MicroSD Breakout Board http: //www.hobbytronics.co.uk/microsd-card-regula …
  • 4GB Micro SD Hafıza Kartı http: //www.hobbytronics.co.uk/microsd-card-regula …

Veriler, seri port'a dolduğunda yazılan 1000 baytlık bir belleğe yazılır.

Seri çıkış formatı:

Sıfır bayt (el sıkışma)

Mili Hertz'de örnekleme frekansının tamsayı değerine sahip 4 bayt

1000 bayt veri

Örnekleme tek bir olay veya tekrarlayıcı olabilir (Hızlı çalıştırma).

Hızlı bir şekilde, arduino, verileri çıkardıktan sonra 1500 mili saniye boyunca herhangi bir karakterin seri yanıtını bekleyecektir. Bir karakter alınırsa (el sıkışma), Arduino hemen daha fazla veri toplar. 1500 mS yükselirse, ne olursa olsun, daha fazla veri kaydedilir.

LCD Tuş Takımı Kalkanı üzerindeki düğmeler aşağıdaki sonucu verecektir:

Seç - yeni bir örnek başlatır (veya hızlı çalışmayı kısaltır)

Yukarı - Pozitif kenar tetiği

Aşağı - Negatif kenar tetikleyicisi

Sol - Örneklenen süreyi azaltın (Preskalar'ı artırır)

Sağ - Örneklenmiş süreyi arttırın (Preskalar'ı azaltın)

LCD ekranın, düğmelerin çalışabilmesi için Analog bağlantı noktası 0 gerektirdiğini unutmayın.

Örneklemeden sonra, Lcd'de temel bilgiler görüntülenir.

Seri Giriş komutları:

'again' Yeni veri yakalamayı başlat.

'test' Test için PM3 Square'deki bir kare dalgayı değiştirin.

'trig' Tetikleyici seviye seti. 0 gönderilirse tetikleme iptal edilir. Sıfır olmayan tetikleme seviyeleri tetikleme üretir. LCD ekran düğmeleri, tetikleyicinin pozitif mi yoksa negatif eğimde mi olduğunu kontrol eder.

'run' Tekrarlanan örnekleme - hızlı çalışma. Çalışma sırasında seri bağlantı noktası metni gönderilmez- sadece ham veri.

Hızlı çalışma sırasında örnekleme periyodu ve kenar seçimi değiştirilebilir. Hızlı seçim, lcd seçim tuşu kullanılarak durdurulur.

PC Arabirimi:

Arduino'dan ham ticari port osiloskop verilerini yakalayın.

Arduino'yu kontrol etmek için metin yolla.

Arduino'dan metin al.

Arduino trig seviyesini ve örnekleme sıklığını ayarlayın.

Örnekleme ve hızlı çalışma başlat.

Arduino ile eşleşmesi için voltaj referansını "vref" olarak ayarlayın. Arduino'ya gönder. Bu bilgiyi sadece yazılım osiloskop versiyonunun kullandığını unutmayın. (Yazılım tetikleme seviyesini hesaplamak için).

Voltaj referansını ayarlamak voltajı daha doğru gösterir. varsayılan 5V seviyesi ile çalışmaktan.

Zamana karşı gelen verileri grafik.

Mevcut ölçekler:

ham 0-255

0V - 5V

-2.5 - + 2.5V

-5 ila + 5V

-9 ila + 9V

Alınan örnekleme frekansından hesaplanan grafik zaman ekseni.

Veriler bir kez veya tekrar tekrar örneklenebilir.

Tekrarlanan örnekleme sırasında:

Karşılaştırma pozisyonlarını korumak için X ekseni ölçeklendirmesi dondurulabilir

Tüm grafik dondurulabilir.

Bir veri dosyasına okumalar çıktılayın (bkz. Kapsamdata.txt)

Veri frekansına göre hesapla

1) maksimum verinin ortalaması ve minimum verinin gerilimi etrafında pozitif kenarlar

2) 'http://www.instructables.com/id/Reliable-Frequenc' adresinde ayrıntılı olan dsp yöntemi …

Grafik ve veri bilgi ekranının pano kopyası.

Osiloskop ekranın jpg görüntü dosyası.

Osiloskop ekranının yazıcı çıkışı.

Grafikte yakınlaştırma seçeneği.

Arduino'dan sahte başlangıç ​​karakterlerini çöpe atmak için önemsiz bekleme ayarı.

Comport karakter almayı bıraktığında yakalamayı durdurmak için zaman aşımı ayarı.

Seri baud hızını ayarlayın.

Uygulama, çekim sırasında konumu kilitler.

bu, oluşacak kesintilerin örneklemeyi yavaşlatmamasını sağlar.

Son ayarlar kaydedildi.

Adım 3: Yazılımın Tetiklediği Sürüm İçin Kesmeyi Ayarlama

Arduino'da hızlı veri yakalamanın ayarlanması konusunda birkaç mükemmel öğreti olmuştur.

Aşağıdakileri çeşitli kaynaklardan geliştirdim.

Örnekleme kesmesinin frekansını kontrol etmek için preskalar değişkenini kullanırım.

Esasen biz kontrol edilebilir bir frekansta verileri otomatik olarak alan bir kesme.

Kesinti başladığında, kesilen bir rutinde veriler yakalanır.

Tetikleme açıksa, tetikleme koşulu sağlanana kadar veriler ara belleğe aktarılmaz.

Analog port, adport değişkeni ile belirtilir. (ADMUX | = adport)

Frekans bir preskalar kullanılarak tanımlanır. (ADCSRA kaydı: ADPS2, ADPS1 ve ADPS0'ı bitir.)

Bu bitler, sistem saati frekansı ve giriş saati arasındaki ADC'ye bölünme faktörünü belirler.

Arduino 5V, voltaj referansı olarak kullanılır. (REFS0 bit)

USB portumdaki Voltajın Arduino'umu 4.76V'de sürdüğünü unutmayın.

Arduino'ya bir güç kaynağı bağlarsam '5V' hattı 5.06V'dadır.

Doğruluk arıyorsanız, harici güç!

Analog port yakalamasında kullanılan bit sayısını ayarlayın. Hız için 8 bit okunur. ADLAR biti, ADC dönüşümünün sunumunu kontrol eder. Sola ayarlamak için birini ADLAR'a yazın. Aksi takdirde, değer sağa ayarlanır. Bunun ADC Veri Kaydı üzerinde hemen bir etkisi vardır.

ADCSRA'daki bit değerlerini frekans preskaları için ayarlayın. (ADPS0, ADPS1, ADPS2 bit)

Analog port okunduğunda kesmeyi tekrar tekrar Auto Trigger olarak ayarlayın. (ADATE ve ADIE biti)

ADC'yi etkinleştirin. (ADEN biti)

Sbi işlevinin kullanımına dikkat edin. Bu ve cbi işlevi, veri kaydı bitlerini ayarlamak ve temizlemek için çok kullanışlıdır.

ADC kesmesini başlatın. (ADSC biti)

// Bir kesinti kullanarak 'adport' adc portunun sürekli okunmasını ayarlayın

//

cli (); // kesintileri devre dışı bırak, böylece kayıtları kesilmeden değiştirebiliriz

// ADCSRA ve ADCSRB kayıtlarını temizle

ADCSRA = 0;

ADCSRB = 0;

ADMUX | = adport; // analog pin adport'ün sürekli örneklemesini ayarlayın

ADMUX | = (1 << REFS0); // referans voltajını AVCC'ye ayarlayın

ADMUX | = (1 << ADLAR); // ADC değerini sola hizalayın, böylece yalnızca ADCH kaydından en yüksek 8 bit okuyabiliriz

// Preskalar'ı ayarlayın. 8 en hızlı uygulanabilir frekanstır

// 8 preskalar 143Khz (tolere edilebilir kesme hızı azaltmasından sonra)

if (prescalar == 8) ADCSRA | = (1 << ADPS1) | (1 << ADPS0);

// 16 preskalar - 72 Khz örnekleme

if (prescalar == 16) ADCSRA | = (1 << ADPS2);

// 32 prescaler - 16mHz / 32 = 500kHz - 37 Khz örnekleme üretir

if (prescalar == 32) ADCSRA | = (1 << ADPS2) | (1 << ADPS0);

// 64 preskalar 19.2 Khz örnekleme üretir

if (prescalar == 64) ADCSRA | = (1 << ADPS2) | (1 << ADPS1);

// 128 preskalar - 9.4 Khz örnekleme eğer (prescalar == 128) ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADCSRA | = (1 << ADATE); // otomatik tetiklemeyi etkinleştir

ADCSRA | = (1 << ADIE); // ADC Dönüşümünü Tamamla Kesmeyi Etkinleştir

SBI (ADCSRA, ADEN); // ADC'yi etkinleştir

ADCSRA | = (1 << ADSC); // kesme sırasında ADC ölçümlerini başlat

starttime = mikrosaniye (); // süre ve sıklığı hesaplayabilmemiz için zaman kaydedin

// Kesintileri etkinleştir ve kapattık!

sei ();

Kesme kodu

Adc kesme, ISR (ADC_vect) rutini tarafından yapılır.

Değişken bufcount, boyutu BUF_SIZE (= 1000) olan tampondaki konumdur.

Veri yakalanabildiği zaman tetiklenen bayrak geçerlidir.

Arabellek dolduğunda bayrak writeit true olarak ayarlanır ve adc devre dışı bırakılır. (cbi (ADCSRA, ADEN);)

Kesmeyi tetiklemek için, tetiklenen her iki ayar da true olarak ayarlanır ve veriler hemen kayıt etmeye başlar.

Veya newval veri maddesi önceki oldval ile karşılaştırılır.

Fark tetikleyiciden büyükse, tetiklenen değer true değerine ayarlanır ve veriler arabellekte saklanır.

Trigcount değişkeni, tetikleme sırasında okunan veri öğelerinin sayısını saymak için kullanılır.

Bu sayı, gözlemlenen frekansın doğruluğunu korumak için frekans hesaplaması sırasında tampon boyutuna eklenir.

// bu programın anahtarı !!

ISR (ADC_vect) {

eğer (tetiklenmiş) {

bufa bufcount = ADCH;

++ bufcount; // artış tampon sayacı

eğer (bufcount == BUF_SIZE) {

CBI (ADCSRA, ADEN); // ADC'yi devre dışı bırak

bitişsaati = mikrosaniye (); // aralık hesaplama için bitiş zamanını kaydet

writeit = Gerçek; // yazmanın gerekli olduğunu işaretleyin

}

} Başka {

// bir tetikleyici ara

newVal = ADCH;

trigcount ++;

gezi = newval-oldval;

if (! trigplus) gezisi = -trip;

if (trip> tetikleyici) triggered = true; aksi takdirde oldval = newval;

}

}

Adım 4: Donanım Tetiklenen Sürümü için Kesmeyi Ayarlama

Bu yöntem, yazılım sürümüne çok benzer.

Tetikleme farklı şekilde ele alınır.

Bunun çalışması için Dijital Bağlantı Noktası iki, analog giriş 1'e bağlanmalıdır.

Temel olarak, hiçbir tetikleme seçilmezse, adc kesme özelliği etkindir ve veriler derhal yakalanır. Tetikleme seçiliyse, adc port 1'de kesmeyi etkinleştirmek için dijital port 2'de bir kesme kullanılır.

Dijital port 2, analog sinyalleri okumak ve yükselen veya düşen veri kenarlarında bir kesinti oluşturmak üzere yapılandırılabilir. Çok hızlı.

Kesinti yordamına gotinterrupt adı verilir ve dijital bağlantı noktası 2'yi kullandığımda kesme kimliği 0'dır.

const byte ExtInterrupt = 2;

pinMode (ExtInterrupt, GİRİŞ);

attachInterrupt (0, gotinterrupt, RISING);

attachInterrupt (0, gotinterrupt, FALLING);

Bayrak tetiklenir, dijital bağlantı noktası 2 kesmesinin analog bağlantı noktası 1 kesmesini başlatıp başlatmayacağını kontrol eder. Tetiklenme yanlış olduğunda, kesme, analog girişte bir kenar algıladığında adc kesmesini başlatır.

// buraya kadar yazılım kesme koduyla aynı..

SBI (ADCSRA, ADEN); // ADC'yi etkinleştir

// sonra..

eğer (tetikleyici == 0) {

SBI (ADCSRA, ADSC); // kesme sırasında ADC ölçümlerini başlat

starttime = mikrosaniye ();

}Başka{

// pw2 kesmesinin adc kesmesini başlatmasına izin ver

= False tetiklenen;

}

sei (); // kesintileri etkinleştir

Kesme kodu

1) Port 2 kesme Gotinterrupt tarafından servis veriliyor

Bu kesme, port 2'deki pozitif veya negatif bir kenar tarafından etkinleştirilir.

Tetiklenme yanlış oluncaya kadar hiçbir şey yapmaz.

void gotinterrupt () {

if (! tetiklendi) {

= True tetiklenir;

SBI (ADCSRA, ADSC); // kesme sırasında ADC ölçümlerini başlat

starttime = mikrosaniye (); // aralık hesaplaması için başlangıç ​​zamanını kaydedin

}

}

2) Adc Interrupt ISR (ADC_vect) tarafından hizmet verilmektedir.

Değişken bufcount, konumu BUF_SIZE (= 1000) olan arabellekte saklar.

Veriler bufa (0) - bufa (999) konumlarında saklanır.

Arabellek dolduğunda bayrak writeit true olarak ayarlanır ve adc devre dışı bırakılır. (cbi (ADCSRA, ADEN);)

// ADC Kesme rutini

// bu programın anahtarı !!

ISR (ADC_vect) {

bufa bufcount = ADCH;

++ bufcount; // artış tampon sayacı

eğer (bufcount == BUF_SIZE) {

CBI (ADCSRA, ADEN); // ADC'yi devre dışı bırak

bitişsaati = mikrosaniye (); // aralık hesaplama için bitiş zamanını kaydet

writeit = Gerçek; // yazmanın gerekli olduğunu işaretleyin

}

}

Adım 5: Verilerin Verilmesi

Void loop rutini aşağıdaki işlevleri yerine getirir

1) Eğer writeit doğruysa:

  • Mikro zaman geçişini düzelterek gözlenen zaman periyodunu hesaplar.
  • tampon tamponu çıktılar
  • KiloHertz’deki frekansı hesaplar
  • bir el sıkışma sıfır bayt ve milliHertz frekansı ile tampon bufinfo çıktılar
  • düğmelerin okunabilmesi için lcd portunu etkinleştirir
  • Pw3'teki test darbesini kapatır
  • Gösteriler doğruysa, metin ayrıntılarını seri bağlantı noktasına gönderir (hızlı çalıştırma ile yanlış ayarlanır)
  • flag writeit değerini false, hasdata'yı true olarak ayarlar

Veriler eşzamanlı iki bölüm halinde gönderilir.

  • a) Sıfır ile 5 baytlık bir başlık tamponu, ardından miliHz cinsinden frekans olan 4 bayt. MilliHertz'de göndermek, iletilen frekans değerinin doğruluğunu arttırır.
  • b) Her biri 0 ila 255 aralığında olan 1000 bayt ham veri.

2) Eğer hasdata doğruysa

  • lcd düğmelerini kontrol edin
  • hızlı çalışma etkinse, bilgisayardan el sıkışması karakteri arayın (veya 1.5s zaman aşımı) ve daha fazla veri alın
  • seri giriş komutlarını kontrol et

LCD Düğmeleri

Giriş, alt rutin kontrol düğmesi tarafından alınır.

LCD düğmeleri analog port 0'dan okunur.

Her düğme belirli bir değerler aralığında voltaj üretir

Sol düğme, örneğin 400 ila 599 aralığında yer almaktadır.

  • Seç - yeni bir örnek başlatır (veya hızlı koşuyu engeller)
  • Yukarı - Pozitif kenar tetiği
  • Aşağı - Negatif kenar tetikleyicisi
  • Sol - Örneklenen süreyi azaltın (Preskalar'ı artırır)
  • Sağ - Örneklenmiş süreyi arttırın (Preskalar'ı azaltın)

Seri Giriş Verileri

Giriş, alt rutin komut denetimi tarafından alınır.

'Ölçek' pwtoggle işaretini kullanarak testpin (= dijital port 3) üzerindeki kare bir dalgayı değiştirir.

pinMode (testpin, ÇIKIŞ);

if (pwtoggle == false) analogWrite (testpin, 0);

if (pwtoggle) analogWrite (testpin, 127);

Bu çok faydalı. Doğrudan dijital bağlantı noktası 3'ü analog 1'e bağlayın.

'Trigonometri' tetik seviyesini ayarlar. Yazılımın tetiklediği sürümde tetik değişkeni tetikleme seviyesini ayarlamak için matematiksel olarak kullanılır. Donanım versiyonunda basitçe tetiklemeyi değiştirir.

'tekrar' bir örnek kapalı üretiyor

'koşmak' hızlı tekrarlanan bir örnek üretir

'Vref' voltaj referans değerini ayarlar. (Tetikleme seviyesini yorumlamak için sadece yazılım tarafından tetiklenen osiloskop tarafından kullanılır.)

Adım 6: Windows PC Arayüzünü Kurma

WinpcInterface.zip dosyasını açın ve seçtiğiniz bir klasöre çıkarın.

Bulacaksın:

  • oscilloscope.exe, windows arabirimi
  • MSCOMM32.OCX comport denetleyicisi
  • RICHTX32.OCX metin kutusu denetleyicisi
  • rm chart setup.exe grafik çizim desteği
  • ocxWIN7_8.bat toplu iş dosyası, windows 7 veya 8'e ocx kurmak için
  • ocxXP.bat toplu iş dosyası, windows xp'ye ocx kurmak için

Bu sırada yükleyin

1) 'rm chart setup.exe' grafiği desteği. İnternette çok yararlı bir paket buldum. VB programcıları bunu ilginç bulacak!

2) Windows 7/8 için, başvuruyu çıkardığınız klasörün adresini kopyalayın. Windows file explorer'ın üstündeki çubukta bulunan adrese sağ tıklarsanız, klasör adresini kopyalama seçeneğini bulacaksınız.

3) Windows işletim sisteminiz için toplu iş dosyası.

XP - 'ocxXP.bat'

win7 veya win8 - 'ocxWIN7_8.bat'

7/8 kazanmak için yapmanız gerekenler

  • Toplu iş dosyasına sağ tıklayın ve yönetici olarak çalıştırın
  • 2. aşamada kopyalanan adrese yapıştırın ve sonra girin.

Ocx sistem dizinine kopyalanacak ve kaydedilecektir.

Teste hazır!

Arduino'nuzu bağlayın.

İki arduino osiloskop programından birini kurun. (Sert veya yumuşak tetikleme sürümü)

Bunu yapmak için kullanılan herhangi bir seri arayüzden çıkın.

oscilloscope.exe sonra çalıştırılabilir.

Komportu arduino'nuz tarafından kullanılana ayarlayın.

Baudratı 115200 olarak ayarlayın.

Yakalama tıklayın.

Dijital port 3'ü analog 1'e bağlayın.

Komut kutusuna test yazın ve geri dönün.

Dijital portta kare bir dalga mevcuttur. Tekrar seçin ve osiloskop tarafından çizildiğini göreceksiniz.

Frekansı seçerseniz kare dalga frekansını elde edersiniz. İlk tahmin, voltaj aralığının orta noktasındaki yükselen kenarlara dayanmaktadır. İkincisi, mükemmel bir makalede ana hatlarıyla verilen bir tekniğe dayanır:

http: //www.instructables.com/id/Reliable-Frequency …

Grafik, bir fare sol tıklaması ve sürüklemesi kullanılarak 'yakınlaştırılabilir' veya sağ tıklama ile yakınlaştırılabilir.

Seçenekler şunları yapabilir:

  • hızlı koşu'
  • hızlı koşuyu dondur
  • veri karşılaştırması için hızlı çalışma sırasında x ölçeğini dondurun.
  • grafiği yazdır veya kopyala
  • verileri bir metin dosyası olarak çıktılar
  • tetikleme seviyelerini değiştirmek
  • y ölçeğini değiştirmek
  • iki kutuplu y ekseni için bir kaydırma uygulayın
  • voltaj referansını değiştir

Adım 7: Analog Giriş için Basit Bir Tampon Kutu Oluşturma

Gerilimi ön koşullandırmanın birçok yolu vardır

Osiloskopunuz için üç basit Giriş koşullandırıcı:

  1. Gerilim takipçisi
  2. Bipolar + -9V ila 0-5V dönüştürücü
  3. A.C. kuplör

Takipçisi olması gerekiyor

  • Hızlı
  • Yüksek bant genişliği
  • Düşük gürültü
  • Yüksek giriş empedansı
  • Düşük çıkış empedansı

NE5534P faturaya uyuyor ve ucuz. Veri sayfası: http: //pdf.datasheetcatalog.com/datasheet2/d/0ji5w …

Basit bir DC ofset devresine sahiptir - çıkış gerilimini sıfıra ayarlamak için sıfıra ayarlamak için 100K potunu kırptığınızdan emin olun.

Dengeli bir + -9V kaynağı kullandım. Ancak + -6V, 5V'luk bir çıktı sağlamak için yeterli boşluk bırakacaktır. Mutlak maksimum + - 22V.

bipolar dönüştürücü Sıfırın altındaki bir sinyalin, sıfırın altına alınamayan analog port tarafından ölçülmesini sağlar.

Bu iki kutuplu dönüştürücü ilginç. Geçmişte bunları bir amper, hassas voltaj referansı ve çok sayıda trim tencere ile tasarladım. Bu tasarım, Lineer Uygulamalardan Ronald Michallick'in desteklediği bir makaleden ilham aldı. Üç direnç köprüsünün kullanılmasını önerdi ve tasarımı için bir Excel çizelgesi sağladı.

Farklı bir giriş gerilimi aralığına ihtiyacınız varsa, kendi direnç değerlerinizi elde etmek için elektronik tabloyu kullanın.

İki 1k trim tenceresini doğru direnç ölçer ile ayarlayın, böylece üst ve alt dirençler tasarım spesifikasyonlarını karşılar.

Dikkat edilecek bazı noktalar:

a) Arduino "5V" seviyesi doğru olmayabilir. Kesin doğruluk istiyorsanız, elektronik tablo b2-b3 değerlerini değiştirin.

b) + -9V ila 0-5V arası düşüş, 18 ila 5 voltaj düşüşüdür.

Osiloskopumuzun bir rakamı 5 * 1000 * 1/255 = 19,6mV'dir.

18 * 19.6 / 5'lik bir giriş değişikliği, analog portta bir değişikliğe neden olacaktır.

Bu 70.6mV. Böylece nispeten kaba voltaj değişimleri gözlenir (71mV sıçramalarla).

A.C. kuplör çok basittir. DC önyargısı, analog port voltajımızın (5V) orta noktasında ayarlanır.

10uF kapasitöre harici bir DC aktarılamaz. Bu devre bir mikrofon ön amplifikatörüyle iyi çalışır.

Bu devreyi ayarlamak için arduino'ya bağlanın, PC yazılımındaki ham veri ölçeğini kullanın. Port verisini alın ve 100 K potu giriş 127 olacak şekilde kesin. Veya bir voltmetre kullanın ve "5V" / 2 olarak ayarlayın.

Devrelerin tümü, bir parça Bakır şerit üzerine inşa edilecek şekilde düz durur.

Op amp için bir soket öneririm.

Devreleri bir kutuya koymak faydalıdır, Gerektiğinde ayrı çıkışlar birbirine bağlanabilir.

Standart Arduino başlık kablolarının kullanılabilmesi için kutumun yanındaki 0.1 inçlik konektörlere dikkat edin.

Test etmeden önce devrelerinizi kontrol edin. Bu makalenin kullanımındaki tüm sorumluluk size aittir.

Çalışmaya başladığında bana haber ver.

Adım 8: Proje Gelişmeleri

Turbo versiyonum en hızlı dahili ADC'dir. Tetikleme seviyesini ayarlamak için bir potansiyometre kullanır.

20Mhz versiyonum, Arduino'nun asla yapamayacağını farkeden Bob Davis'in yaptığı işten geliştirildi. direkt olarak önemli ölçüde yüksek veri oranlarını ölçmek. Zarif çözümü, verileri yüksek bir saat frekansında yakalamak için harici bir ADC ve bir beşlik kullanmaktı.Bir kez yakalandığında, beşi veri yakalamanın tamamlandığını işaretler ve Arduino verileri saat frekansında aktarır.

20 MHZ osiloskop tlc5510a ve 2K fifo kullanır (IDT7203L12TPG). 2K fifo kullanarak tüm verileri megaya indirerek ve ardından tetikleme noktasını bellekte işleyerek tetikleyebilirim. Bulduktan sonra, sonraki 1000 değerleri PC'ye yükledim. Tetikleme bu nedenle kaya gibi sağlamdır. Her iki voltaj eğiminde de kenar ve seviye tetiklemem var. Trigg noktasını ayarlamak için basit bir potansiyometre kullanılır.

Bir SN74LS393N İkili 4 aşamalı İkili sayıcı üzerinden 20 MHz saat uygulayarak, 0.078 MHz'e kadar inebilirim. Adc yongasını 4V referans modunda kullanıyorum.

Üç tane giriş seçeneğim var.

1) koruma olarak 4V3 zenner ile "Doğrudan". Harici tamponlama kullanılacaksa kullanışlıdır.

2) AC, basit bir 2u2 tantalium ve orta gerilim ve 4V3 zenner ayarlamak için 1K pot ile.

3) Tamponlu, giriş 4 eşleşen 22K direnç boyunca düştü. Bu eşit zayıflamalar üretir. Düşüş, NE5534P 10MHz düşük gürültülü op amperden, takipçi olarak yapılandırılmış … ve sonra 4V3 zenner'e geçirilir. Bu 0 ila 4, 5.33, 8 ve 16V giriş aralıkları üretir.

Benzer bir proje oluşturmak istiyorsanız lütfen veri sayfalarına bakınız!

Daha yüksek frekanslarda, pano tasarımı topraklama ve kademe ayrımı dikkate almalıdır.

İyi yapılandırılmış PCB tasarımı ve sinyal koşullandırma için uygun (pahalı) op amper sayesinde daha yüksek frekanslar mümkündür.

Bu Projeyi 2 Kişi Yaptı!

  • DavidPatterson başardı!

  • DavidPatterson başardı!

Bu projeyi yaptın mı? Bizimle paylaşın!

öneriler

  • Arduino Kod Örneklerini Ezmek

  • Ornithopter Prototipini Açar. Arduino Powered ve Uzaktan Kumandalı.

  • Nesnelerin İnterneti Sınıfı

  • IoT Mücadelesi

  • Gökkuşağı Yarışması'nın Renkleri

  • Sınıf Bilim Yarışması

29 Tartışmalar

0

delta40

1 yıl önce

Merhaba, RAM tasarruf için sadece SDcard rutin koyarak NANO 16MHz içinde uyguladı. Sonuçlar preskalar> = 8 ile aynıdır. Güzel frekans ölçümü ile 50kHz'e kadar okuma

1 cevap 0

DavidPatterson delta40

Yanıtla 1 yıl önce

Her şeyin işe yaramasına sevindim.

20 MHz'lik bir veri ölçüm frekansına gitmek istiyorsanız TLC5510A yongasına bakmaya değer.

David

0

pope54

1 yıl önce

merhaba aliexpress satanlardan bir prob kullanabilir misiniz

0

hackerh

1 yıl önce

Merhaba

Lütfen bir sürü soru sormama izin ver.

Bu kodu 2015/09/20 tanımından denediniz.

Sinyal sinüs dalgasında maksimum örnekleme frekansı 30KHZ'dir.

Örnekleme için daha hızlı birleştirme işlemini hızlandırmam için daha hızlı bir örnekleme modu veya kodu var mı?

Maksimum preskalar değerimi kullandığımı biliyorum.

Örneklemeyi hızlandırmak için Arduino'ya verdiğim yanıtı hızlandırmak için adımlarımı açıklayabilirim.

Bu kodu kullandım.

teşekkür ederim

// Kayıt bitlerini ayarlamayı tanımlar

#ifndef mysbi

#define mysbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))

#endif

#ifndef mycbi

#define mycbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))

#endif

#define BUF_SIZE 1000

uint8_t bufa BUF_SIZE;

const bayt kontrolü = 1 << ADSC;

boole tetiklenir;

boolean trigplus = true;

boolean writeit;

bayt oldval, newval;

int tetikleyici;

imzasız uzun fasttime, starttime;

imzasız uzun süre;

int gezisi;

şamandıra frekansı, periyot, myinterval;

bayt p;

void setup () = (1 << REFS0); // referans voltajını Vcc'ye ayarla

ADMUX

ISR (ADC_vect) {

}

void startad () {

}

boşluk döngüsü () {

/ * Kayıtlar üzerinden hızlı okuma

cf sayfa 242-260 ATmega328P el kitabının

"Mantıksal 1 yazarak tek bir dönüştürme başlatıldı

ADC Başlat dönüşüm biti ADSC. Bu bit yüksek kalır

dönüşüm devam ettiği ve silineceği sürece

dönüşüm tamamlandığında donanım tarafından ".

> = 237.2 KHz !!!!!

*/

// İlk dönüşüm - ADC’yi başlatır

mysbi (ADCSRA, ADSC);

iken ((ADCSRA & check) == kontrol et); // ADSC baytının azalmasını bekle

// Yeni dönüşüm ve tetikleyici için geçerli ADCSRA değerini kullan

byte startit = ADCSRA | Kontrol;

ADCSRA = başlangıç;

while (! tetiklendi) {

// reklam dönüşümü için bekle

iken ((ADCSRA & check) == kontrol et);

newval = ADCH;

// Yeni dönüşüm

ADCSRA = başlangıç;

gezi = newval - oldval;

if (! trigplus) gezisi = -trip;

if (trip> tetikleyici) triggered = true; aksi takdirde oldval = newval;

}

(işaretsiz int i = 0; i <BUF_SIZE; i ++) {

// dönüşüm için bekleyin

iken ((ADCSRA & check) == kontrol et);

bufa i = ADCH;

// Yeni dönüşüm

ADCSRA = başlangıç;

}

mycbi (ADCSRA, ADEN); // ADC'yi devre dışı bırak

writeit = true;

(işaretsiz int i = 0; i <BUF_SIZE; i ++) {

Serial.println (bufa i);

}

}

6 cevaplar 0

DavidPatterson hackerh

Yanıtla 1 yıl önce

2017-08-24 tarihli yanıtta ayrıntılı olarak çalışan çalışma örneği.

Mega üzerinde test edildi.

David

0

hackerh DavidPatterson

Yanıtla 1 yıl önce

Merhaba David

Mega üzerinde programı denedim 30KHZ'de görüntü sinyalini arttırdım.

Sinyal biraz bozuluyor. 30KHZ'deki ekstra frekans daha bozulmuştur.

Bana örneklemenin bana yüksek frekansı gösterdiği bir program yazabilirseniz

LED ekran programlamadan veya bir PC'ye bağlanmadan programlama, yalnızca ADC ile hızlı bir şekilde ilgilenen bir program anlamına gelir

Teşekkür ederim David

Zaman ayırdığım için üzgünüm.

0

DavidPatterson hackerh

Yanıtla 1 yıl önce

Merhaba, Makaleyle ilgili sorulara cevap vermekten mutluluk duyuyorum.

Suç oluşturma niyetinde olmadan özgür bir yazılım yazma hizmeti olmadığımı belirtmeliyim.

David

0

hackerh DavidPatterson

Yanıtla 1 yıl önce

Demek istediğim LCD ekran LED değil

Teşekkür

0

DavidPatterson hackerh

Yanıtla 1 yıl önce

Merhaba, Sanırım bir mega mı yoksa 3. parti mega mı kullanıyorsun?

1) cli () serial.begin'i takip etmelidir

2) isr servis alt rutini gerekli değildir

3) bir 4 ön hazırlık kullanın: ADCSRA | = (1 << ADPS1); // preskalar 4

4) ilk test için tetiklemeden kurtulun-silin:

while (! tetiklendi) {

// reklam dönüşümü için bekle

iken ((ADCSRA & check) == kontrol et);

newval = ADCH;

// Yeni dönüşüm

ADCSRA = başlangıç;

gezi = newval - oldval;

if (! trigplus) gezisi = -trip;

if (trip> tetikleyici) triggered = true; aksi takdirde oldval = newval;

}

5) Sonunda ana döngüdeki reklamı devre dışı bıraktıkça, başlangıcında etkinleştirmeniz gerekir (ADCSRA, ADEN); // ADC'yi etkinleştir

Pacman333 2016-04-11'e verilen cevapta yazılım linkime baktınız mı?

Bu, ekran için bir Sainsmart 3.2 "lcd ve trig seviyesini ayarlamak için bir potansiyometre ile çalışır.

Alkış, David

0

DavidPatterson DavidPatterson

Yanıtla 1 yıl önce

Bu test programı bir mega üzerinde 239.234Khz'de çalışır:

Not 10, test için bir pwm kare dalga üretecek şekilde yapılandırılmıştır.

// Kayıt bitlerini ayarlamayı tanımlar

#ifndef mysbi

#define mysbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))

#endif

#ifndef mycbi

#define mycbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#endif

const byte testpin = 10;

// test için pin10'u analog 0'a bağlayın

// testpin üzerindeki pwm çıktısını tanımlar (megaya özel pin 10!)

#ifndef fastpwm

#define fastpwm (TCCR2B = (TCCR2B ve B11111000) | B00000010)

#endif

#ifndef slowpwm

#define slowpwm (TCCR2B = (TCCR2B ve B11111000) | B00000100)

#endif

#define BUF_SIZE 1000

uint8_t bufa BUF_SIZE;

const byte kontrolü = 1 <= 237,2 KHz !!!!!

*/

void startad () {

imzasız uzun başlangıç ​​zamanı, bitiş zamanı;

startit = false;

cli (); // kesintileri devre dışı bırak

mysbi (ADCSRA, ADEN); // ADC'yi etkinleştir

sei (); // kesintileri etkinleştir

// İlk dönüşüm - ADC’yi başlatır

mysbi (ADCSRA, ADSC);

iken ((ADCSRA & check) == kontrol et); // ADSC baytının azalmasını bekle

// Yeni dönüşüm ve tetikleyici için geçerli ADCSRA değerini kullan

byte startit = ADCSRA | Kontrol;

ADCSRA = başlangıç;

başlangıç ​​zamanı = micros ();

(işaretsiz int i = 0; i <BUF_SIZE; i ++) {

// dönüşüm için bekleyin

iken ((ADCSRA & check) == kontrol et);

bufa i = ADCH;

// Yeni dönüşüm

ADCSRA = başlangıç;

}

bitiş zamanı = mikros ();

cli ();

mycbi (ADCSRA, ADEN); // ADC'yi devre dışı bırak

sei ();

geçen = bitiş zamanı - başlangıç ​​zamanı;

writeit = true;

}

0

hackerh

1 yıl önce

Merhaba

Osiloskop By Arduino UNO oluşturmayı mümkün kılmak için bir sorguya sahibim ve hızlı bir analog okumaya sahip olduğumu 200KHZ için yüksek hızda okuyabiliyor.

Mümkünse, bunu başarmamda bana yardımcı olur

Bunun bir örneğini vermem mümkün mü ADC'nin 200KHZ örneğini almak için hızlı bir şekilde hareketini gösteren küçük bir program.

Bu e-posta adresi [email protected]

Teşekkür

3 cevaplar 0

DavidPatterson hackerh

Yanıtla 1 yıl önce

Merhaba, Uno daha az hafızaya sahip:

  • Flash Bellek: 32 KB olan 0,5 KB bootloader tarafından kullanılıyor

  • SRAM: 2 KB (ATmega328)

  • EEPROM: 1 KB (ATmega328)

Mega:

  • Flash Bellek 256 KB olan 8 KB bootloader tarafından kullanılıyor

  • SRAM 8 KB

  • EEPROM 4 KB

Sonuç olarak her zaman mega'ları depoya aç uygulamalar için kullandım (ve tek bir uno yok).

Bazı üçüncü parti mega panolarına bakmak isteyebilirsiniz - bunlar genellikle bir uno'dan daha ucuzdur!

Saygılarımızla, David

0

hackerh DavidPatterson

Yanıtla 1 yıl önce

Merhaba

Teşekkür ederim arkadaşım

Ancak, Arduino Mega'da bile ADC'yi hızlı bir şekilde anlamak ve 200KHZ örnekleme yöntemini anlamak ve böylece ekran sinyalini temizlemek için çalışıyorum, bu nedenle içinde bulunan hataları düzeltebileceksiniz.

Size yarattığınız programı indirecektir

0-200Khz arası örnek almak üzere ayarlanabilir.

teşekkür ederim

-Bu program:

#include "TimerOne.h"

#define FASTADC 1

// kayıt bitlerinin ayarlanması ve silinmesini tanımlar

#ifndef cbi

#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#endif

#ifndef sbi

#define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))

#endif

uçucu int değeri 300; // sensörden gelen değeri saklamak için değişken

uçucu int i;

uçucu int p = 0;

geçersiz kurulum ()

{

Seri.begin (9600);

#if FASTADC

// ön ayarı 16’ya ayarla

sbi (ADCSRA, ADPS2);

cbi (ADCSRA, ADPS1);

cbi (ADCSRA, ADPS0);

#endif

Timer1.initialize (10);

Timer1.attachInterrupt (timerIsr1); // servis rutini buraya ekle

}

void timerIsr1 () {

eğer (p == 0) {

(int i = 0; i <300; i ++) {

değer i = analog Okuma (A0);

// delayMicroseconds (2);

};

p = 1;

}

}

geçersiz döngü ()

{

(i = 0; i <300; i ++)

{

Serial.println (değer i);

delayMicroseconds (2);

}

// delayMicroseconds (2);

p = 0;

}

0

DavidPatterson hackerh

Yanıtla 1 yıl önce

Merhaba, AnalogRead kullanarak yüksek frekanslı örnekleme için bir başlangıç ​​değildir.

Tüm makaleyi okumanız ve ardından cevabım üzerine odaklanmanız gerekir.

2015-09-20 tarihli albert8855'e

200Khz'de 300 veri değerinin kullanılması = 300 * 1/200000 = 0.0015S

Yani 1.5 mS örnek bir dönem..

Giriş dalgası yapısının anlamlı bir bölümünü yakalamak için daha fazla veri noktasına ihtiyacınız var.

1000 veri noktası 5ms örnekleme süresi verir

David

0

hackerh

1 yıl önce

Merhaba

Osiloskop By Arduino UNO oluşturmayı mümkün kılmak için bir sorguya sahibim ve hızlı bir analog okumaya sahip olduğumu 200KHZ için yüksek hızda okuyabiliyor.

Mümkünse, bunu başarmamda bana yardımcı olur

Bu e-posta adresi [email protected]

Teşekkür

0

mach1950

2 yıl önce

Ben sadece bu David ile yeni tanıştım. Çok iyi bir araya getirilemez, bilginizi paylaştığınız için çok teşekkür ederim. Gelecekteki çalışmaları ilgiyle takip edeceğim.

0

carlos66ba 4 yıl önce Giriş

Çok hoş! Bir seçenek (yaklaşık aynı maliyet için) çok daha hızlı olan Teensy 3.1'i (http://www.pjrc.com/teensy/teensy31.html) kullanmak, özellikle de A / D dönüşümünü (bence olabilir) kullanmaktır. DMA ile yapılır).

2 cevaplar 0

DavidPatterson carlos66ba Yanıtlayan 3 yıl önce Giriş

Yararlı bir link.

Teensy 3.3V tabanlı görünüyor. Böylece Arduino ve PC programı, değişiklik yapılmadan yanlış çalışır. Teensy'de aynı kesintilerin ve kayıt kontrollerinin olup olmadığı hakkında hiçbir fikrim yok. Seri çıkış yolu da bana net değil. Tam olarak çözümde bir düşüş değil mi?

0

Scargill carlos66ba Yanıtlayan 4 yıl önce Giriş

Gerçekten de, Teensy 3.1 72 Meg’de ve 64k RAM’de çalışıyorsa, bana bu güzel PC arayüzünün adaletle sonuçlanabileceğini söylüyor! Normal Arduinos'ta hata ayıklamak için yeterince hızlı bir şekilde bakıyor olabiliriz !!

0

KipsD

4 yıl önce Giriş

Lütfen ADC sicilini kullanma hakkında daha fazla bilgi edinin. ayrıntıları öğrenmem gerekiyor

plez !!!