Mündəricat:

Yüksək Çözünürlük Tezlik Sayacı: 5 Adım (Şəkillərlə birlikdə)
Yüksək Çözünürlük Tezlik Sayacı: 5 Adım (Şəkillərlə birlikdə)

Video: Yüksək Çözünürlük Tezlik Sayacı: 5 Adım (Şəkillərlə birlikdə)

Video: Yüksək Çözünürlük Tezlik Sayacı: 5 Adım (Şəkillərlə birlikdə)
Video: Scentroid's CTAir Continuous Urban Air Quality Monitor Seminar A 12.08.2020 (Subtitled) 2024, Iyul
Anonim

Bu təlimat tezlikləri ağlabatan dəqiqliklə ölçə bilən qarşılıqlı bir tezlik sayğacını göstərir. Standart komponentlərdən hazırlanmışdır və bir həftə sonu edilə bilər (bir az daha uzun çəkdi:-))

EDIT: Kod artıq GitLab -da mövcuddur:

gitlab.com/WilkoL/high-resolution-frequency-counter

Addım 1: Köhnə Məktəb Tezliklərinin Sayılması

Köhnə Məktəb Tezliklərinin Sayılması
Köhnə Məktəb Tezliklərinin Sayılması
Köhnə Məktəb Tezliklərinin Sayılması
Köhnə Məktəb Tezliklərinin Sayılması

Siqnalın tezliyini ölçmək üçün köhnə məktəb yolu bir məntiq VƏ qapısı istifadə etmək, ölçüləcək siqnalı bir porta və digər porta tam 1 saniyə yüksək vaxtda ötürmək və çıxışı saymaqdır. Bu, bir neçə kHz -dən GHz -ə qədər olan siqnallar üçün olduqca yaxşı işləyir. Yaxşı bir qətnamə ilə aşağı tezlikli bir siqnal ölçmək istəyirsinizsə nə etməli? Şəbəkə tezliyini ölçmək istədiyinizi söyləyin (burada 50 Hz). Köhnə məktəb üsulu ilə şanslı olsanız, ekranınızda sabit bir 50 görürsünüz, amma daha çox ehtimal ki, 49 -dan 50 -yə və ya 50 -dən 51 -ə qədər olan ekran keçidini görəcəksiniz. Çözünürlük 1 Hz -dir, vəssalam. Qapı müddətini 1000 saniyəyə qaldırmaq istəməsəniz heç vaxt 50.002 Hz görməyəcəksiniz. Bu, tək bir ölçmə üçün 16 dəqiqədən çoxdur!

Aşağı tezlikli siqnalları ölçməyin daha yaxşı yolu onun müddətini ölçməkdir. Şəbəkəni yenidən nümunə olaraq götürsək, 20 milisaniyəlik bir dövrə malikdir. Eyni məntiqi VƏ qapısını götürün, 10 MHz (0,1 us puls) deyin və digər portdakı siqnalınızla 200000 puls çıxın, beləliklə dövr 20000.0 uS-dir və bu da 50Hz-ə çevrilir. Yalnız 199650 nəbzini ölçdüyünüz zaman tezlik 50.087 Hz -dir, bu daha yaxşıdır və yalnız bir saniyəlik ölçmə müddətindədir. Təəssüf ki, bu daha yüksək tezliklərdə yaxşı işləmir. Məsələn, indi 40 kHz ölçmək istəyirik. Referans olaraq eyni 10 MHz giriş tezliyi ilə indi yalnız 250 impuls ölçürük. Yalnız 249 nəbz saydıqda, hesablama 40161 Hz verir və 251 ilə nəticə 39840 Hz -dir. Bu qəbul edilə bilən bir qətnamə deyil. Əlbəttə ki, istinad tezliyini artırmaq nəticələri yaxşılaşdırır, ancaq mikro nəzarət cihazında istifadə edə biləcəyiniz bir məhdudiyyət var.

Addım 2: Qarşılıqlı yol

Qarşılıqlı yol
Qarşılıqlı yol
Qarşılıqlı yol
Qarşılıqlı yol

Həm aşağı, həm də yüksək tezliklər üçün işləyən bir həll qarşılıqlı tezlik sayğacdır. Onun prinsipini izah etməyə çalışacağam. Təxminən 1 saniyəlik bir ölçmə vaxtı ilə başlayarsınız, çox dəqiq olmaq məcburiyyətində deyilsiniz, ancaq bir ölçü üçün məqbul bir vaxtdır. Bu 1 Hz siqnalını D girişindəki bir D-flipflopa verin. Çıxışlarda hələ heç nə olmur. Ölçmək istədiyiniz siqnalı D-flipflopun SAAT girişinə qoşun.

Bu siqnal LOW-dan HIGH-a keçdikcə D-flipflopun çıxışı D girişinin vəziyyətini çıxışa (Q) köçürür. Bu RISING siqnalı, gediş siqnalı ilə yanaşı istinad siqnalını da saymağa başlamaq üçün istifadə olunur.

Beləliklə, eyni anda İKİ siqnal sayırsınız, ölçmək istədiyiniz siqnal və istinad saatı. Bu istinad saatı dəqiq bir dəyərə sahib olmalı və sabit olmalıdır, normal bir kristal osilator yaxşıdır. Dəyər yüksək bir tezlik olduğu və dəyəri yaxşı bilindiyi müddətcə çox da əhəmiyyətli deyil.

Bir müddət sonra, bir neçə milisaniyə deyək, D-flipflopun D girişini yenidən aşağı salırsınız. Növbəti SAAT girişində Q çıxışı girişin vəziyyətini izləyir, lakin başqa heç nə baş vermir, çünki mikro nəzarətçi yalnız RISING siqnalına reaksiya verəcək. Ölçmə müddəti bitdikdən sonra (təxminən 1 saniyə) D girişini YÜKSƏK edirsiniz.

Yenə növbəti SAAT girişində Q çıxışı gəlir və bu yüksələn siqnal mikro nəzarətçini işə salır, bu dəfə hər iki sayğacın sayılmasını sona çatdırır.

Nəticə iki rəqəmdir. Birinci rəqəm, istinaddan sayılan impulsların sayıdır. İstinad tezliyini bildiyimiz kimi, bu nəbzləri saymaq üçün lazım olan vaxtı da bilirik.

İkinci nömrə, ölçdüyümüz giriş siqnalından gələn impulsların sayıdır. Bu siqnalın RISING kənarlarından başladığımız zaman, bu giriş siqnalının nəbzlərinin sayından çox əminik.

İndi yalnız giriş siqnalının tezliyini təyin etmək üçün bir hesablama.

Məsələn, deyək ki, bu siqnallara sahibik və f girişini ölçmək istəyirik. İstinad kvars kristal osilatoru tərəfindən yaradılan 10 MHz -dir. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), ölçmə müddəti təxminəndir. 1 saniyə

Bu müddət ərzində 32 nəbzi saydıq. İndi bu siqnalın bir dövrü 1 / 31.416 = 31830.9 uS alır. Beləliklə, 32 dövr bizə 1.0185892 saniyə çəkdi ki, bu da 1 saniyədən bir az artıqdır.

Bu 1.0186 saniyədə biz də 10185892 istinad siqnalının nəbzini saymış olacağıq.

Bu bizə aşağıdakı məlumatları verir: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Yaranan tezliyi hesablamaq üçün düstur budur: freq = (input_count * f_reference) / ref_count

Misalımızda: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

Və bu həm aşağı tezliklər, həm də yüksək tezliklər üçün yaxşı işləyir, yalnız giriş siqnalı istinad tezliyinə yaxınlaşdıqda (və ya daha yüksək olduqda) standart "qapılı" ölçmə üsulundan istifadə etmək daha yaxşıdır. Ancaq sonra, giriş siqnalına sadəcə bir tezlik bölücü əlavə edə bilərik, çünki bu qarşılıqlı metod hər hansı bir tezlik üçün eyni qətnaməyə malikdir (yenidən referansa qədər). Beləliklə, 100 kHz -ni birbaşa xarici bir 1000x bölücü ilə bölünsə də, qətnamə eynidır.

Addım 3: Avadanlıq və onun sxematikası

Avadanlıq və onun sxematikası
Avadanlıq və onun sxematikası
Avadanlıq və onun sxematikası
Avadanlıq və onun sxematikası

Bu tip tezlik sayğaclarından bir neçəsini hazırladım. Bir müddət əvvəl bir ATMEGA328 (Arduinoda olduğu kimi eyni nəzarətçi) ilə, daha sonra ST -dən ARM mikro nəzarətçiləri ilə hazırladım. Ən son 168 MHz tezlikli STM32F407 ilə hazırlanmışdır. Amma indi düşündüm ki, eyni şeyi * çox kiçik * ilə etsəm nə olar. Yalnız 2 kbayt FLASH yaddaş və 128 bayt RAM olan ATTINY2313 seçdim. Sahib olduğum ekran, 8 yeddi seqmentli bir MAX7219 modelidir, bu ekranlar Ebay -də cəmi 2 Avroya satılır. ATTINY2313 modelini 1,5 Avroya almaq olar, istifadə etdiyim hissələrin qalan hissəsi isə bir sentə başa gəlir. Ən bahalı yəqin ki, plastik layihə qutusu idi. Daha sonra onu lityum-ion batareyada işləməyə qərar verdim, buna görə də (LDO) 3.3V gərginlik stabilizatorunu batareyaya doldurma modulu və batareyanın özünü əlavə etməliyəm. Bu, qiyməti bir qədər artırır, amma 20 Avrodan aşağı qiymətə tikilə biləcəyini düşünürəm.

Addım 4: Kod

Kod
Kod
Kod
Kod

Kod Atmel (Microchip) Studio 7 ilə C -də yazılmış və OLIMEX AVR_ISP (klon?) İstifadə edərək ATTINY2313 -də proqramlaşdırılmışdır. Təsviri burada izləmək istəyirsinizsə aşağıdakı zip faylında (main.c) açın.

İNTİALİZASİYA

Əvvəlcə ATTINY2313, xarici bir kristal istifadə etmək üçün quruldu, çünki daxili RC-osilator heç bir şeyi ölçmək üçün yararsızdır. Kiçik bir dəyişən kondansatörlə düzgün 10 000 000 Hz tezliyinə uyğunlaşdırdığım 10 MHz kristal istifadə edirəm. Başlanğıc, portların giriş və çıxışlara qurulması, taymerlərin qurulması və MAX7219 -un kəsilməsini və işə salınmasını təmin edir. TIMER0, xarici saatı, TIMER1-i daxili saatı saymaq və D-flipflopdan gələn ICP-nin yüksələn kənarındakı sayğacın dəyərini çəkmək üçün qurulmuşdur.

Əsas proqramı son olaraq müzakirə edəcəyəm, buna görə də sonrakı ara vermə qaydaları.

TIMER0_OVF

TIMER0 255 -ə (8 bit) qədər hesablandıqdan sonra 0 -a yuvarlandıqda daşqınların sayını hesablamaq üçün fasilə lazımdır. TIMER0_OVF -un etdiyi hər şey budur, yalnız daşma sayını sayın. Daha sonra bu ədəd sayğacın özünün dəyəri ilə birləşdirilir.

TIMER1_OVF

TIMER1 65536 (16 bit) qədər saya bilər, buna görə də TIMER1_OVF kəsilməsi daşqınların sayını da hesablayır. Ancaq daha çox şey edir. Təxminən 1 saniyə çəkən və sonra flipflopun D girişinə gedən bir çıxış pinini təyin edən 152-dən 0-a qədər azalır. Və bu fasilə rutinində edilən son iş, təxminən 5 saniyə çəkən 765-dən 0-a qədər olan zaman aşım sayacını azaltmaqdır.

TIMER1_CAPT

Bu, D-flipflop hər dəfə siqnal göndərərkən, giriş siqnalının yüksələn kənarında (yuxarıda izah edildiyi kimi) tetiklenen TIMER1_CAPT kəsilməsidir. Tutma məntiqi, çəkmə anında TIMER1 sayğacının dəyərinin qənaət edilməsinə diqqət yetirir, həm də daşma sayğacı kimi saxlanılır. Təəssüf ki, TIMER0 -da bir giriş tutma funksiyası yoxdur, buna görə də cari dəyəri və daşma sayğacının cari dəyəri oxunur. Bunun yeni məlumat olduğunu söyləmək üçün əsas proqram üçün bir mesaj dəyişən təyin olunur.

Sonra MAX7219 -u idarə etmək üçün iki funksiya var

SPI

Çipdə Universal Serial İnterfeysi (USI) olsa da, istifadə etməməyi seçdim. MAX7219 displeyi SPI vasitəsilə idarə olunmalıdır və bu USI ilə mümkündür. Ancaq SPI -ni bitbang etmək o qədər sadədir ki, bunu USI ilə etməyə vaxt ayırmadım.

MAX7219

Təlimatı oxuduqdan sonra MAX7219 qurma protokolu da olduqca sadədir. Rəqəm sayı üçün 8 bitdən (1 -dən 8 -ə qədər) və göstərilməsi lazım olan rəqəm üçün 8 bitdən ibarət olan hər rəqəm üçün 16 bit dəyərə ehtiyac var.

ƏSAS PROQ

Son şey əsas proqramı izah etməkdir. Sonsuz bir döngədə işləyir ((1)), ancaq fasilə rejimindən bir mesaj (1) olduqda və ya zaman aşımı sayğacı sıfıra çatdıqda (giriş siqnalı yoxdur) yalnız bir şey edir.

Dəyişən mesaj birə təyin edildikdə ediləcək ilk şey, bir siqnalın olduğunu bildiyimizdən sonra, zaman aşımı sayğacını sıfırlamaqdır. D-flipflop, ölçmə vaxtından sonra gələcək saniyə (bir saniyə gözləyin) üçün gələcək tətiyə hazır olmaq üçün sıfırlanır.

İstinad sayını və giriş tezliyi sayını vermək üçün ələ kəsilmədə qeydə alınan nömrələr əlavə olunur. (daha sonra bölüşdürəcəyimiz üçün istinadın heç vaxt sıfır ola bilməyəcəyinə əmin olmalıyıq)

Sonrakı faktiki tezliyin hesablanmasıdır. Şübhəsiz ki, yalnız 2 kbayt flaş və tam ədədlərdən istifadə etdiyim 128 bayt ram olan mikrokontrolördə üzən nömrələrdən istifadə etmək istəmirəm. Ancaq tezliklər 314.159 Hz ola bilər, bir neçə ondalıkla. Buna görə giriş tezliyini yalnız istinad tezliyi ilə deyil, həm də bir çarpanla vururam və sonra onluq nöqtənin getdiyi yerə bir rəqəm əlavə edirəm. Bunu etdiyiniz zaman bu rəqəmlər çox böyük olacaq. Məsələn, 500 kHz girişi, 10 MHz arayış və 100 çarpanı ilə 5 x 10^14 verir, bu həqiqətən böyükdür! 32 bitlik bir nömrəyə sığa bilməyəcəklər, buna görə də 1.8 x 10^19 -a qədər gedən 64 bit nömrələrdən istifadə edirəm (ATTINY2313 -də yaxşı işləyir)

Və ediləcək son şey, nəticəni MAX7219 ekranına göndərməkdir.

Kod təxminən 1600 bayta yığılır, buna görə ATTINY2313 -də mövcud olan 2048 bayt flaşa uyğundur.

Sigorta qeydləri belə oxunmalıdır:

Uzadılmış 0xFF

YÜKSƏK 0xDF

LOW 0xBF

Addım 5: Dəqiqlik və Həssaslıq

Dəqiqlik və Dəqiqlik
Dəqiqlik və Dəqiqlik
Dəqiqlik və Dəqiqlik
Dəqiqlik və Dəqiqlik
Dəqiqlik və Dəqiqlik
Dəqiqlik və Dəqiqlik

Dəqiqlik və dəqiqlik iki ayrı heyvandır. Buradakı dəqiqlik yeddi rəqəmdir, həqiqi dəqiqliyin nə olması donanımdan və kalibrdən asılıdır. 10 MHz (test nöqtəsində 5 MHz) GPS intizamlı bir osilatoru olan başqa bir tezlik sayğacı ilə kalibr etdim.

Və olduqca yaxşı işləyir, sınadığım ən aşağı tezlik 0,2 Hz, ən yüksək 2 MHz -dir. Yerindədir. 2 MHz -dən yuxarı olduqda nəzarətçi 2 MHz -lik giriş siqnalında TIMER0 saniyədə 7800 -dən çox fasilə yarandığını bildiyiniz zaman təəccüblü deyil. ATTINY2313 digər şeyləri də etmək məcburiyyətindədir, TIMER1-dən olan fasilələr, saniyədə başqa 150 fasilə və əlbəttə ki, ekranı və D-flipflopu idarə edərək hesablamalar aparır. Əsl cihaza baxdığınızda, ekranın səkkiz rəqəmindən yalnız yeddisini istifadə etdiyimi görəcəksiniz. Bunu bir neçə səbəbdən edirəm.

Birincisi, giriş tezliyinin hesablanması bir bölmədir, demək olar ki, həmişə bir qalığa sahib olacaq, bunu tam ədəd bölgüsü kimi görmürsən. İkincisi, kvars kristal osilatorunun temperatur sabitləşməməsidir.

Doğru 10 MHz -ə uyğunlaşdıran kondansatörlər, keramikadır, temperatur dəyişikliklərinə çox həssasdır. Sonra TIMER0 -un ələ keçirmə məntiqinin olmaması və kəsilmə funksiyalarının hamısının işlərini görməsi bir az vaxt tələb edir. Düşünürəm ki, yeddi rəqəm kifayət qədər yaxşıdır.

Tövsiyə: