Mündəricat:
- Addım 1: İstifadə Davası: ADC Ölçmələrini Hamarlaşdırın
- Addım 2: İstifadə Davası: Mikrofon Siqnalının DC Komponentini Ölçmək
- Addım 3: Hesablama
- Addım 4: Kod
- Addım 5: Əlavələr
- Addım 6: Nəticə
Video: Mikrodenetleyici Layihələriniz üçün Orta Çalışma: 6 Addım
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:44
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
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
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
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
Ç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
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ə:
CP2 Excel Ağırlıqlı Orta: 14 Addım
CP2 Excel Ağırlıqlı Orta: Excel -də ağırlıqlı ortalamanın necə hesablanacağına dair təlimatlar. Bu nümunədə SUMPRODUCT və SUM funksiyası Excel -də istifadə olunacaq. Ağırlıqlı orta bir sinif üçün ümumi qiyməti hesablamaq üçün faydalıdır
Asan IOT - Orta Səviyyəli IOT Cihazları üçün Tətbiqlə İdarə olunan RF Sensor Hub: 4 Addım
Easy IOT - Orta Səviyyə IOT Cihazları üçün Tətbiqlə İdarə olunan RF Sensor Hubu: Bu dərsliklərdə, mərkəzi qovşaq cihazından bir radio bağlantısı ilə idarə edilə bilən bir cihaz şəbəkəsi quracağıq. WIFI və ya Bluetooth əvəzinə 433MHz serial radio bağlantısı istifadə etməyin faydası daha böyük diapazondur (yaxşı
Layihələriniz üçün Gökkuşağı LEDləri: 4 Adım (Şəkillərlə birlikdə)
Layihələriniz üçün Göy qurşağı LEDləri: Hər kəsə salam! Mən bu LED -ləri bir çox dekorativ layihələr üçün istifadə etmişəm və nəticə həmişə heyrətləndiricidir, buna görə də təcrübələrimi sizinlə bölüşmək istəyirəm ki, bir çox insanın RGB LED şerit idarəediciləri alaraq 3 və ya 5 kimi işlətdiyini gördüm. rəng dəyişdirmə rejimi yalnız
Breadboard / Arduino Layihələriniz üçün Gerilla Batareya Tutacağı: 3 addım
Breadboard / Arduino Layihələriniz üçün Gerilla Batareya Tutacağı: DS1307 və Arduino ilə təcrübə aparıram, CR1212 batareyasını bağlamaq üçün bir yol tapmalı oldum. Bağlayıcı qutusuna girib kömək edə biləcək bir şey tapmadım. Sonra, eur ê ka! Məndə bir işıq var idi
Layihələriniz üçün ** PULSUZ STUFF ** siyahısı: 8 addım
Layihələriniz üçün ** PULSUZ STUFF ** siyahısı: Bu, PULSUZ şeylər əldə edə biləcəyiniz, layihələrinizdə istifadə edə biləcəyiniz yerlərin siyahısıdır …. Pulsuzdur və əşyalar pulsuz göndərilir. siyahı! Tamam, buna görə məhsul növünə görə bu təlimatı təşkil etdim