Mundarija:

Yuqori aniqlikdagi chastota hisoblagichi: 5 qadam (rasmlar bilan)
Yuqori aniqlikdagi chastota hisoblagichi: 5 qadam (rasmlar bilan)

Video: Yuqori aniqlikdagi chastota hisoblagichi: 5 qadam (rasmlar bilan)

Video: Yuqori aniqlikdagi chastota hisoblagichi: 5 qadam (rasmlar bilan)
Video: BSIDE ZT-Y2 va BSIDE ZT-Y multimetrlari va BSIDE ZT-X multimetrlarini ko'rib chiqish va taqqoslash 2024, Noyabr
Anonim

Bu ko'rsatma chastotalarni tez va oqilona aniqlikda o'lchashga qodir o'zaro chastota hisoblagichini ko'rsatadi. U standart komponentlardan tayyorlangan va uni hafta oxiri qilish mumkin (menga biroz ko'proq vaqt kerak bo'ldi:-))

EDIT: Kod endi GitLab -da mavjud:

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

1 -qadam: Eski maktab chastotalarini hisoblash

Eski maktabda chastotalarni hisoblash
Eski maktabda chastotalarni hisoblash
Eski maktabda chastotalarni hisoblash
Eski maktabda chastotalarni hisoblash

Signalning chastotasini o'lchashning eski usuli-bu mantiqiy VA-shlyuzidan foydalanish, o'lchanadigan signalni bitta portga va boshqa portga aniq 1 soniya yuqori bo'lgan signalni uzatish va chiqishni hisoblash. Bu bir necha kHz chastotali chastotali signallarni GGts chastotasida yaxshi ishlaydi. Ammo past chastotali signalni yaxshi aniqlikda o'lchashni istasangiz nima bo'ladi? Aytaylik, siz tarmoq chastotasini o'lchashni xohlaysiz (bu erda 50 Gts). Agar siz omadingiz bo'lsa, eski maktab usuli bilan siz doimiy ravishda 50 ni ko'rasiz, lekin siz 49 dan 50 gacha yoki 50 dan 51 gacha bo'lgan displeyni ko'rasiz. Ruxsat 1 Gts, va bu hammasi. Agar siz eshik vaqtini 1000 soniyagacha oshirishni xohlamasangiz, siz hech qachon 50.002 Gts ni ko'rmaysiz. Bu bitta o'lchov uchun 16 daqiqadan ko'proq!

Past chastotali signallarni o'lchashning eng yaxshi usuli - uning davrini o'lchash. Yana tarmoqni misol qilib oladigan bo'lsak, uning davomiyligi 20 millisekund. Xuddi shu mantiqiy AND-darvozasini oling, uni 10 MGts (0,1 uss impulslari) va boshqa portdagi signalingiz bilan 200000 ta pulsni uzatadi, shuning uchun davr 20000,0 uS bo'lib, u 50 Gts ga qaytadi. Siz faqat 199650 pulslarini o'lchaganingizda, chastota 50.087 Gts ni tashkil qiladi, bu juda ham yaxshi va u faqat bir soniya o'lchov vaqtida. Afsuski, bu yuqori chastotalarda yaxshi ishlamaydi. Masalan, biz hozir 40 kHz ni o'lchashni xohlaymiz. Bir xil 10 MGts kirish chastotasi mos yozuvlar sifatida biz hozir atigi 250 impulsni o'lchaymiz. Agar biz 249 ta impulsni hisoblasak, hisob 40161 Gtsni, 251 bilan esa 39840 Gts ni tashkil qiladi. Bu qabul qilinadigan qaror emas. Albatta, mos yozuvlar chastotasini ko'paytirish natijalarni yaxshilaydi, lekin mikrokontrolda nima ishlatishingiz mumkin.

2 -qadam: O'zaro yo'l

O'zaro yo'l
O'zaro yo'l
Qarama -qarshi yo'l
Qarama -qarshi yo'l

Past va yuqori chastotalarda ishlaydigan yechim o'zaro chastotali hisoblagichdir. Men uning printsipini tushuntirishga harakat qilaman. Siz taxminan 1 soniya o'lchash vaqtidan boshlaysiz, bu juda aniq bo'lishi shart emas, lekin o'lchash uchun oqilona vaqt. 1 gigagertsli signalni D kirishidagi D-flipflopga yuboring. Chiqish (lar) da hozircha hech narsa bo'lmaydi. O'lchamoqchi bo'lgan signalni D-flipflopning CLOCK kirishiga ulang.

Bu signal "LOW" dan "HIGH" ga o'tishi bilan D-flipflopning chiqishi D-kirish holatini chiqishga (Q) o'tkazadi. Bu RISING signalining ketishi kirish signalini va mos yozuvlar soat signalini sanashni boshlash uchun ishlatiladi.

Shunday qilib, siz bir vaqtning o'zida ikkita signalni, o'lchashni xohlagan signalni va mos yozuvlar soatini hisoblayapsiz. Bu mos yozuvlar soat aniq qiymatga ega bo'lishi va barqaror bo'lishi kerak, oddiy kristalli osilator yaxshi. Qiymat juda muhim emas, chunki u yuqori chastotali va uning qiymati hammaga ma'lum.

Biroz vaqt o'tgach, aytaylik, bir necha millisekundda, siz D-flipflopning D-kirishini yana past qilasiz. Keyingi CLOCK-kiritishda Q chiqish holati kuzatiladi, lekin boshqa hech narsa sodir bo'lmaydi, chunki mikro-kontroller faqat RISING signaliga javob beradi. Keyin, o'lchash vaqti tugagandan so'ng (taxminan 1 soniya) siz D-kiritishni YUQORI qilasiz.

Keyingi CLOCK-kiritishda Q chiqishi kuzatiladi va bu RISING signali mikrokontrollerni ishga tushiradi, bu safar ikkala taymerni hisobini tugatadi.

Natijada ikkita raqam paydo bo'ladi. Birinchi raqam - bu ma'lumotnomadan hisoblangan pulslar soni. Malumot chastotasini bilganimizdek, bu pulslarni sanash uchun qancha vaqt kerakligini ham bilamiz.

Ikkinchi raqam - bu biz o'lchayotgan kirish signalidan keladigan impulslar soni. Biz aynan shu signalning RISING qirralarida boshlaganimizda, biz bu kirish signalining impulslari soniga juda ishonamiz.

Endi bu faqat kirish signalining chastotasini aniqlash uchun hisoblash.

Misol uchun, bizda bu signallar bor va biz f-kirishni o'lchashni xohlaymiz. Malumot 10 MGts, kvarts kristalli osilatori tomonidan ishlab chiqariladi. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MGts), o'lchash vaqti taxminan. 1 soniya

Bu vaqt ichida biz 32 ta pulsni hisobladik. Endi bu signalning bir davri 1 / 31.416 = 31830.9 uS ni oladi. Shunday qilib, 32 ta davr bizga 1.0185892 soniyani, ya'ni 1 soniyadan biroz ko'proq vaqtni oldi.

Bu 1.0186 soniyada biz ham mos yozuvlar signalining 10185892 impulsini hisoblaymiz.

Bu bizga quyidagi ma'lumotlarni beradi: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Olingan chastotani hisoblash formulasi quyidagicha: freq = (input_count * f_reference) / ref_count

Bizning misolimizda: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

Va bu past chastotalar uchun ham, yuqori chastotalar uchun ham yaxshi ishlaydi, faqat kirish signali mos yozuvlar chastotasiga yaqinlashganda (yoki undan ham yuqori) standart "eshikli" o'lchash usulini qo'llash yaxshiroqdir. Ammo keyin biz kirish signaliga chastota ajratuvchini qo'shishimiz mumkin, chunki bu o'zaro usul har qanday chastotada bir xil aniqlikka ega (yana havolaga qadar). Shunday qilib, siz 100 kHzni to'g'ridan -to'g'ri 1000x tashqi bo'linuvchi bilan bo'linmasin, o'lchamlari bir xil.

3 -qadam: Uskuna va uning sxemasi

Uskuna va uning sxemasi
Uskuna va uning sxemasi
Uskuna va uning sxemasi
Uskuna va uning sxemasi

Men bunday turdagi chastota hisoblagichlarining bir nechtasini tayyorladim. Uzoq vaqt oldin men uni ATMEGA328 (Arduino -dagi kabi boshqaruvchi) bilan, keyinchalik ST -dan ARM mikro -kontrollerlari bilan yasadim. Oxirgi 168 MGts chastotali STM32F407 yordamida qilingan. Ammo endi men ham xuddi shunday * juda kichikroq bilan nima qilsam ekan, deb o'yladim. Men ATTINY2313 ni tanladim, u faqat 2 kbayt FLASH xotiraga va 128 baytli RAMga ega. Menda mavjud bo'lgan MAX7219 displeyi 8 ta etti segmentli displeyga ega, bu displeylar Ebayda atigi 2 evroga sotiladi. ATTINY2313 -ni taxminan 1,5 evroga sotib olish mumkin, qolgan qismlar esa bir sent uchun atigi sent. Ehtimol, eng qimmat plastik quti edi. Keyinchalik men uni lityum-ionli batareyada ishlashga qaror qildim, shuning uchun (LDO) 3.3V kuchlanish stabilizatorini batareyani zaryadlovchi moduli va batareyaning o'zi qo'shish kerak edi. Bu narxni biroz oshiradi, lekin menimcha, uni 20 evrodan ham arzonroq qurish mumkin.

4 -qadam: Kod

Kodeks
Kodeks
Kodeks
Kodeks

Kod Atmel (Microchip) Studio 7 bilan C tilida yozilgan va OLIMEX AVR_ISP (klon?) Yordamida ATTINY2313 ga dasturlashtirilgan. Quyidagi zip faylidagi (main.c) -ni oching, agar ta'rifga amal qilmoqchi bo'lsangiz.

Boshlanish

Birinchidan, ATTINY2313 tashqi kristallga o'rnatildi, chunki ichki RC-osilator hech narsani o'lchash uchun foydasiz. Men 10 MGtsli kristallni ishlataman, men kichik o'zgaruvchan kondansatör bilan to'g'ri 10 000 000 Gts chastotasini sozlayman. Boshlash portlarni kirish va chiqishlarga sozlash, taymerlarni sozlash va MAX7219ni uzilish va ishga tushirish imkoniyatlarini beradi. TIMER0-tashqi soatni, TIMER1-ichki soatni, shuningdek D-flipflopdan keladigan ICPning ko'tarilgan chekkasidagi hisoblagich qiymatini o'lchash uchun sozlangan.

Men oxirgi navbatda asosiy dasturni muhokama qilaman, shuning uchun keyingi navbatda uzilish tartiblari.

TIMER0_OVF

TIMER0 255 (8 bit) gacha sanab, so'ngra 0 ga o'tsa, to'lqinlar sonini hisoblash uchun uzilish kerak. Bu faqat TIMER0_OVF qiladi, faqat toshib ketish sonini hisoblang. Keyinchalik bu raqam hisoblagichning o'zi bilan birlashtiriladi.

TIMER1_OVF

TIMER1 65536 (16 bit) gacha hisoblashi mumkin, shuning uchun TIMER1_OVF uzilishi ham toshib ketish sonini hisoblab chiqadi. Ammo u ko'proq narsani qiladi. Shuningdek, u 152 dan 0 gacha kamayadi, bu taxminan 1 soniya davom etadi va keyin flipflopning D-kirishiga o'tadigan chiqish pinini o'rnatadi. Va bu uzilish tartibida bajariladigan oxirgi narsa, taymer taymerini 765 dan 0 gacha, bu 5 soniya davom etadi.

TIMER1_CAPT

Bu D-flipflop kirish signalining ko'tarilish chekkasida signal yuborgan har safar ishga tushadigan TIMER1_CAPT uzilishidir (yuqorida aytib o'tilganidek). Rasmga tushirish mantig'i TIMER1 hisoblagichini yozib olish paytida uning qiymatini saqlashga yordam beradi, u ham saqlanib qoladi. Afsuski, TIMER0 -da kirish ta'qib qilish funktsiyasi mavjud emas, shuning uchun bu erda uning joriy qiymati va hisoblagichning joriy qiymati o'qiladi. Xabar o'zgaruvchisining asosiy dasturiga bu yangi ma'lumotlar ekanligini bildirish uchun bitta parametr o'rnatilgan.

Keyingi MAX7219 -ni boshqarish uchun ikkita funktsiya

SPI

Chipda Universal Serial Interface (USI) mavjud bo'lsa -da, men uni ishlatmaslikni tanladim. MAX7219 displeyi SPI orqali boshqarilishi kerak va bu USI yordamida mumkin. Lekin SPI -ni biting qilish juda oddiy, men buni USI bilan qilishga vaqt ajratmadim.

MAX7219

MAX7219 ni sozlash protokoli, siz uning qo'llanmasini o'qib bo'lgach, juda oddiy. Har bir raqam uchun 16 bitli qiymat kerak, u raqamli raqam uchun 8 bitdan (1 dan 8 gacha), keyin ko'rsatilishi kerak bo'lgan raqam uchun 8 bitdan iborat.

ASOSIY PROG

Oxirgi narsa - asosiy dasturni tushuntirish. U cheksiz tsiklda ishlaydi (while (1)), lekin faqat uzilish tartibidan xabar (1) kelganida yoki taymer taymeri nolga tushganda (kirish signali yo'q) faqat biror narsa qiladi.

O'zgaruvchan xabarni bitta qilib qo'yganda qilish kerak bo'lgan birinchi narsa - bu signal mavjudligini bilganimizdan so'ng, taymer taymerini qayta o'rnatish. D-flipflop o'lchash vaqtidan keyin (bir soniya kutib turing) keladigan keyingi ishga tushirishga tayyor bo'lishi uchun qayta o'rnatiladi.

Malumot va kirish chastotalari sonini berish uchun ta'qib qilishda qayd qilingan raqamlar qo'shiladi. (biz mos yozuvlar hech qachon nolga teng bo'lmasligiga ishonch hosil qilishimiz kerak, chunki biz keyinchalik uni ajratamiz)

Keyingi - haqiqiy chastotani hisoblash. Shubhasiz, men mikrokontrolderda faqat 2 kbaytli fleshli va faqat 128 baytli ramlardan foydalanishni xohlamayman. Ammo chastotalar 314.159 Gts ga teng bo'lishi mumkin, bir necha o'nlik. Shuning uchun men kirish chastotasini faqat mos yozuvlar chastotasi bilan emas, balki multiplikator bilan ham ko'paytiraman va keyin kasr nuqtasi ketadigan joyga raqam qo'shaman. Agar buni qilsangiz, bu raqamlar juda katta bo'ladi. Masalan, 500 kHz chastotali, 10 MGts chastotali va 100 ko'paytirgichli, bu 5 x 10^14 ni beradi, bu juda katta! Ular 32 bitli raqamga mos kelmaydi, shuning uchun men 1,8 x 10^19 gacha bo'lgan 64 bitli raqamlardan foydalanaman (bu ATTINY2313 da yaxshi ishlaydi)

Va oxirgi narsa - natijani MAX7219 displeyiga yuborish.

Kod 1600 baytni tashkil qiladi, shuning uchun u ATTINY2313 -da mavjud bo'lgan 2048 baytli fleshka mos keladi.

Sug'urta registrlari quyidagicha o'qilishi kerak:

Uzaytirildi 0xFF

YUQORI 0xDF

LOW 0xBF

5 -qadam: aniqlik va aniqlik

Aniqlik va aniqlik
Aniqlik va aniqlik
Aniqlik va aniqlik
Aniqlik va aniqlik
Aniqlik va aniqlik
Aniqlik va aniqlik

Aniqlik va aniqlik - bu ikkita alohida hayvon. Bu erda aniqlik etti raqamdan iborat bo'lib, aniqligi apparat va kalibrlashga bog'liq. Men 10 MGts (sinov nuqtasida 5 MGts) ni GPS intizomli osilatori bo'lgan boshqa chastota hisoblagichi bilan kalibrladim.

Va u juda yaxshi ishlaydi, men sinab ko'rgan eng past chastota 0,2 Gts, eng yuqori 2 MGts. Bu joyida. 2 MGts dan yuqori nazoratchi uzilishlarni bo'shata boshlaydi, bu 2 MGts chastotali kirish signalida TIMER0 sekundiga 7800 dan ortiq uzilishlar hosil qilishini bilsangiz ajablanarli emas. ATTINY2313 boshqa ishlarni ham bajarishi kerak, TIMER1-dan uzilishlar, yana 150 ta sekundiga va, albatta, hisob-kitoblarni bajaradi, displey va D-flipflopni boshqaradi. Haqiqiy qurilmaga qaraganingizda, men displeyning sakkizta raqamidan atigi yettitasini ishlatganimni ko'rasiz. Men buni bir necha sabablarga ko'ra qilaman.

Birinchidan, kirish chastotasini hisoblash - bu bo'linish, u deyarli har doim qoldiqlarga ega bo'ladi, siz buni ko'rmaysiz, chunki bu butun sonli bo'linma. Ikkinchidan, kvarts kristalli osilatori haroratni barqarorlashtirmaydi.

To'g'ri 10 MGts ga sozlaydigan kondansatörler keramik, harorat o'zgarishiga juda sezgir. TIMER0 -da yozish mantig'i yo'qligi va uzilish funktsiyalarining hammasi o'z ishlarini bajarish uchun biroz vaqt talab etadi. Menimcha, ettita raqam etarli darajada yaxshi.

Tavsiya: