Mündəricat:

Arduino Dalğa Formatı Generatoru: 5 addım (şəkillərlə birlikdə)
Arduino Dalğa Formatı Generatoru: 5 addım (şəkillərlə birlikdə)

Video: Arduino Dalğa Formatı Generatoru: 5 addım (şəkillərlə birlikdə)

Video: Arduino Dalğa Formatı Generatoru: 5 addım (şəkillərlə birlikdə)
Video: Arduino Ders 12.1 PWM.h kütüphanesi ile Değişken Frekanslı Kare Dalga Üretmek 2024, Noyabr
Anonim
Arduino Dalğa Formatı Generatoru
Arduino Dalğa Formatı Generatoru

Fevral 2021 yeniləməsi: Raspberry Pi Pico əsasında 300x nümunə alma dərəcəsi ilə yeni versiyaya baxın

Laboratoriyada tez -tez müəyyən bir tezlik, forma və amplitüdün təkrarlanan bir siqnalına ehtiyac duyulur. Gücləndiricini yoxlamaq, bir dövrə, bir komponent və ya bir aktuatoru yoxlamaq ola bilər. Güclü dalğa formalı generatorlar kommersiya olaraq mövcuddur, ancaq Arduino Uno və ya Arduino Nano ilə özünüz üçün faydalı bir istehsal etmək nisbətən asandır, məsələn:

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

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

Aşağıdakı xüsusiyyətlərə sahib başqa birinin təsviri budur:

* Düzgün dalğa formaları: R2R DAC istifadə edərək 8 bitlik çıxış, 256 nümunə forması

* Sürətli: 381 kHz nümunə götürmə sürəti

* Dəqiq: 1mHz addım tezlik aralığı. Arduino kristal qədər dəqiq.

* Asan əməliyyat: dalğa forması və tezliyi tək fırlanan kodlayıcı ilə tənzimlənir

* Geniş genlik diapazonu: 20V -a qədər millivolt

* 20 əvvəlcədən təyin edilmiş dalğa forması. Daha çox əlavə etmək sadədir.

* Hazırlanması asandır: Arduino Uno və ya Nano plus standart komponentlər

Addım 1: Texniki mülahizələr

Bir analoq siqnalın hazırlanması

Arduino Uno və Nanonun bir çatışmazlığı, rəqəmsal-analoq (DAC) çeviricisinin olmamasıdır, buna görə də birbaşa pinlərdə analoq gərginlik çıxarmasını təmin etmək mümkün deyil. Bir həll R2R nərdivanıdır: 256 çıxış səviyyəsinə çatmaq üçün 8 rəqəmsal pin bir rezistor şəbəkəsinə qoşulur. Arduino, birbaşa liman girişi ilə eyni anda bir əmrlə 8 pin təyin edə bilər. Rezistor şəbəkəsi üçün R dəyəri olan 9 və 2R dəyəri olan 8 rezistora ehtiyac var. R üçün bir dəyər olaraq 10kOhm istifadə etdim, bu da cərəyanı sancaqlardan 0,5mA və ya daha az saxlayır. Düşünürəm ki, R = 1kOhm da işləyə bilər, çünki Arduino pin başına 5mA, liman başına 40mA çatdıra bilər. R və 2R rezistorları arasındakı nisbətin həqiqətən 2 olması vacibdir. Bu, ən çoxu 25 müqavimət olmaqla, R dəyərli 2 rezistoru ardıcıl olaraq qoymaqla əldə edilir.

Faza akkumulyatoru

Dalğa forması yaratmaq, Arduino sancaqlarına 8 bitlik bir sıra ardıcıllıqla göndərməklə nəticələnir. Dalğa forması 256 baytlıq bir massivdə saxlanılır və bu sıra nümunələnir və pinlərə göndərilir. Çıxış siqnalının tezliyi birinin massivdə nə qədər sürətlə irəlilədiyi ilə müəyyən edilir. Bunun üçün möhkəm, dəqiq və zərif bir yol bir faz akkumulyatoru ilədir: 32 bitlik bir rəqəm müntəzəm olaraq artır və biz serialın indeksi olaraq ən əhəmiyyətli 8 bitdən istifadə edirik.

Sürətli nümunə götürmə

Fasilələr yaxşı müəyyən edilmiş vaxtlarda nümunə götürməyə imkan verir, lakin fasilələrin ümumi dəyəri ~ 100kHz-ə qədər seçmə tezliyini məhdudlaşdırır. Mərhələni yeniləmək, dalğa formasını nümunə götürmək və sancaqlar qurmaq üçün sonsuz bir döngə 42 saat dövrə çəkir və beləliklə 16MHz/42 = 381kHz bir nümunə götürmə sürətinə çatır. Döner enkoderi döndərmək və ya itələmək, bir pin dəyişikliyinə və döngədən çıxan bir kəsilməyə səbəb olur (dalğa forması və ya tezlik). Bu mərhələdə, serialdakı 256 ədəd yenidən hesablanır, belə ki, əsas döngədə dalğa formasının faktiki hesablamalarının aparılmasına ehtiyac yoxdur. Yarana bilən mütləq maksimum tezlik 190 kHz -dir (nümunə götürmə sürətinin yarısı), lakin sonra hər dövrdə yalnız iki nümunə var, buna görə də forma çox nəzarət olunmur. İnterfeys 100 kHz -dən yuxarı tezliyi təyin etməyə imkan vermir. 50kHz-də, hər dövrdə 7-8 nümunə var və 1.5 kHz-də və hər birinin altında saxlanılan 256 ədədin hər birində nümunə götürülür. Siqnalın hamar şəkildə dəyişdiyi dalğa formaları üçün, məsələn, sinus dalğası üçün nümunələri atlamaq heç bir problem yaratmır. Ancaq dar tırmanışlı dalğa formaları üçün, məsələn kiçik bir iş dövrü olan bir kvadrat dalğa üçün, 1,5 kHz -dən yuxarı tezliklərdə tək bir nümunənin olmaması dalğa formasının gözlənildiyi kimi davranmaması ilə nəticələnə bilər.

Tezliyin dəqiqliyi

Hər bir nümunədə fazanın artdığı sayı tezliklə mütənasibdir. Tezlik 381kHz/2^32 = 0.089mHz dəqiqliklə təyin edilə bilər. Praktikada belə dəqiqliyə ehtiyac yoxdur, buna görə də interfeysi tezliyi 1 mHz -lik addımlarla təyin etmək məhdudlaşdırır. Tezliyin mütləq dəqiqliyi Arduino saat tezliyinin dəqiqliyi ilə müəyyən edilir. Bu Arduino tipindən asılıdır, lakin əksəriyyəti 16.000MHz tezliyi təyin edir, buna görə ~ 10^-4 dəqiqlik. Kod, 16MHz fərziyyəsinin kiçik sapmalarını düzəltmək üçün tezlik və faza artım nisbətini dəyişdirməyə imkan verir.

Tamponlama və gücləndirmə

Rezistor şəbəkəsi yüksək bir çıxış empedansına malikdir, buna görə bir yük bağlandıqda çıxış gərginliyi tez azalır. Çıxışı buferləşdirmək və ya gücləndirməklə həll etmək olar. Burada tamponlama və gücləndirmə bir opamp ilə aparılır. LM358 -dən istifadə etdim, çünki bir azım var. Yavaş bir opampdır (mikrosaniyədə 0,5 V sürət), buna görə yüksək tezlikdə və yüksək amplituda siqnal təhrif olunur. Yaxşı bir şey, 0V -a çox yaxın olan gərginliyi idarə edə bilməsidir. Çıxış gərginliyi dəmiryolun altında ~ 2V ilə məhdudlaşır, buna görə də +5V gücünün istifadəsi çıxış gərginliyini 3V ilə məhdudlaşdırır. Addım-up modulları kompakt və ucuzdur. Opampa +20V verərək, 18V -ə qədər gərginlikli siqnallar yarada bilər. (NB, sxematik olaraq LTC3105 deyir, çünki bu Fritzing-də tapdığım yeganə addım idi. Əslində bir MT3608 modulu istifadə etdim, növbəti addımlardakı şəkillərə baxın). R2R DAC çıxışına dəyişən bir azalma tətbiq etməyi seçirəm, sonra siqnalın maksimum 20V çıxışı əldə edə bilməsi üçün opamplardan birini siqnalın gücləndirilmədən tamponlanması üçün, digərinin isə 5.7 ilə gücləndirilməsi üçün istifadə edirəm. Çıxış axını olduqca məhduddur, ~ 10mA, buna görə siqnal böyük bir dinamik və ya elektromaqnit idarə etmək üçün daha güclü bir gücləndiriciyə ehtiyac ola bilər.

Addım 2: Tələb olunan komponentlər

Əsas dalğa forması generatoru üçün

Arduino Uno və ya Nano

16x2 LCD ekran + 20kOhm kəsici və arxa işıq üçün 100Ohm seriyalı rezistor

5 pinli fırlanan kodlayıcı (birləşdirilmiş düymə ilə)

10 kOhm 25 rezistor

Tampon/gücləndirici üçün

LM358 və ya digər ikili opamp

MT3608-ə əsaslanan gücləndirici modul

50kOhm dəyişən müqavimət

10 kOhm müqavimət

47kOhm müqavimət

1 muF kondansatör

Addım 3: Tikinti

Tikinti
Tikinti
Tikinti
Tikinti

Şəkildə göstərildiyi kimi hər şeyi 7x9 sm ölçüdə prototip lövhəsinə lehimlədim. Bütün tellərlə bir az qarışıq olduğu üçün pozitiv gərginliyi qırmızı və qara olanları aparan ucları rəngləməyə çalışdım.

İstifadə etdiyim kodlayıcının bir tərəfində 3, digər tərəfində 2 pin var. 3 sancaqlı tərəf faktiki kodlayıcıdır, 2 pinli tərəf inteqrasiya edilmiş düymələrdir. 3 pinli tərəfdə, mərkəzi pin yerə, digər iki pin D10 və D11-ə bağlanmalıdır. 2 pinli tərəfdən, bir pin yerə, digəri isə D12-yə bağlanmalıdır.

Etdiyim ən çirkin şeydir, amma işləyir. Bir qəfəsə qoymaq yaxşı olardı, amma hələlik əlavə iş və xərc bunu doğrultmur. Nano və ekran pin başlıqları ilə bağlanır. Yenisini qursaydım, bir daha belə etməzdim. Siqnalları almaq üçün lövhəyə bağlayıcılar qoymadım. Bunun əvəzinə, bunları çıxarılan mis tel parçalarından timsah ucları ilə götürürəm, aşağıdakı kimi etiketlənir:

R - R2R DAC -dan xam siqnal

B - tamponlanmış siqnal

A - gücləndirilmiş siqnal

T - pin 9 -dan taymer siqnalı

G - torpaq

+ - artırıcı moduldan müsbət 'yüksək' gərginlik

Addım 4: Kod

Arduino eskizi olan kod əlavə olunur və Arduinoya yüklənməlidir.

20 dalğa forması əvvəlcədən təyin edilmişdir. Başqa bir dalğa əlavə etmək sadə olmalıdır. Qeyd edək ki, təsadüfi dalğalar 256 dəyərli bir sıra təsadüfi dəyərlərlə doldurur, lakin eyni model hər dövrdə təkrarlanır. Əsl təsadüfi siqnallar səs -küy kimi səslənir, amma bu dalğa forması daha çox fitə bənzəyir.

Kod, TIMER1 ilə D9 pinində 1kHz siqnal təyin edir. Bu analoq siqnalın vaxtını yoxlamaq üçün faydalıdır. Saat dövrlərinin sayının 42 olduğunu belə başa düşdüm: 41 və ya 43 qəbul etsəm və 1kHz siqnal yaratsam, D9 pinindəki siqnaldan fərqli bir tezliyə malikdir. 42 dəyəri ilə mükəmməl uyğun gəlir.

Normalda, Arduino millis () funksiyası ilə vaxtı izləmək üçün hər milisaniyəni kəsir. Bu, dəqiq siqnal istehsalını narahat edər, buna görə də xüsusi kəsmə deaktiv edilir.

Tərtibçi deyir: "Sketch 7254 bayt (23%) proqram saxlama sahəsindən istifadə edir. Maksimum 30720 baytdır. Qlobal dəyişənlər yerli dəyişənlər üçün 1565 bayt buraxaraq 483 bayt (23%) dinamik yaddaşdan istifadə edir. Maksimum 2048 baytdır." Beləliklə, daha mürəkkəb kodlar üçün geniş yer var. Nanoya uğurla yükləmək üçün "ATmega328P (köhnə yükləyici)" ni seçməli ola biləcəyinizə diqqət yetirin.

Addım 5: İstifadə

Siqnal generatoru sadəcə Arduino Nanonun mini-USB kabeli vasitəsilə işləyə bilər. Əlaqələndirilə bilən aparatla təsadüfən heç bir yer döngəsi olmaması üçün ən yaxşı şəkildə bir güc bankı ilə edilir.

Açıldıqda 100Hz sinus dalğası yaradacaq. Düyməni döndərərək digər 20 dalğa növündən birini seçə bilərsiniz. Basıldıqda fırlanaraq, kursor istənilən tezliyə uyğun olaraq təyin oluna bilər, sonra istədiyiniz dəyərə dəyişdirilə bilər.

Genlik potensiometrlə tənzimlənə bilər və ya tamponlu və ya gücləndirilmiş siqnal istifadə edilə bilər.

Xüsusilə siqnal başqa bir cihaza cərəyan verərkən, siqnal amplitüdünü yoxlamaq üçün bir osiloskopdan istifadə etmək həqiqətən faydalıdır. Çox cərəyan çəkilərsə, siqnal kəsiləcək və siqnal ciddi şəkildə pozulacaq

Çox aşağı tezliklərdə, çıxış 10kOhm rezistorlu bir LED ilə görüntülənə bilər. Səs tezlikləri dinamiklə eşidilə bilər. Siqnalın ~ 0,5V çox kiçik olduğundan əmin olun, əks halda cərəyan çox yüksək olur və siqnal kəsilməyə başlayır.

Tövsiyə: