İçindekiler:

Arduino'dan Süper Hızlı Analog Voltajlar: 10 Adım (Resimlerle)
Arduino'dan Süper Hızlı Analog Voltajlar: 10 Adım (Resimlerle)

Video: Arduino'dan Süper Hızlı Analog Voltajlar: 10 Adım (Resimlerle)

Video: Arduino'dan Süper Hızlı Analog Voltajlar: 10 Adım (Resimlerle)
Video: Arduino Nedir? Nasıl Kurulur ve Neler Yapılabilir? #1 2024, Temmuz
Anonim
Image
Image

Bu Eğitilebilir Tablo, bir Arduino'dan ve basit bir direnç ve kapasitör çiftinden süper hızlı analog voltaj değişikliklerinin nasıl üretileceğini gösterir. Bunun yararlı olduğu bir uygulama, bir osiloskopta grafik oluşturmaktır. Bunu gerçekleştiren birkaç proje daha var. Johngineer, darbe genişlik modülasyonu (PWM) kullanan basit bir Noel ağacı gösteriyor. Diğerleri, bir direnç merdiveni kullanarak veya özel bir dijital-analog dönüştürücü çip kullanarak bu projeyi geliştirdi.

PWM kullanmak çok fazla titremeye neden olurken, bir direnç merdiveni veya dijitalden analoğa dönüştürücü kullanmak, kolayca bulunamayan daha fazla çıkış pini ve bileşen gerektirir. Kullandığım devre, Noel ağacı demosunda kullanılanla aynı ölü basit direnç ve kapasitör çiftidir, ancak önemli ölçüde daha az titreşimle çalışır.

İlk olarak, devreyi oluşturma sürecinde size rehberlik edeceğim. Sonra size kendi resminizi nasıl ekleyeceğinizi öğreteceğim. Son olarak, onu daha hızlı yapan şeyin teorisini tanıtacağım.

Bu Eğitilebilir Yazıyı beğendiyseniz, lütfen buna oy vermeyi düşünün!:)

Adım 1: Devreyi Kurmak

Devreyi Kurmak
Devreyi Kurmak

Devreyi kurmak için aşağıdakilere ihtiyacınız olacak:

a) Arduino Uno veya Arduino Nano gibi Atmel 16MHz ATmega328P tabanlı bir Arduino.

b) En az 150Ω olan R değerinde iki direnç.

c) C değeri C = 0.0015 / R olacak şekilde iki kapasitör, örnekler:

  • R = 150Ω ve C = 10µ
  • R = 1.5kΩ ve C = 1µ
  • R = 15kΩ ve C = 100nF
  • R = 150kΩ ve C = 10nF

Bu değerlerin seçilmesinin iki nedeni vardır. Öncelikle Arduino'nun pinlerindeki akımı maksimum anma akımı olan 40mA'nın altında tutmak istiyoruz. 150Ω değerinin kullanılması, 5V Arduino besleme gerilimi ile kullanıldığında akımı 30mA ile sınırlar. Daha büyük R değerleri akımı azaltacaktır ve bu nedenle kabul edilebilir.

İkinci kısıtlama, R ve C'nin çarpımı olan zamanı yaklaşık 1,5 ms'ye eşit tutmak istediğimizdir. Yazılım, bu zaman sabiti için özel olarak ayarlanmıştır. Yazılımda R ve C değerlerini ayarlamak mümkün olsa da, çalışacağı dar bir aralık vardır, bu nedenle bileşenleri mümkün olduğunca önerilen orana yakın seçin.

RC sabitinin neden önemli olduğuna dair daha ayrıntılı bir açıklama, size gösteri devresinin nasıl monte edileceğini gösterdikten sonra teori bölümünde verilecektir.

Adım 2: Osiloskopun Ayarlanması

Osiloskopun Ayarlanması
Osiloskopun Ayarlanması

Gösteri, X/Y moduna ayarlanmış bir osiloskop gerektirir. Test uçlarının şemalarda gösterildiği gibi bağlanması gerekir. Osiloskopunuz benimkinden farklı olacak, ancak ünitemde X/Y modunu ayarlamak için gerekli adımları izleyeceğim:

a) Kanal B (X ekseni) tarafından kontrol edilecek yatay taramayı ayarlayın.

b) Osiloskopu çift kanal moduna ayarlayın.

c) Volt/div'i her iki kanalda 0V ile 5V arasındaki voltajları gösterebilecek şekilde ayarlayın. Benimkini 0,5V/div olarak ayarladım.

d) Her iki kanalda da bağlantı modunu DC olarak ayarlayın.

e) Arduino kapatıldığında nokta ekranın sol alt köşesinde olacak şekilde X ve Y'nin konumunu ayarlayın.

Adım 3: Yazılımı İndirin ve Çalıştırın

Image
Image

Yazılımı Fast Vector Display For Arduino deposundan indirin. Yazılım, GNU Affero Kamu Lisansı v3 kapsamında lisanslanmıştır ve bu lisansın koşulları altında serbestçe kullanılabilir ve değiştirilebilir.

Arduino IDE'deki "fast-vector-display-arduino.ino" dosyasını açın ve Arduino'nuza yükleyin. Bir an için osiloskop ekranınızda bir "Mutlu Yıllar" animasyonu göreceksiniz.

Bu projeyi Noel'e giden haftalarda kişisel bir hackaton olarak geliştirdim, bu yüzden koddaki PATTERN değişkenini değiştirerek görebileceğiniz Noel ve Yeni Yıl temalı bir mesaj var.

4. Adım: Kendi Özel Çiziminizi Yaratın

PWM'nin Neden Bu Kadar Yavaş Olduğunu Anlayın
PWM'nin Neden Bu Kadar Yavaş Olduğunu Anlayın

Kendi çiziminizi oluşturmak isterseniz, USER_PATTERN'i tanımlayan çizgi üzerindeki Arduino çizimine nokta koordinatlarını yapıştırabilirsiniz.

Inkscape'in özel bir çizim yapmak için oldukça iyi bir araç olduğunu buldum:

  1. Impact gibi büyük, kalın bir yazı tipi kullanarak metin oluşturun.
  2. Metin nesnesini seçin ve "Yol" menüsünden "Nesneden Yola" öğesini seçin.
  3. Harfleri tek tek seçin ve bağlantılı bir şekil oluşturmak için üst üste getirin
  4. Bunları tek bir eğride birleştirmek için "Yol" menüsünden "Birlik"i seçin.
  5. Herhangi bir harfte delikler varsa, dikdörtgen aracıyla bir dikdörtgen çizerek küçük bir çentik açın ve "Fark" aracını kullanarak konturdan çıkarın.
  6. Düğümleri göstermek için yola çift tıklayın.
  7. Dikdörtgen tüm düğümleri seçin ve "Seçili düğümleri köşe yap" aracını tıklayın.
  8. SVG dosyasını kaydedin.

Önemli olan çiziminizin tek bir kapalı yola sahip olması ve delik olmamasıdır. Tasarımınızın yaklaşık 130 puandan az olduğundan emin olun.

Adım 5: SVG Dosyasındaki Koordinatları Arduino IDE'ye Yapıştırın

  1. SVG dosyasını açın ve koordinatları kopyalayın. Bunlar "yol" öğesine gömülecektir. İlk koordinat çifti göz ardı edilebilir; onları 0, 0 ile değiştirin.
  2. Koordinatları, "#define USER_PATTERN" den hemen sonra parantez içindeki Arduino çizimine yapıştırın.
  3. Tüm boşlukları virgülle değiştirin, aksi takdirde derleme hatası alırsınız. "Değiştir ve Bul" aracı yardımcı olabilir.
  4. Derleyin ve çalıştırın!
  5. Sorun yaşarsanız, herhangi bir hata için seri konsolu izleyin. Özellikle, deseninizde dahili arabellek için çok fazla nokta varsa mesajlar görürsünüz. Bu gibi durumlarda, görüntü aşırı titreme sergileyecektir.

Adım 6: PWM'nin Neden Bu Kadar Yavaş Olduğunu Anlayın

Başlamak için, bir kapasitörün şarj olurken davranışını gözden geçirelim.

Vcc voltaj kaynağına bağlı bir kapasitör, üstel bir eğriye göre voltajını yükseltecektir. Bu eğri asimptotiktir, yani hedef gerilime yaklaştıkça yavaşlayacaktır. Tüm pratik amaçlar için, voltaj 5 RC saniyeden sonra "yeterince yakın" olur. RC'ye "zaman sabiti" denir. Daha önce gördüğümüz gibi devrenizdeki direnç ve kondansatör değerlerinin çarpımıdır. Sorun, 5 RC'nin bir grafik ekranındaki her noktayı güncellemek için oldukça uzun bir süre olmasıdır. Bu çok fazla titremeye yol açar!

Bir kondansatörü şarj etmek için darbe genişlik modülasyonu (PWM) kullandığımızda, daha iyi durumda değiliz. PWM ile voltaj 0V ile 5V arasında hızla değişir. Pratikte bu, yükü kapasitörün içine itmek ve birazını tekrar dışarı çekmek arasında hızla geçiş yaptığımız anlamına gelir - bu itme ve çekme, ileriye doğru büyük bir adım atarak ve sonra geriye doğru küçük bir adım atarak bir maraton koşmaya çalışmak gibidir. tekrar tekrar.

Hepsinin ortalamasını aldığınızda, PWM kullanarak bir kapasitörü şarj etme davranışı, kapasitörü şarj etmek için sabit bir Vpwm voltajı kullanmış olmanızla tamamen aynıdır. İstenen voltaja "yeterince yakın" olmamız hala yaklaşık 5 RC saniye sürüyor.

Adım 7: A'dan B'ye Biraz Daha Hızlı Gidin

A'dan B'ye Biraz Daha Hızlı Gidin
A'dan B'ye Biraz Daha Hızlı Gidin

Varsayalım ki zaten Va'ya kadar şarj edilmiş bir kondansatörümüz var. Varsayalım ki, b'nin yeni değerini yazmak için analogWrite() kullanıyoruz. Vb geriliminin elde edilmesi için beklemeniz gereken minimum süre nedir?

5 RC saniye tahmin ettiyseniz, bu harika! 5 RC saniye beklenerek kondansatör Vb'ye çok yakın bir değere şarj olacaktır. Ama istersek aslında biraz daha az bekleyebiliriz.

Şarj eğrisine bakın. Görüyorsunuz, başladığımızda kapasitör zaten Va'daydı. Bu, t_a zamanını beklememiz gerekmediği anlamına gelir. Sadece kondansatörü sıfırdan şarj ediyor olsaydık yapmak zorunda kalırdık.

Yani o zamanı beklememekle bir gelişme görüyoruz. t_ab süresi aslında 5 RC'den biraz daha kısadır.

Ama bekleyin, çok daha iyisini yapabiliriz! v_b'nin üzerindeki tüm o boşluğa bakın. Elimizdeki maksimum voltaj olan Vcc ile ulaşmayı düşündüğümüz Vb arasındaki fark budur. Bu ekstra voltajın, gitmek istediğimiz yere çok daha hızlı ulaşmamıza nasıl yardımcı olabileceğini görebiliyor musunuz?

Adım 8: Bir Turbo Şarj Cihazıyla A'dan B'ye Gidin

Bir Turbo Şarj Cihazı ile A'dan B'ye Gidin!
Bir Turbo Şarj Cihazı ile A'dan B'ye Gidin!

Doğru. PWM'yi hedef voltaj V_b'de kullanmak yerine, onu çok, çok daha kısa bir süre boyunca sabit bir Vcc'de tutuyoruz. Ben buna Turbo Charger yöntemi diyorum ve bizi gitmek istediğimiz yere gerçekten çok hızlı götürüyor! Zaman gecikmesinden sonra (ki bunu hesaplamamız gerekiyor) V_b'de PWM'ye geçerek frenlere basıyoruz. Bu, voltajın hedefi aşmasını önler.

Bu yöntemle, kondansatördeki voltajı V_a'dan V_b'ye değiştirmek, sadece PWM kullanmaktan çok daha kısa bir sürede mümkündür. Yerleri bu şekilde alırsın bebeğim!

9. Adım: Kodu Anlayın

Kodu Anlayın
Kodu Anlayın

Bir resim bin kelimeye bedeldir, bu nedenle diyagram, kodda gerçekleştirilen verileri ve işlemleri gösterir. Soldan sağa:

  • Grafik verileri bir noktalar listesi olarak PROGMEM'de (yani flash bellekte) saklanır.
  • Çevirme, ölçekleme ve döndürme işlemlerinin herhangi bir kombinasyonu, bir afin dönüşüm matrisinde birleştirilir. Bu, her animasyon karesinin başında bir kez yapılır.
  • Noktalar grafik verilerinden birer birer okunur ve her biri depolanan dönüşüm matrisi ile çarpılır.
  • Dönüştürülen noktalar, görünür alanın dışındaki herhangi bir noktayı kırpan bir makaslama algoritmasıyla beslenir.
  • Bir RC gecikme arama tablosu kullanılarak noktalar, sürüş gerilimlerine ve zaman gecikmelerine dönüştürülür. RC gecikme arama tablosu EEPROM'da saklanır ve kodun birden çok çalışması için yeniden kullanılabilir. Başlangıçta, RC arama tablosunun doğruluğu kontrol edilir ve yanlış değerler güncellenir. EEPROM kullanımı, değerli RAM belleğinden tasarruf sağlar.
  • Sürüş gerilimleri ve gecikmeler, çerçeve tamponundaki etkin olmayan çerçeveye yazılır. Çerçeve arabelleği, etkin bir çerçeve ve etkin olmayan bir çerçeve için alan içerir. Tam bir çerçeve yazıldığında, etkin olmayan çerçeve aktif hale getirilir.
  • Bir kesinti servis rutini, aktif çerçeve tamponundan voltaj değerlerini ve gecikmeleri okuyarak resmi sürekli olarak yeniden çizer. Bu değerlere göre çıkış pinlerinin görev çevrimlerini ayarlar. Zamanlayıcı 1, birkaç nanosaniye hassasiyete kadar zaman gecikmesini ölçmek için kullanılırken, zamanlayıcı 2, pimlerin görev döngüsünü kontrol etmek için kullanılır.
  • Voltajdaki en büyük değişime sahip pin, her zaman sıfır veya %100 görev döngüsüyle "turbo şarjlıdır" ve en hızlı şarj veya deşarj süresini sağlar. Voltajda daha az değişiklik olan pim, ilk pimin geçiş süresine uyacak şekilde seçilen bir görev döngüsü ile sürülür - bu sefer eşleştirme, çizgilerin osiloskopta düz çizilmesini sağlamak için önemlidir.

Adım 10: Büyük Hızla Büyük Sorumluluk Gelir

Bu yöntem PWM'den çok daha hızlı olduğu için neden analogWrite() onu kullanmıyor? Eh, çünkü sadece PWM kullanmak çoğu program için yeterince iyidir ve çok daha bağışlayıcıdır. Ancak "Turbo Şarj Cihazı" yöntemi dikkatli kodlama gerektirir ve yalnızca belirli durumlar için uygundur:

  1. Zamanlamaya son derece duyarlıdır. Hedef voltaj seviyesine ulaştığımızda, hedef voltajın aşılmasını önlemek için tahrik pimi derhal normal PWM moduna geçirilmelidir.
  2. RC sabiti bilgisi gerektirir, bu nedenle bu değerler önceden girilmelidir. Yanlış değerlerle zamanlama yanlış olur ve voltajlar yanlış olur. Normal PWM ile, RC sabiti bilinmese bile bir süre sonra doğru voltaja oturacağınızın garantisi vardır.
  3. Kondansatörü şarj etmek için kesin zaman aralığını hesaplamak, Arduino'da gerçek zamanlı hesaplama için çok yavaş olan logaritmik denklemler gerektirir. Bunlar, her animasyon karesinden önce önceden hesaplanmalı ve bellekte bir yerde önbelleğe alınmalıdır.
  4. Bu yöntemle ilgilenen programlar, gecikmelerin çok doğrusal olmadığı (aslında üsteldirler) gerçeğiyle mücadele etmelidir. Vcc veya GND yakınındaki hedef voltajlara ulaşmak, orta noktaya yakın voltajlardan çok daha uzun süre alacaktır.

Bu sınırlamaların üstesinden gelmek için vektör grafik kodum aşağıdakileri yapar:

  1. Kesin çıkış manipülasyonu ve zamanlaması için 16kHz'de Zamanlayıcı 1 ve bir kesme servis rutini kullanır.
  2. Kondansatör ve direnç değerlerinin seçimlerini sınırlayan, kullanılacak belirli bir RC zaman sabiti değeri gerektirir.
  3. Bir animasyon karesindeki tüm noktalar için zaman gecikmelerini bir bellek arabelleğinde saklar. Bu, zaman gecikmelerini hesaplayan rutinin, çıkış pinlerini güncelleyen kesme hizmeti rutininden çok daha yavaş bir hızda çalıştığı anlamına gelir. Herhangi bir çerçeve, bir sonraki çerçeve için yeni bir gecikme seti kullanılmaya hazır olmadan önce birkaç düzine kez boyanabilir.
  4. Bir bellek arabelleğinin kullanılması, çerçeve başına çizilebilecek nokta sayısına bir kısıtlama getirir. Kullanılabilir RAM'den en iyi şekilde yararlanmak için alan açısından verimli bir kodlama kullanıyorum, ancak yine de yaklaşık 150 puanla sınırlı. Yüz kadar noktanın ötesinde, ekran yine de titremeye başlayacaktı, bu yüzden bu bir tartışma noktası!

Önerilen: