Mündəricat:

Arduinodan Super Sürətli Analog Gərginliklər: 10 Adım (Şəkillərlə birlikdə)
Arduinodan Super Sürətli Analog Gərginliklər: 10 Adım (Şəkillərlə birlikdə)

Video: Arduinodan Super Sürətli Analog Gərginliklər: 10 Adım (Şəkillərlə birlikdə)

Video: Arduinodan Super Sürətli Analog Gərginliklər: 10 Adım (Şəkillərlə birlikdə)
Video: Lesson 15: Using Soil Moisture Sensor with Arduino SunFounder Kit | Robojax 2024, Iyul
Anonim
Image
Image

Bu Təlimat, bir Arduinodan və sadə bir rezistor və kondansatör cütündən super sürətli analog gərginlik dəyişikliyi necə yaradılacağını göstərir. Bunun faydalı olduğu bir tətbiq osiloskopda qrafika yaratmaqdır. Bunu edən bir neçə başqa layihə var. Johngineer, nəbz genişliyi modulyasiyasından (PWM) istifadə edərək sadə bir Milad ağacı göstərir. Digərləri bir rezistor nərdivanı və ya xüsusi bir rəqəmsaldan analoqa çevirici çip istifadə edərək bu layihəni inkişaf etdirdilər.

PWM-dən istifadə çoxlu titrəyişlərə səbəb olur, bir rezistor nərdivanı və ya rəqəmsal-analoq çeviricidən istifadə etməklə əldə edilə bilməyən daha çox çıxış pinləri və komponentləri tələb olunur. İstifadə etdiyim sxem, Milad ağacı demosunda istifadə edilən eyni ölü sadə rezistor və kondansatör cütüdür, lakin daha az titrəmə ilə işləyir.

Birincisi, dövrənin qurulması prosesində sizə yol göstərəcəyəm. Sonra sizə öz şəklinizi necə əlavə etməyi öyrədəcəyəm. Nəhayət, nəzəriyyəni daha sürətli edən şey haqqında məlumat verəcəyəm.

Bu Təlimatı bəyənmisinizsə, zəhmət olmasa ona səs verməyi düşünün!:)

Addım 1: Dövrün qurulması

Dövrə qurulması
Dövrə qurulması

Bir dövrə qurmaq üçün aşağıdakılara ehtiyacınız olacaq:

a) Armelino Uno və ya Arduino Nano kimi Atmel 16MHz ATmega328P əsasında bir Arduino.

b) R dəyəri ən azı 150Ω olan iki rezistor.

c) C dəyərində olan iki kondansatör C = 0.0015 / R, nümunələr:

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

Bu dəyərlərin seçilməsinin səbəbləri iki qatdır. İlk növbədə, Arduino pinlərindəki cərəyanı maksimum 40mA nominal cərəyanın altında saxlamaq istəyirik. 150Ω dəyərinin istifadəsi, 5V Arduino təchizatı gərginliyi ilə istifadə edildikdə cərəyanı 30mA ilə məhdudlaşdırır. Daha böyük R dəyərləri cərəyanı azaldacaq və buna görə də məqbuldur.

İkinci məhdudiyyət, R və C məhsulu olan vaxtı təxminən 1,5 ms -ə bərabər saxlamaq istəyirik. Proqram xüsusi olaraq bu zaman sabit üçün tənzimlənmişdir. Proqramda R və C dəyərlərini tənzimləmək mümkün olsa da, onun işləyəcəyi dar bir sıra var, buna görə də təklif olunan nisbətə mümkün qədər yaxın olan komponentləri seçin.

Nümunə sxemini necə yığacağınızı sizə göstərdikdən sonra, RC sabitinin niyə vacib olduğuna dair daha ətraflı izah nəzəriyyə bölməsində veriləcəkdir.

Addım 2: Osiloskopun qurulması

Osiloskopun qurulması
Osiloskopun qurulması

Nümayiş X/Y rejiminə qoyulmuş bir osiloskop tələb edir. Test aparatlarının sxemlərdə göstərildiyi kimi bağlanması lazımdır. Osiloskopunuz mənimkindən fərqli olacaq, ancaq vahidimdə X/Y rejimini qurmaq üçün lazım olan addımları atacağam:

a) Kanal B (X oxu) tərəfindən idarə olunacaq üfüqi süpürgəni təyin edin.

b) Osiloskopu ikili kanal rejiminə qoyun.

c) Hər iki kanalda 0V -dan 5V -a qədər gərginliyi göstərə biləcək şəkildə volt/div qurun. Minanı 0,5V/div olaraq təyin etdim.

d) Hər iki kanalda birləşdirmə rejimini DC olaraq təyin edin.

e) Arduino söndürüldükdə nöqtə ekranın sol aşağı küncündə olacaq şəkildə X və Y mövqeyini tənzimləyin.

Addım 3: Proqramı yükləyin və işə salın

Image
Image

Proqramı Arduino üçün Fast Vector Display -dən yükləyin. Proqram, GNU Affero Public License v3 altında lisenziyalaşdırılıb və bu lisenziyanın şərtlərinə uyğun olaraq sərbəst istifadə oluna və dəyişdirilə bilər.

Arduino IDE-də "fast-vector-display-arduino.ino" faylını açın və Arduino-ya yükləyin. Bir anda osiloskop ekranınızda "Yeni iliniz mübarək" animasiyasını görəcəksiniz.

Bu layihəni Miladdan əvvəlki həftələrdə şəxsi bir hackaton olaraq inkişaf etdirdim, buna görə koddakı PATTERN dəyişənini dəyişdirərək görə biləcəyiniz bir Milad və Yeni il mövzulu bir mesaj var.

Addım 4: Öz Xüsusi Rəsminizi yaradın

PWM -in Niyə Yavaş olduğunu Anlayın
PWM -in Niyə Yavaş olduğunu Anlayın

Öz rəsminizi yaratmaq istəyirsinizsə, USER_PATTERN -i təyin edən xəttdəki nöqtə koordinatlarını Arduino eskizinə yapışdıra bilərsiniz.

Inkscape -in xüsusi bir rəsm çəkmək üçün olduqca yaxşı bir vasitə olduğunu gördüm:

  1. Impact kimi böyük, qalın şriftdən istifadə edərək mətn yaradın.
  2. Mətn obyektini seçin və "Yol" menyusundan "Obyektdən Yola" seçin.
  3. Bağlı bir forma yaratmaq üçün fərdi hərfləri seçin və üst -üstə salın
  4. Onları tək bir əyriyə birləşdirmək üçün "Yol" menyusundan "Birlik" seçin.
  5. Hərflərdə deşiklər varsa, düzbucaqlı alətlə düzbucaqlı çəkərək kiçik bir çentik kəsin və "Fərq" alətindən istifadə edərək konturdan çıxarın.
  6. Düyünləri göstərmək üçün yolu iki dəfə vurun.
  7. Düzbucaqlı olaraq bütün qovşaqları seçin və "Seçilmiş qovşaqların küncünü düzəlt" alətini vurun.
  8. SVG faylını qeyd edin.

Əsas odur ki, rəsminizdə tək bir qapalı yol və deşik olmamalıdır. Dizaynınızın təxminən 130 baldan az olduğuna əmin olun.

Addım 5: SVG Faylından Koordinatları Arduino IDE -yə yapışdırın

  1. SVG faylını açın və koordinatları kopyalayın. Bunlar "yol" elementinə daxil ediləcək. İlk cüt koordinatları göz ardı etmək olar; onları 0, 0 ilə əvəz edin.
  2. Koordinatları "#Define USER_PATTERN" dən dərhal sonra mötərizənin içərisindəki Arduino eskizinə yapışdırın.
  3. Bütün boşluqları vergüllə əvəz edin, əks halda kompilyasiya xətası alacaqsınız. "Əvəz et və tap" vasitəsi faydalı ola bilər.
  4. Tərtib et və qaç!
  5. Problemləriniz varsa, hər hansı bir səhv üçün serial konsoluna baxın. Xüsusilə, modelinizin daxili tampon üçün çox çox nöqtəsi varsa mesajlar görəcəksiniz. Belə hallarda görüntü həddindən artıq titrəyiş göstərəcək.

Addım 6: PWM -in Niyə Yavaş olduğunu Anlayın

Başlamaq üçün bir kondansatörün doldurulduğu zaman davranışını nəzərdən keçirək.

Vcc bir gərginlik qaynağına bağlı olan bir kondansatör, eksponensial bir əyriyə görə gərginliyini artıracaq. Bu əyri asimptotikdir, yəni hədəf gərginliyinə yaxınlaşdıqca yavaşlayacaq. Bütün praktik məqsədlər üçün, gərginlik 5 RC saniyədən sonra "kifayət qədər yaxındır". RC "vaxt sabit" adlanır. Daha əvvəl gördüyümüz kimi, dövrənizdəki müqavimət və kondansatör dəyərlərinin məhsuludur. Məsələ burasındadır ki, 5 RC hər bir nöqtəni qrafik ekranında yeniləmək üçün kifayət qədər uzun müddətdir. Bu çox titrəməyə səbəb olur!

Bir kondansatörü doldurmaq üçün nəbz genişliyi modulyasiyasından (PWM) istifadə etdiyimiz zaman vəziyyətimiz yaxşı deyil. PWM ilə gərginlik 0V ilə 5V arasında sürətlə dəyişir. Təcrübədə bu, yükü kondansatöre itələməklə bir az geri çəkmək arasında sürətlə alternativ olduğumuz deməkdir - bu itələmə və çəkmə daha çox irəliyə doğru böyük bir addım ataraq sonra bir az geriyə addım ataraq marafona qaçmağa bənzəyir. təkrar -təkrar.

Hər şeyi ortalamaqla, PWM istifadə edərək bir kondansatör doldurma davranışı, kondansatörü doldurmaq üçün sabit bir Vpwm gərginliyi istifadə etmisiniz. İstədiyimiz gərginliyə "kifayət qədər yaxın" olmağımız hələ 5 RC saniyə çəkir.

Addım 7: A -dan B -yə, Tad Bit Faster

A -dan B -yə, daha sürətli bir şəkildə alın
A -dan B -yə, daha sürətli bir şəkildə alın

Tutaq ki, artıq Va -a qədər yüklənmiş bir kondansatörümüz var. Tutaq ki, b -nin yeni dəyərini yazmaq üçün analogWrite () istifadə edirik. Vb gərginliyinin əldə olunmasını gözləmək üçün minimum vaxt nə qədərdir?

5 RC saniyəsini təxmin edirsinizsə, bu əladır! 5 RC saniyə gözləyərək, kondansatör təxminən Vb -ə qədər yüklənəcək. Ancaq istəsək, əslində bir az da gözləyə bilərik.

Yük əyrisinə baxın. Gördüyünüz kimi, başladıqda kondansatör artıq Va -da idi. Bu o deməkdir ki, t_a vaxtını gözləmək məcburiyyətində deyilik. Kondansatörü sıfırdan doldurduqda bunu etməliyik.

Yəni o vaxtı gözləməyərək bir yaxşılaşma görürük. T_ab vaxtı əslində 5 RC -dən bir qədər qısadır.

Ancaq gözləyin, biz daha yaxşı işlər görə bilərik! V_b üzərindəki bütün boşluğa baxın. Əlimizdə olan maksimum gərginlik olan Vcc ilə çatmaq niyyətində olduğumuz Vb arasındakı fərq budur. Əlavə gərginliyin istədiyimiz yerə daha sürətli getməyimizə necə kömək edə biləcəyini görürsünüzmü?

Adım 8: Turbo Şarj Cihazı ilə A -dan B -yə keçin

Turbo Şarj Cihazı ilə B -dən B -ə keçin!
Turbo Şarj Cihazı ilə B -dən B -ə keçin!

Düzdür. PWM -ni hədəf V_b gərginliyində istifadə etmək əvəzinə, çox daha qısa müddətdə sabit bir Vcc -də saxlayırıq. Buna Turbo Şarj Aləti üsulu deyirəm və bizi həqiqətən getmək istədiyimiz yerə aparır, həqiqətən də sürətli! Vaxt gecikməsindən sonra (hesablamalıyıq) V_b -də PWM -ə keçərək əyləcləri vururuq. Bu, gərginliyi hədəfi aşmaqdan qoruyur.

Bu üsulla, kondansatördəki gərginliyi yalnız PWM istifadə etməkdən daha qısa müddətdə V_a -dan V_b -ə dəyişdirmək mümkündür. Yerləri belə əldə edirsən, balam!

Addım 9: Kodu anlayın

Kodu anlayın
Kodu anlayın

Bir şəkil min sözə dəyər, buna görə də diaqram kodda yerinə yetirilən məlumatları və əməliyyatları göstərir. Soldan sağa:

  • Qrafik məlumatları PROGMEM -də (yəni flash yaddaşda) nöqtələrin siyahısı kimi saxlanılır.
  • Tərcümə, miqyaslama və fırlanma əməliyyatlarının hər hansı bir birləşməsi bir affine çevrilmə matrisində birləşdirilir. Bu hər animasiya çərçivəsinin əvvəlində bir dəfə edilir.
  • Xallar qrafik məlumatlarından bir-bir oxunur və hər biri saxlanılan çevrilmə matrisi ilə vurulur.
  • Çevrilmiş nöqtələr, görünən ərazidən kənarda olan hər hansı bir nöqtəni kəsən bir qayçı alqoritmi ilə qidalanır.
  • RC gecikmə axtarış cədvəlindən istifadə edərək, nöqtələr sürücülük gərginliyinə və vaxt gecikməsinə çevrilir. RC gecikmə axtarış cədvəli EEPROM-da saxlanılır və kodun birdən çox işləməsi üçün yenidən istifadə edilə bilər. Başlanğıcda, RC axtarış cədvəlinin düzgünlüyü yoxlanılır və səhv dəyərlər yenilənir. EEPROM -un istifadəsi qiymətli RAM yaddaşına qənaət edir.
  • Sürücü gərginliyi və gecikmələri çərçivə tamponunda hərəkətsiz çərçivəyə yazılır. Çərçivə tamponunda aktiv bir çərçivə və hərəkətsiz bir çərçivə üçün yer var. Tam bir çərçivə yazıldıqda, hərəkətsiz çərçivə aktivləşdirilir.
  • Bir fasilə xidmət qaydası, gərginlik dəyərlərini və aktiv çərçivə tamponundan gecikmələri oxuyaraq şəkli yenidən çəkir. Bu dəyərlərə əsaslanaraq çıxış pinlərinin iş dövrlərini tənzimləyir. Zamanlayıcı 1, bir neçə nanosaniyə qədər gecikməni ölçmək üçün istifadə olunur, taymer 2 sancaqların iş dövrünü idarə etmək üçün istifadə olunur.
  • Gərginliyin ən böyük dəyişikliyinə malik olan pin, ən sürətli doldurma və ya boşalma müddətini təmin edən sıfır və ya 100%-lik bir iş dövrü ilə həmişə "turbo yüklənmiş" olur. Gərginlikdə daha az dəyişikliyə malik olan pin, ilk pinin keçid vaxtına uyğun olaraq seçilmiş bir iş dövrü ilə idarə olunur-bu dəfə uyğunluq xətlərin düz osiloskopda çəkilməsini təmin etmək üçün vacibdir.

Addım 10: Böyük Sürətlə, Böyük Məsuliyyət Gəlir

Bu üsul PWM -dən daha sürətli olduğuna görə niyə analogWrite () istifadə etmir? Yaxşı, çünki yalnız PWM istifadə etmək əksər proqramlar üçün kifayət qədər yaxşıdır və daha bağışlayandır. "Turbo Şarj Cihazı" metodu, lakin diqqətli kodlaşdırma tələb edir və yalnız xüsusi hallar üçün uyğundur:

  1. Zamanlamaya son dərəcə həssasdır. Hədəf gərginliyi səviyyəsinə çatdıqda, hədəf gərginliyinin aşılmaması üçün sürücünün pimi dərhal normal PWM rejiminə keçirilməlidir.
  2. RC sabitini bilmək tələb olunur, buna görə də bu dəyərlər əvvəlcədən daxil edilməlidir. Yanlış dəyərlərlə, zamanlama səhv olacaq və gərginliklər yanlış olacaq. Daimi PWM ilə, RC sabitliyi bilinməsə də, bir müddət sonra düzgün gərginliyə yerləşəcəyinizə zəmanət verilir.
  3. Kondansatörün doldurulması üçün dəqiq vaxt aralığının hesablanması, Arduino-da real vaxt hesablaması üçün çox yavaş olan logaritmik tənliklər tələb edir. Bunlar hər animasiya çərçivəsindən əvvəl əvvəlcədən hesablanmalı və bir yerdə yaddaşda saxlanılmalıdır.
  4. Bu metodla məşğul olan proqramlar, gecikmələrin çox qeyri-xətti olması (əslində, eksponentdir) ilə mübarizə aparmalıdır. Vcc və ya GND yaxınlığındakı hədəf gərginlikləri, orta nöqtəyə yaxın olan gərginliklərə nisbətən bir çox böyüklükdə sifarişlərə çatmaq üçün daha çox vaxt aparacaq.

Bu məhdudiyyətləri aradan qaldırmaq üçün vektor qrafik kodum aşağıdakıları edir:

  1. 16kHz -də Timer 1 -dən və dəqiq çıxış manipulyasiyası və vaxtı təyin etmək üçün fasilə xidmət qaydasından istifadə edir.
  2. Kondansatör və müqavimət dəyərlərinin seçimini məhdudlaşdıran xüsusi bir RC vaxt sabitinin istifadə edilməsini tələb edir.
  3. Yaddaş tamponunda bir animasiya çərçivəsindəki bütün nöqtələr üçün gecikmələri saxlayır. Bu, gecikmələri hesablayan rutin, çıxış pinlərini yeniləyən fasilə xidmətindən daha yavaş bir sürətlə işlədiyi deməkdir. Növbəti çərçivə üçün yeni gecikmələr dəsti istifadəyə hazır olmadan hər hansı bir çərçivə bir neçə dəfə rənglənə bilər.
  4. Yaddaş tamponunun istifadəsi hər bir çərçivə üçün çəkilə bilən nöqtələrin sayına məhdudiyyət qoyur. Mövcud RAM -dan ən yaxşı şəkildə istifadə etmək üçün məkanda səmərəli kodlaşdırma tətbiq edirəm, amma hələ də təxminən 150 bal ilə məhdudlaşır. Yüz və ya daha çox nöqtənin ötəsində, ekran hər halda titrəməyə başlayacaq, buna görə də mübahisə nöqtəsidir!

Tövsiyə: