İçindekiler:

Arduino Dalga Biçimi Oluşturucu: 5 Adım (Resimlerle)
Arduino Dalga Biçimi Oluşturucu: 5 Adım (Resimlerle)

Video: Arduino Dalga Biçimi Oluşturucu: 5 Adım (Resimlerle)

Video: Arduino Dalga Biçimi Oluşturucu: 5 Adım (Resimlerle)
Video: Üç tür fizik isteyen kız vardır✨ 2024, Kasım
Anonim
Arduino Dalga Biçimi Oluşturucu
Arduino Dalga Biçimi Oluşturucu

Şubat 2021 güncellemesi: Raspberry Pi Pico'ya dayalı 300x örnekleme hızına sahip yeni sürümü kontrol edin

Laboratuarda, genellikle belirli bir frekans, şekil ve genliğe sahip tekrarlayan bir sinyale ihtiyaç duyulur. Bir amplifikatörü test etmek, bir devreyi, bir bileşeni veya bir aktüatörü kontrol etmek olabilir. Güçlü dalga formu üreteçleri ticari olarak mevcuttur, ancak Arduino Uno veya Arduino Nano ile kendiniz kullanışlı bir tane yapmak nispeten kolaydır, örneğin bakınız:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Aşağıdaki özelliklere sahip başka birinin açıklaması:

* Doğru dalga biçimleri: R2R DAC kullanan 8 bit çıkış, 256 örnek şekli

* Hızlı: 381 kHz örnekleme hızı

* Kesin: 1mHz adımlarla frekans aralığı. Arduino kristali kadar hassas.

* Kolay kullanım: tek döner kodlayıcı ile ayarlanabilir dalga biçimi ve frekans

* Geniş genlik aralığı: milivolt ila 20V

* 20 önceden tanımlanmış dalga formu. Daha fazlasını eklemek için kolay.

* Yapımı kolay: Arduino Uno veya Nano artı standart bileşenler

Adım 1: Teknik Hususlar

Analog sinyal yapmak

Arduino Uno ve Nano'nun bir dezavantajı, dijitalden analoğa (DAC) dönüştürücünün olmamasıdır, bu nedenle doğrudan pinlere analog voltaj çıkışı yapmak mümkün değildir. Çözümlerden biri R2R merdivenidir: 256 seviye çıkışa ulaşılabilmesi için 8 dijital pin bir direnç ağına bağlanır. Doğrudan port erişimi sayesinde Arduino, tek bir komutla aynı anda 8 pin ayarlayabilir. Direnç ağı için R değerinde 9 direnç ve 2R değerinde 8 direnç gereklidir. R için bir değer olarak 10kOhm kullandım, bu pinlerden gelen akımı 0,5mA veya daha az tutar. Arduino pin başına 5mA, port başına 40mA kolayca teslim edebildiğinden, R=1kOhm da işe yarayabilir. R ve 2R dirençleri arasındaki oranın gerçekten 2 olması önemlidir. Bu, toplam 25 direnç için seri olarak 2 R değerinde direnç koyarak en kolay şekilde elde edilir.

Faz akümülatörü

Bir dalga formu oluşturmak, daha sonra Arduino pinlerine tekrar tekrar 8 bitlik bir sayı dizisi göndermek için aşağı iner. Dalga formu 256 baytlık bir dizide saklanır ve bu dizi örneklenir ve pinlere gönderilir. Çıkış sinyalinin frekansı, dizide ne kadar hızlı ilerlendiğine göre belirlenir. Bunu yapmanın sağlam, kesin ve zarif bir yolu bir faz akümülatörüdür: 32 bitlik bir sayı düzenli aralıklarla artırılır ve dizinin indeksi olarak en önemli 8 biti kullanırız.

Hızlı örnekleme

Kesintiler, iyi tanımlanmış zamanlarda örneklemeye izin verir, ancak kesintilerin ek yükü, örnekleme frekansını ~100kHz ile sınırlar. Fazı güncellemek, dalga biçimini örneklemek ve pinleri ayarlamak için sonsuz bir döngü 42 saat döngüsü alır, böylece 16MHz/42=381kHz örnekleme hızına ulaşır. Döner kodlayıcıyı döndürmek veya itmek, pin değişimine ve ayarı (dalga formu veya frekans) değiştirmek için döngüden çıkan bir kesintiye neden olur. Bu aşamada, dizideki 256 sayı, ana döngüde gerçek dalga biçimi hesaplamalarının yapılması gerekmeyecek şekilde yeniden hesaplanır. Üretilebilecek mutlak maksimum frekans 190kHz'dir (örnekleme hızının yarısı), ancak daha sonra periyot başına yalnızca iki örnek vardır, bu nedenle şekil üzerinde fazla kontrol yoktur. Arayüz bu nedenle frekansın 100kHz'in üzerine ayarlanmasına izin vermez. 50kHz'de, periyot başına 7-8 örnek vardır ve 1.5 kHz'de ve dizide saklanan tüm 256 sayının altında her periyotta örneklenir. Sinüs dalgası gibi sinyalin düzgün bir şekilde değiştiği dalga biçimleri için örneklerin atlanması sorun değildir. Ancak dar sivri uçlara sahip dalga biçimleri için, örneğin küçük bir görev döngüsüne sahip bir kare dalga için, 1,5 kHz'in üzerindeki frekanslar için tek bir numunenin eksik olması, dalga biçiminin beklendiği gibi davranmamasına neden olma tehlikesi vardır.

Frekansın doğruluğu

Her numunede fazın artırıldığı sayı, frekansla orantılıdır. Böylece frekans, 381kHz/2^32=0.089mHz'lik bir doğruluğa ayarlanabilir. Pratikte böyle bir doğruluğa neredeyse hiç ihtiyaç duyulmaz, bu nedenle arayüz, frekansı 1 mHz'lik adımlarla ayarlamak için sınırlar. Frekansın mutlak kesinliği, Arduino saat frekansının kesinliği ile belirlenir. Bu, Arduino türüne bağlıdır, ancak çoğu 16.000 MHz'lik bir frekans belirtir, bu nedenle ~10^-4'lük bir hassasiyet. Kod, 16MHz varsayımındaki küçük sapmaları düzeltmek için frekans oranını ve faz artışını değiştirmeye izin verir.

Tamponlama ve amplifikasyon

Direnç ağının yüksek bir çıkış empedansı vardır, bu nedenle bir yük takılırsa çıkış voltajı hızla düşer. Bu, çıktıyı tamponlayarak veya yükselterek çözülebilir. Burada tamponlama ve amplifikasyon bir opamp ile yapılır. LM358'i kullandım çünkü biraz vardı. Yavaş bir opamptır (mikrosaniye başına dönüş hızı 0,5V), bu nedenle yüksek frekans ve yüksek genlikte sinyal bozulur. İyi bir şey, 0V'a çok yakın voltajları kaldırabilmesidir. Ancak çıkış voltajı rayın altında ~2V ile sınırlıdır, bu nedenle +5V güç kullanılması çıkış voltajını 3V ile sınırlar. Yükseltme modülleri kompakt ve ucuzdur. Opampı +20V ile besleyerek 18V'a kadar gerilimli sinyaller üretebilir. (Not, şemada LTC3105 yazıyor çünkü Fritzing'de bulduğum tek yükseltme buydu. Gerçekte bir MT3608 modülü kullandım, sonraki adımlardaki resimlere bakın). R2R DAC'nin çıkışına değişken bir zayıflama uygulamayı seçiyorum, ardından sinyali amplifikasyon olmadan tamponlamak için opamplardan birini ve diğerini 5.7 ile yükseltmek için kullanıyorum, böylece sinyal yaklaşık 20V maksimum çıkışa ulaşabilir. Çıkış akımı oldukça sınırlıdır, ~10mA, bu nedenle sinyal büyük bir hoparlörü veya elektromıknatısı sürmek için daha güçlü bir amplifikatör gerekebilir.

2. Adım: Gerekli Bileşenler

Çekirdek dalga formu üreteci için

Arduino Uno veya Nano

16x2 LCD ekran + 20kOhm düzeltici ve arka ışık için 100Ohm serisi direnç

5 pinli döner kodlayıcı (entegre butonlu)

10kOhm'luk 25 direnç

Tampon/amplifikatör için

LM358 veya diğer çift opamp

MT3608'e dayalı yükseltme modülü

50kOhm değişken direnç

10kOhm direnç

47kOhm direnç

1muF kapasitör

Adım 3: İnşaat

Yapı
Yapı
Yapı
Yapı

Her şeyi resimde gösterildiği gibi 7x9cm prototip panosuna lehimledim. Tüm kablolar biraz dağınık olduğu için, pozitif voltaj taşıyan uçları kırmızı ve toprak taşıyanları siyah renklendirmeye çalıştım.

Kullandığım enkoderin bir tarafında 3, diğer tarafında 2 olmak üzere 5 pini var. 3 pinli taraf gerçek kodlayıcı, 2 pinli taraf ise entegre butondur. 3-pin tarafında, merkezi pin toprağa, diğer iki pin D10 ve D11'e bağlanmalıdır. 2 pinli tarafta bir pin toprağa, diğeri D12'ye bağlanmalıdır.

Şimdiye kadar yaptığım en çirkin şey ama işe yarıyor. Bir muhafazaya koymak güzel olurdu, ancak şimdilik fazladan iş ve maliyet bunu gerçekten haklı çıkarmaz. Nano ve ekran pin başlıklarıyla takılır. Yeni bir tane inşa etseydim, bunu tekrar yapmazdım. Sinyalleri almak için karta konektör koymadım. Bunun yerine, onları aşağıdaki gibi etiketlenmiş, çıkıntılı bakır tel parçalarından timsah uçları ile alıyorum:

R - R2R DAC'den gelen ham sinyal

B - arabelleğe alınmış sinyal

A - güçlendirilmiş sinyal

T - pin 9'dan zamanlayıcı sinyali

G - zemin

+ - yükseltme modülünden pozitif 'yüksek' voltaj

Adım 4: Kod

Bir Arduino taslağı olan kod eklenmiştir ve Arduino'ya yüklenmelidir.

20 dalga formu önceden tanımlanmıştır. Başka bir dalga eklemek basit olmalıdır. Rastgele dalgaların 256 değerli diziyi rastgele değerlerle doldurduğunu, ancak aynı modelin her periyotta tekrarlandığını unutmayın. Gerçek rastgele sinyaller gürültü gibi duyulur, ancak bu dalga biçimi daha çok bir ıslık gibi ses çıkarır.

Kod, TIMER1 ile D9 pininde 1kHz sinyali ayarlar. Bu, analog sinyalin zamanlamasını kontrol etmek için kullanışlıdır. Saat döngülerinin sayısının 42 olduğunu bu şekilde anladım: 41 veya 43 olduğunu varsayarsam ve 1 kHz sinyal üretirsem, açıkça D9 pimindeki sinyalden farklı bir frekansa sahiptir. 42 değeri ile mükemmel uyum sağlarlar.

Normalde Arduino, milis() işleviyle zamanı takip etmek için her milisaniyede bir kesinti yapar. Bu, doğru sinyal oluşumunu bozar, bu nedenle belirli kesme devre dışı bırakılır.

Derleyici şunları söylüyor: "Sketch, program depolama alanının 7254 baytını (%23) kullanır. Maksimum 30720 bayttır. Genel değişkenler 483 bayt (%23) dinamik bellek kullanır ve yerel değişkenler için 1565 bayt kalır. Maksimum 2048 bayttır." Bu nedenle, daha karmaşık kodlar için yeterli alan vardır. Nano'ya başarıyla yüklemek için "ATmega328P (eski önyükleyici)" seçeneğini seçmeniz gerekebileceğini unutmayın.

Adım 5: Kullanım

Sinyal üreteci, Arduino Nano'nun mini USB kablosuyla basitçe çalıştırılabilir. En iyi şekilde bir güç bankası ile yapılır, böylece bağlanabileceği aparatta tesadüfi bir toprak döngüsü olmaz.

Açıldığında 100Hz sinüs dalgası üretecektir. Düğmeyi çevirerek diğer 20 dalga türünden biri seçilebilir. İtilirken döndürülerek, imleç frekansın herhangi bir basamağına ayarlanabilir ve ardından istenen değere değiştirilebilir.

Genlik potansiyometre ile düzenlenebilir ve tamponlanmış veya güçlendirilmiş sinyal kullanılabilir.

Özellikle sinyal başka bir cihaza akım sağladığında, sinyal genliğini kontrol etmek için bir osiloskop kullanmak gerçekten yararlıdır. Çok fazla akım çekilirse, sinyal kesilecek ve sinyal büyük ölçüde bozulacaktır.

Çok düşük frekanslar için çıkış, 10kOhm'luk bir dirençli seri halinde bir LED ile görselleştirilebilir. Ses frekansları bir hoparlör ile duyulabilir. Sinyali çok küçük ~0.5V olarak ayarladığınızdan emin olun, aksi takdirde akım çok yükselir ve sinyal kesilmeye başlar.

Önerilen: