Mündəricat:

Mikrodenetleyici Layihələriniz üçün Orta Çalışma: 6 Addım
Mikrodenetleyici Layihələriniz üçün Orta Çalışma: 6 Addım

Video: Mikrodenetleyici Layihələriniz üçün Orta Çalışma: 6 Addım

Video: Mikrodenetleyici Layihələriniz üçün Orta Çalışma: 6 Addım
Video: Вентилятор работает, но компрессор не работает в инверторном мини-сплит-системе переменного тока 2024, Noyabr
Anonim
Mikrokontrolör Layihələriniz üçün Çalışan Orta
Mikrokontrolör Layihələriniz üçün Çalışan Orta

Bu təlimatda, işləyən bir ortalamanın nə olduğunu və niyə buna əhəmiyyət verməli olduğunuzu izah edəcəyəm, eyni zamanda maksimum hesablama səmərəliliyi üçün necə tətbiq olunacağını göstərəcəyəm (mürəkkəblikdən narahat olmayın, başa düşmək çox sadədir və arduino layihələriniz üçün istifadəsi asan bir kitabxana təmin edin:)

Koşu ortalaması, ümumiyyətlə hərəkətli ortalama, hərəkətli orta və ya qaçış ortası olaraq da adlandırılır, məlumat seriyalarında son N dəyərlərinin orta dəyərini təsvir etmək üçün istifadə olunan bir termindir. Normal ortalama kimi hesablana bilər və ya kodunuzun performansına minimal təsir göstərməsi üçün bir hiylə istifadə edə bilərsiniz.

Addım 1: İstifadə Davası: ADC Ölçmələrini Hamarlaşdırın

İstifadə Davası: ADC Ölçmələrini Hamarlaşdırın
İstifadə Davası: ADC Ölçmələrini Hamarlaşdırın

Arduino, çox az səs -küyə malik layiqli 10 bit ADC -yə malikdir. Potensiometr, fotorezistor və ya digər yüksək səs -küy komponentləri kimi bir sensordakı dəyəri ölçərkən, ölçmənin düzgün olduğuna inanmaq çətindir.

Sensorunuzu hər dəfə oxumaq istədikdə birdən çox ölçmə aparmaq və onları ortalamaq bir həlldir. Bəzi hallarda bu, uyğun bir həlldir, lakin həmişə deyil. ADC -ni saniyədə 1000 dəfə oxumaq istəsəniz, orta hesabla 10 ölçü götürsəniz, 10 000 -ə bərabər olacaqsınız. Hesablama vaxtının böyük itkisi.

Təklif etdiyim həll saniyədə 1000 dəfə ölçmə aparmaq, hər dəfə işləyən ortalamanı yeniləmək və cari dəyər olaraq istifadə etməkdir. Bu üsul bir az gecikmə gətirir, ancaq tətbiqinizin hesablama mürəkkəbliyini azaldır və əlavə emal üçün daha çox vaxt verir.

Yuxarıdakı şəkildə son 32 ölçmənin işləyən ortalamasından istifadə etdim. Bu metodun 100% uğursuz olmadığını görürsünüz, ancaq dəqiqliyi əhəmiyyətli dərəcədə artırır (hər dəfə 32 nümunə götürməkdən daha pis deyil). Hər dəfə orta hesabla 32 ölçmə aparmaq istəsəniz, bu yalnız Arduino UNO -da 0.25 ms -dən çox olacaq!

Addım 2: İstifadə Davası: Mikrofon Siqnalının DC Komponentini Ölçmək

İstifadə Davası: Mikrofon Siqnalının DC Komponentini Ölçmək
İstifadə Davası: Mikrofon Siqnalının DC Komponentini Ölçmək
İstifadə Davası: Mikrofon Siqnalının DC Komponentini Ölçmək
İstifadə Davası: Mikrofon Siqnalının DC Komponentini Ölçmək
İstifadə Davası: Mikrofon Siqnalının DC Komponentini Ölçmək
İstifadə Davası: Mikrofon Siqnalının DC Komponentini Ölçmək

Arduino, 0 ilə Vcc arasındakı gərginliyi ölçə bilər (normal olaraq 5 V). Səs siqnalı tamamilə AC -dir və onu bir mikrokontrolördə ölçmək istəyirsinizsə, onu 1/2 Vcc ətrafında əymək məcburiyyətindəsiniz. Təxminən 2,5 V (DC) + səs siqnalı (AC) demək olacaq bir Arduino UNO layihəsində. 10 bit ADC və 5 V enerji təchizatı istifadə edərkən, 2,5 V əyilmə 512 ölçüsünə bərabər olmalıdır. Belə ki, AC siqnalının dəyərini əldə etmək üçün 512 ADC ölçüsündən çıxılmalıdır və elədirmi?

İdeal bir dünyada bu doğru olardı. Təəssüf ki, real həyat daha mürəkkəbdir və siqnal qərəzliyimiz sürüşməyə meyllidir. Elektrik şəbəkəsindən 50 Hz (ABŞ -da yaşayırsınızsa 60 Hz) səs çox yaygındır. Adətən hər şey o qədər də problemli deyil, amma var olduğunu bilmək yaxşıdır. Komponentlərin istiləşməsindən xətti sürüşmə daha problemlidir. Başlanğıcda DC ofset düzəlişini diqqətlə qurursunuz və tətbiqiniz işləyərkən yavaş -yavaş uzaqlaşır.

Bu problemi (musiqi) vurma detektoru ilə izah edəcəyəm. Yanlış aradan qaldırmanı qurursunuz və atışlarınız aydındır (şəkil 2). Bir müddət sonra, DC -nin qərəzli hərəkətləri və atışları mikrokontrolördə çətinliklə nəzərə çarpır (şəkil 3). Beat aşkarlama alqoritmi gələcəkdə bu məqalənin əhatə dairəsini aşdığı üçün dərindən araşdırılacaq.

Xoşbəxtlikdən, səsin DC ofsetini daim hesablamağa davam etməyin bir yolu var. Bu təlimatlı mövzunun işləyən ortalamanın bir həll təqdim etməsi təəccüblü olmayacaq.

Hər hansı bir AC siqnalının orta dəyərinin 0 olduğunu bilirik. Bu bilikdən istifadə edərək AC+DC siqnalının orta dəyərinin DC tərəfli olduğunu çıxara bilərik. Silmək üçün son bir neçə dəyərdən işləyən ortalamanı götürə bilərik və indiki ADC oxunuşundan çıxara bilərik. Qeyd edək ki, kifayət qədər uzun işləyən ortalamadan istifadə etməlisiniz. Səs üçün saniyənin onda biri (nümunələrin sayı nümunə sürətinizə bağlıdır) kifayət etməlidir, amma bilin ki, uzun ortalamalar daha yaxşı işləyir. İlk şəkildə, 1 kHz nümunə sürətində 64 elementlə işləyən ortalama DC həssas hesablama nümunəsini görə bilərsiniz (tövsiyə etdiyimdən azdır, amma hələ də işləyir).

Addım 3: Hesablama

Hesablama
Hesablama

Həkim gözləmə otağında olan insanların ortalama çəkisi kimi qaçmağı təxmin edə bilərsiniz. Həkim bir xəstəni müayinə edir və eyni zamanda yenisi gözləmə otağına girir.

Gözləmə otağında gözləyən bütün xəstələrin orta çəkisini öyrənmək üçün tibb bacısı hər bir xəstədən çəkisini soruşa bilər, bu rəqəmləri əlavə edə və xəstələrin sayına bölə bilər. Hər dəfə həkim yeni xəstəni qəbul etdikdə, tibb bacısı bütün prosesi təkrar edərdi.

Düşünə bilərsən: "Bu çox da təsirli görünmür … Bunu etmək üçün daha yaxşı bir yol olmalıdır." Və doğru olarsan.

Bu prosesi optimallaşdırmaq üçün tibb bacısı hazırkı xəstələr qrupunun ümumi çəkisini qeyd edə bilər. Həkim yeni xəstəni yanına çağırdıqda, tibb bacısı ondan çəkisini soruşur və qrupdan çıxardaraq onu buraxır. Tibb bacısı daha sonra gözləmə otağına girən xəstədən çəkisini soruşacaq və ümumi çəkiyə əlavə edəcək. Hər növbədən sonra xəstələrin orta çəkisi, çəkilərin cəmi xəstələrin sayına bölünərək alınacaq (bəli, əvvəlki kimi eynidir, amma indi tibb bacısı hamısı əvəzinə yalnız iki nəfərdən çəkisi haqqında soruşdu). Bu paraqrafın bir az qarışıq ola biləcəyini başa düşürəm, buna görə əlavə aydınlıq üçün yuxarıdakı təsvirə baxın (və ya şərhlərdə suallar verin).

Ancaq axırıncı paraqrafı çaşdırıcı hesab etməsəniz də, əvvəlcə akkumulyatorda nə olmalıdır kimi suallarınız ola bilər, oxuduqlarımı əsl C koduna necə qoyum? Növbəti addımda, mənbə kodumu da alacaqsınız.

Addım 4: Kod

Kod
Kod

Çalışan ortalamanı hesablamaq üçün əvvəlcə son N dəyərlərini saxlamaq üçün bir yol lazımdır. N elementli bir sıra ola bilər və hər dəfə bir element əlavə etdikdə bütün məzmunu bir yerə köçürə bilərsən (lütfən bunu etmə) və ya köhnə bir elementin üzərinə yaza və atılacaq növbəti elementə göstərici düzəldə bilərsən (lütfən bunu et):)

Akkumulyator sıfırlanmağa başlamalıdır, eyni zamanda gecikmə xəttindəki bütün elementlərə aiddir. Digər halda, qaçış ortalamanız həmişə səhv olacaq. Gecikmə xəttini işə salmaqla delayLine_initin məşğul olduğunu görəcəksiniz, akkumulyatorla özünüz məşğul olmalısınız.

gecikmə xəttinə bir element əlavə etmək, ən yeni elementin indeksinin 1 azaldılması qədər asandır və gecikmə xətti massivinin tərəfini göstərmir. 0 olduqda indeksi azaldandan sonra 255 -ə qədər dönəcək (çünki 8 bit işarəsiz tamsayıdır). Gecikmə xətti ölçüsü olan Modulo (%) operatoru, indeksin etibarlı bir elementə işarə etməsini təmin edəcək.

Bir əvvəlki addımdakı bənzətməyimə əməl etsəniz, işləyən bir ortalamanın hesablanması asan başa düşülməlidir. Akkumulyatordan ən qədim elementi çıxarın, akkumulyatora ən yeni dəyər əlavə edin, ən yeni dəyəri gecikmə xəttinə çəkin, akkumulyatoru elementlərin sayına bölün.

Asan, hə?

Bütün bunların necə işlədiyini daha yaxşı başa düşmək üçün zəhmət olmasa əlavə edilmiş kodu istifadə edərək sınaqdan keçirin. Hal -hazırda olduğu kimi, arduino, analog A0 pinində analoji dəyəri oxuyur və 115200 baud sürətində serial portda "[ADC dəyəri], [işləyən orta]" yazır. Arduinonun seriya planlayıcısını düzgün baud nisbətində açarsanız, iki sətir görəcəksiniz: ADC dəyəri (mavi) və hamarlanmış dəyər (qırmızı).

Addım 5: Əlavələr

Əlavələr
Əlavələr

Layihənizdə işləyən ortalamadan istifadə etmək üçün mütləq bilməyiniz lazım olmayan bir neçə şey var ki, bilmək zərər verməz.

gecikmə: Bu addımın təsviri haqqında danışmaqla başlayacağam. Daha çox elementin işlədilməsinin daha böyük bir gecikmə gətirdiyini görəcəksiniz. Dəyər dəyişdirmək üçün cavab vaxtınız kritikdirsə, daha qısa işləyən ortalamadan istifadə etmək və ya nümunə nisbətini artırmaq istəyə bilərsiniz (daha tez -tez ölçün).

Davam etmək.

başlatma: Akkumulyatorun və gecikmə elementlərinin işə salınması haqqında danışanda hamısını 0 -a başlamalı olduğunuzu dedim. Alternativ olaraq, gecikmə xəttini istədiyiniz hər şeyə başlaya bilərsiniz, ancaq akkumulyator gecikmə xəttindəki ən yeni N elementlərinin cəmi olaraq başlamalıdır (burada N işləyən ortalamanızdakı elementlərin sayıdır). Akkumulyator başqa bir dəyər kimi başlayarsa, hesablanmış orta səhv olar - çox aşağı və ya çox yüksək, həmişə eyni miqdarda (eyni ilkin şərtlər nəzərə alınmaqla). Bunun səbəbini öyrənmək üçün bəzi "qələm və kağız simulyasiyasından" istifadə etməyi təklif edirəm.

akkumulyator ölçüsü: Həm də qeyd etməliyik ki, akkumulyator bütün elementlərin cəmi müsbət və ya mənfi maksimum olduqda gecikmə xəttində saxlanacaq qədər böyük olmalıdır. Praktiki olaraq, gecikmə xətti elementləri imzalanarsa, akkumulyatorun gecikmə xətti elementlərindən daha böyük bir məlumat növü olması və imzalanması deməkdir.

oyun: Uzun gecikmə xətləri çoxlu yaddaş tutur. Bu, tez bir zamanda problemə çevrilə bilər. Yaddaşınız çox məhduddursa və dəqiqliyə o qədər də əhəmiyyət vermirsinizsə, gecikməni tamamilə ataraq bunun əvəzinə işləyən ortalamanı təxmini hesablaya bilərsiniz: akkumulyatordan 1/N * akkumulyatorunu çıxardın və yeni dəyər əlavə edin (məsələn, 8 uzun müddət işləyən orta: akkumulyator = akkumulyator * 7/8 + yeniDəyər). Bu üsul səhv nəticə verir, ancaq yaddaşınız azaldıqda işləyən ortalamanı hesablamaq üçün yaxşı bir üsuldur.

dilçilik: "işləyən orta/orta", "hərəkət edən orta/orta" ümumiyyətlə alqoritmin excel elektron cədvəli kimi statik məlumat dəsti üzərində işlədiyi deməkdir.

Addım 6: Nəticə

Ümid edirəm bu təlimatı başa düşmək üçün kifayət qədər asan idi və gələcək layihələrinizdə sizə kömək edəcək. Aydın olmayan bir şey varsa, aşağıdakı şərhlərdə suallarınızı yazmaqdan çekinmeyin.

Tövsiyə: