Агуулгын хүснэгт:

Өндөр нарийвчлалтай давтамжийн тоолуур: 5 алхам (зурагтай)
Өндөр нарийвчлалтай давтамжийн тоолуур: 5 алхам (зурагтай)

Видео: Өндөр нарийвчлалтай давтамжийн тоолуур: 5 алхам (зурагтай)

Видео: Өндөр нарийвчлалтай давтамжийн тоолуур: 5 алхам (зурагтай)
Видео: Лучший из ЛУЧШИХ???. Радиоприемник TECSUN PL680 ПОЛНЫЙ ОБЗОР!!! #tecsun 2024, Долдугаар сарын
Anonim

Энэхүү зааварчилгаа нь давтамжийг хурдан бөгөөд боломжийн нарийвчлалтай хэмжих чадвартай харилцан давтамжийн тоолуурыг харуулж байна. Энэ нь стандарт бүрэлдэхүүн хэсгүүдээр хийгдсэн бөгөөд амралтын өдрүүдэд хийх боломжтой (надад жаахан удсан:-))

EDIT: Кодыг GitLab дээр ашиглах боломжтой боллоо.

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

Алхам 1: Хуучин сургуулийн давтамж тоолох

Хуучин сургуулийн давтамж тоолох
Хуучин сургуулийн давтамж тоолох
Хуучин сургуулийн давтамж тоолох
Хуучин сургуулийн давтамж тоолох

Дохионы давтамжийг хэмжих хуучин сургуулийн арга бол AND-хаалгыг ашиглах, хэмжих дохиог нэг порт руу, яг 1 секундын өндөртэй дохиог нөгөө порт руу оруулах, гаралтыг тоолох явдал юм. Энэ нь хэдхэн кГц давтамжтай давтамжтай давтамжтай давтамжтай дохио өгөхөд маш сайн ажилладаг. Гэхдээ хэрэв та бага давтамжтай дохиог сайн нарийвчлалтай хэмжихийг хүсч байвал яах вэ? Та сүлжээний давтамжийг хэмжихийг хүсч байгаагаа хэлээрэй (энд 50 Гц). Хуучин сургуулийн аргыг ашигласнаар та азтай бол дэлгэц дээр тогтмол 50 гарч ирэх болно, гэхдээ дэлгэцийн унтраалга 49 -ээс 50 эсвэл 50 -аас 51 хүртэл байх болно. Нарийвчлал нь 1 Гц, тэгээд л болоо. Хэрэв та хаалганы цагийг 1000 секунд хүртэл нэмэгдүүлэхийг хүсэхгүй бол 50.002 Гц -ийг хэзээ ч харахгүй. Энэ нь нэг удаагийн хэмжилт хийхэд 16 гаруй минут болно!

Бага давтамжийн дохиог хэмжих илүү сайн арга бол түүний хугацааг хэмжих явдал юм. Сүлжээг дахин жишээ болгон авахад 20 миллисекундын хугацаа байна. Үүнтэй ижил логик ба гарцыг аваад 10 МГц (0.1 импульс) гэж хэлээд нөгөө порт дээрх дохиог 200000 импульсээр тэжээнэ үү. Та ердөө 199650 импульсийг хэмжихэд давтамж нь 50.087 Гц байна, энэ нь хамаагүй дээр бөгөөд энэ нь ердөө нэг секундын дотор хэмжигддэг. Харамсалтай нь энэ нь өндөр давтамжтай сайн ажиллахгүй байна. Жишээлбэл, бид одоо 40 кГц -ийг хэмжихийг хүсч байна. Лавлагаа болох 10 МГц -ийн оролтын давтамжтай бол бид одоо ердөө 250 импульсийг хэмждэг. Зөвхөн 249 импульсийг тоолоход 40161 Гц, 251 -ийн үр дүн нь 39840 Гц байна. Энэ бол хүлээн зөвшөөрөгдөх шийдвэр биш юм. Мэдээжийн хэрэг лавлагааны давтамжийг нэмэгдүүлэх нь үр дүнг сайжруулдаг боловч микро хянагч дээр ашиглах хязгаарлалт байдаг.

Алхам 2: Харилцааны арга

Харилцааны арга
Харилцааны арга
Харилцааны арга
Харилцааны арга

Бага ба өндөр давтамжийн аль алинд нь ажилладаг шийдэл бол харилцан давтамжийн тоолуур юм. Би түүний зарчмыг тайлбарлахыг хичээх болно. Та ойролцоогоор 1 секунд хэмжих хугацаанаас эхэлдэг бөгөөд энэ нь маш нарийн байх албагүй боловч хэмжихэд тохиромжтой цаг юм. Энэхүү 1 Гц давтамжтай дохиог D оролт дээрх D-flipflop руу оруулна уу. Гаралт дээр одоогоор юу ч болоогүй байна. Хэмжихийг хүсч буй дохиог D-flipflop-ийн ЦАГИЙН оролттой холбоно уу.

Энэ дохио нь LOW-ээс HIGH руу шилжсэн даруйд D-flipflop-ийн гаралт нь D-оролтын төлөвийг гаралт руу (Q) шилжүүлдэг. Энэхүү RISING дохио нь оролтын дохио болон лавлах цагийн дохиог тоолж эхлэхэд ашиглагддаг.

Тиймээс та ХОЁР дохиог яг зэрэг тоолж байна, хэмжихийг хүсч буй дохио болон лавлах цаг. Энэхүү лавлах цаг нь тодорхой утгатай, тогтвортой байх ёстой, энгийн болор осциллятор байвал зүгээр. Өндөр давтамжтай бөгөөд үнэ цэнийг нь сайн мэддэг л бол үнэ цэнэ тийм ч чухал биш юм.

Хэсэг хугацааны дараа хэдэн миллисекунд хэлээд D-flipflop-ийн D оролтыг дахин бууруулна. Дараагийн CLOCK-оролтонд Q гаралт нь оролтын төлөвийг дагаж мөрддөг боловч микро хянагч нь зөвхөн RISING дохионд хариу үйлдэл үзүүлэхээр тохируулагдсан тул өөр юу ч тохиолддоггүй. Дараа нь хэмжих хугацаа дууссаны дараа (ойролцоогоор 1 секунд) та D оролтыг HIGH болгоно.

Дараагийн ЦАГИЙН оролт дээр Q гаралт гарч ирэх бөгөөд RISING дохио нь микро хянагчийг ажиллуулдаг бөгөөд энэ удаад тоолуурын тооллогыг дуусгах болно.

Үр дүн нь хоёр тоо юм. Эхний тоо бол лавлагаанаас тоолсон импульсийн тоо юм. Лавлах давтамжийг мэддэг тул эдгээр импульсийг тоолоход зарцуулсан цаг хугацааг бид бас мэддэг.

Хоёрдахь тоо бол бидний хэмжиж буй оролтын дохионы импульсийн тоо юм. Бид энэ дохионы RISING ирмэгээс яг эхэлж байхдаа энэ оролтын дохионы импульсийн тоонд маш итгэлтэй байна.

Одоо энэ бол оролтын дохионы давтамжийг тодорхойлох тооцоолол юм.

Жишээлбэл, бидэнд эдгээр дохио байгаа бөгөөд f-оролтыг хэмжихийг хүсч байна гэж хэлье. Лавлагаа нь кварцын болор осциллятороор үүсгэгдсэн 10 МГц юм. f_input = 31.416 Гц f_reference = 10000000 Гц (10 МГц), хэмжих хугацаа ойролцоогоор. 1 секунд

Энэ хугацаанд бид 32 импульс тоолсон. Одоо энэ дохионы нэг үе нь 1 / 31.416 = 31830.9 uS болно. Тиймээс 32 үе бидэнд 1.0185892 секунд зарцуулсан бөгөөд энэ нь 1 секундээс арай илүү юм.

Энэхүү 1.0186 секундын дотор бид лавлах дохионы 10185892 импульсийг тоолох болно.

Энэ нь бидэнд дараах мэдээллийг өгнө: input_count = 32 reference_count = 10185892 f_reference = 10000000 Гц

Үр дүнгийн давтамжийг тооцоолох томъёо нь: freq = (input_count * f_reference) / ref_count

Бидний жишээнд: f-input = (32 * 10000000) / 10185892 = 31.416 Гц

Энэ нь бага давтамжтай, өндөр давтамжийн хувьд сайн ажилладаг, зөвхөн оролтын дохио нь лавлагааны давтамжтай ойртоход (эсвэл түүнээс ч өндөр) стандарт "хаалгатай" хэмжих аргыг ашиглах нь дээр. Гэхдээ дараа нь бид оролтын дохионд давтамж хуваагч нэмж оруулах боломжтой, учир нь энэ харилцан үйлчлэх арга нь ямар ч давтамжтай ижил нарийвчлалтай байдаг (дахин лавлах хүртэл). Тиймээс та 100 кГц -ийг гадны 1000х хуваагчаас шууд хувааж хэмжих эсэхээс үл хамааран нарийвчлал нь ижил байна.

Алхам 3: Тоног төхөөрөмж ба түүний схем

Тоног төхөөрөмж ба түүний схем
Тоног төхөөрөмж ба түүний схем
Тоног төхөөрөмж ба түүний схем
Тоног төхөөрөмж ба түүний схем

Би ийм төрлийн давтамжийн тоолуурыг хэд хэд хийсэн. Удаан хугацааны өмнө би үүнийг ATMEGA328 (Arduino -тай ижил хянагч), дараа нь ST -ийн ARM микро хянагчаар хийсэн. Хамгийн сүүлийнх нь 168 МГц давтамжтай STM32F407 төхөөрөмжөөр хийгдсэн. Харин одоо би * хамаагүй * жижигхэнтэй адилхан хийвэл яах вэ гэж бодлоо. Би ердөө 2 кбайт FLASH санах ойтой, 128 байт RAM -тай ATTINY2313 -ийг сонгосон. Надад байгаа дэлгэц нь MAX7219 бөгөөд долоон сегмент бүхий 8 дэлгэцтэй бөгөөд эдгээр дэлгэцийг Ebay дээр ердөө 2 еврогоор авах боломжтой. ATTINY2313 -ийг 1.5 еврогоор худалдаж авч болно, миний үлдсэн эд ангиуд нэг ширхэг центээр л зарагддаг. Хамгийн үнэтэй нь хуванцар төслийн хайрцаг байсан байх. Хожим нь би үүнийг лити-ион батерейгаар ажиллуулахаар шийдсэн тул (LDO) 3.3V хүчдэлийн тогтворжуулагчийг цэнэглэх модуль болон батерейг өөрөө нэмэх шаардлагатай болсон. Энэ нь үнийг бага зэрэг өсгөдөг боловч үүнийг 20 еврогоос бага үнээр барих боломжтой гэж бодож байна.

Алхам 4: Код

Код
Код
Код
Код

Кодыг Atmel (Microchip) Studio 7 -той C дээр бичсэн бөгөөд OLIMEX AVR_ISP (clone?) Ашиглан ATTINY2313 програмчлагдсан. Хэрэв та тайлбарыг энд дагахыг хүсвэл доорх zip файл дахь (main.c) -г нээнэ үү.

САНАЛ

Эхлээд ATTINY2313 нь гадаад болор ашиглахаар тохируулагдсан тул дотоод RC-осциллятор нь аливаа зүйлийг хэмжихэд ашиггүй болно. Би жижиг хувьсах конденсатортой 10 000 000 Гц давтамжийг тааруулдаг 10 МГц болор ашигладаг. Эхлүүлэх нь портуудыг оролт, гаралтад тохируулах, таймерыг тохируулах, MAX7219 -ийг таслах, эхлүүлэх боломжийг олгодог. TIMER0 нь гадаад цаг, TIMER1 дотоод цагийг тоолох, мөн D-flipflop-ээс ирдэг ICP-ийн өсөн нэмэгдэж буй ирмэг дээрх тоолуурын утгыг авах тохиргоо юм.

Би хамгийн сүүлд үндсэн програмыг хэлэлцэх болно, тэгээд дараа нь таслах горимууд байна.

TIMER0_OVF

TIMER0 нь 255 (8 бит) хүртэл тоолж, дараа нь 0 болж хувирдаг тул халих тоог тоолохын тулд тасалдал хэрэгтэй болно. Энэ бол TIMER0_OVF -ийн хийдэг зүйл юм, зөвхөн халих тоог тоол. Хожим нь энэ тоог тоолуурын үнэ цэнтэй хослуулсан болно.

TIMER1_OVF

TIMER1 нь 65536 (16 бит) хүртэл тоолж чаддаг тул тасалдал TIMER1_OVF нь халих тоог тоолно. Гэхдээ энэ нь илүү ихийг хийдэг. Энэ нь 152-оос 0 болж буурдаг бөгөөд энэ нь 1 секунд орчим үргэлжилдэг бөгөөд дараа нь гаралтын зүүг байрлуулж, флипфлопын D оролт руу очдог. Энэхүү тасалдлын горимд хийх хамгийн сүүлийн зүйл бол 565 секунд зарцуулдаг 765-аас 0 хүртэл цаг дуусах тоолуурыг багасгах явдал юм.

TIMER1_CAPT

Энэ бол D-flipflop нь дохио илгээх бүрт оролтын дохионы өгсөх ирмэг дээр гарч ирдэг TIMER1_CAPT тасалдал юм (дээр тайлбарласны дагуу). Барих логик нь барьж авах үед TIMER1 тоолуурын утгыг хэмнэхээс гадна тоолуурыг хадгалахаас гадна хадгалдаг. Харамсалтай нь TIMER0 нь оролтыг барих функцгүй тул энд байгаа болон халих тоолуурын одоогийн утгыг уншдаг. Зурвасын хувьсагчийг шинэ програм гэж тохируулахын тулд үндсэн програмыг нэг болгож тохируулсан болно.

Дараа нь MAX7219 -ийг удирдах хоёр функц байна

ТХН

Чипт Universal Serial Interface (USI) байдаг боловч би үүнийг ашиглахгүй байхыг сонгосон. MAX7219 дэлгэцийг SPI -ээр хянах шаардлагатай бөгөөд энэ нь USI -ийн тусламжтайгаар боломжтой юм. Гэхдээ SPI -ийг bitbang хийх нь маш энгийн тул би үүнийг USI -тэй хийх цаг гаргаагүй.

MAX7219

MAX7219 -ийг тохируулах протокол нь гарын авлагыг уншсаны дараа маш энгийн байдаг. Энэ нь цифр бүрийн хувьд 16 битийн утгатай байх ёстой бөгөөд энэ нь орон нутгийн тооны 8 бит (1 -ээс 8 хүртэл), дараа нь харуулах шаардлагатай дугаарын хувьд 8 бит байх ёстой.

ҮНДСЭН ХӨТӨЛБӨР

Хамгийн сүүлд хийх зүйл бол үндсэн програмыг тайлбарлах явдал юм. Энэ нь хязгааргүй гогцоонд ажилладаг (while (1)) боловч зөвхөн тасалдлын горимоос мессеж (1) ирсэн эсвэл цаг дуусах тоолуур тэг хүртэл буусан үед (оролтын дохио байхгүй) л ямар нэгэн зүйл хийдэг.

Хувьсах мессежийг нэг болгож тохируулах үед хийх ёстой хамгийн эхний зүйл бол дохио байгааг бид мэдсэний дараа цаг дуусах тоолуурыг дахин тохируулах явдал юм. D-flipflop-ийг дахин хэмжих цаг дууссаны дараа ирэх дараагийн гоход бэлэн болгохын тулд дахин тохируулна.

Лавлах тоо болон оролтын давтамжийн тоог өгөхийн тулд барих тасалдалд бүртгэгдсэн тоонуудыг нэмж оруулав. (бид лавлагаа хэзээ ч тэг болж болохгүй гэдгийг баталгаажуулах ёстой, учир нь үүнийг дараа нь хуваах болно)

Дараа нь бодит давтамжийг тооцоолох болно. Би ердөө 2 кбайт флаштай, бүхэл тоонуудыг ашигладаг 128 байт хуцтай микроконтроллер дээр хөвөгч тоог ашиглахыг хүсэхгүй байгаа нь лавтай. Гэхдээ давтамж нь 314.159 Гц, хэд хэдэн аравтын бутархайтай байж болно. Тиймээс би оролтын давтамжийг зөвхөн лавлагааны давтамжаар бус үржүүлэгчээр үржүүлээд дараа нь аравтын бутархай байх ёстой газарт тоо нэмнэ. Үүнийг хийснээр эдгээр тоо маш том болно. Жишээлбэл 500 кГц -ийн оролттой, 10 МГц -ийн лавлагаа, 100 -ийн үржүүлэгчтэй бол энэ нь 5 x 10^14 -ийг өгдөг бөгөөд энэ нь үнэхээр асар том юм! Тэд 32 битийн тоонд багтахгүй тул би 64 битийн тоог ашигладаг бөгөөд энэ нь 1.8 x 10^19 хүртэл байдаг (энэ нь ATTINY2313 дээр сайн ажилладаг)

Хамгийн сүүлд хийх ёстой зүйл бол үр дүнг MAX7219 дэлгэц рүү илгээх явдал юм.

Кодыг 1600 байт болгон хөрвүүлдэг тул ATTINY2313 -д байдаг 2048 байтын флэштэй нийцдэг.

Гал хамгаалагчийн бүртгэл дараах байдлаар унших ёстой.

Өргөтгөсөн 0xFF

Өндөр 0xDF

LOW 0xBF

Алхам 5: Нарийвчлал ба нарийвчлал

Нарийвчлал ба нарийвчлал
Нарийвчлал ба нарийвчлал
Нарийвчлал ба нарийвчлал
Нарийвчлал ба нарийвчлал
Нарийвчлал ба нарийвчлал
Нарийвчлал ба нарийвчлал

Нарийвчлал ба нарийвчлал нь хоёр тусдаа араатан юм. Энд байгаа нарийвчлал нь долоон оронтой бөгөөд бодит нарийвчлал нь тоног төхөөрөмж, шалгалт тохируулгаас хамаарна. Би 10 МГц (туршилтын цэг дээр 5 МГц) -ийг GPS -ийн сахилга баттай осциллятортой өөр давтамжийн тоолуураар тохируулсан.

Энэ нь маш сайн ажилладаг, миний туршсан хамгийн бага давтамж нь 0.2 Гц, хамгийн өндөр нь 2 МГц юм. Энэ нь цэг дээр байна. 2 МГц -ээс дээш хянагч тасалдал тасалдаг бөгөөд энэ нь 2 МГц давтамжтай оролтын дохио TIMER0 нь секундэд 7800 гаруй тасалдал үүсгэдэг гэдгийг мэдэх нь гайхалтай биш юм. ATTINY2313 нь бусад зүйлийг хийх ёстой, TIMER1-ийн тасалдал, өөр нэг секундэд 150 тасалдал, мэдээж тооцоолол хийж, дэлгэц, D-flipflop-ийг хянадаг. Бодит төхөөрөмжийг харахад та дэлгэцийн найман цифрээс ердөө долоон хэсгийг л ашиглаж байгааг харах болно. Би үүнийг хэд хэдэн шалтгааны улмаас хийдэг.

Нэгдүгээрт, оролтын давтамжийг тооцоолох нь хуваагдал бөгөөд энэ нь бараг үргэлж үлдэгдэлтэй байх болно, энэ нь бүхэл тоон хуваагдал гэж та харахгүй байна. Хоёрдугаарт, кварцын болор осциллятор нь температурыг тогтворжуулдаггүй.

10 МГц -ийг зөв тааруулдаг конденсаторууд нь керамик бөгөөд температурын өөрчлөлтөд маш мэдрэмтгий байдаг. Дараа нь TIMER0 дээр барих логик байдаггүй бөгөөд тасалдлын функцууд бүгд ажлаа хийхэд хэсэг хугацаа шаардагддаг. Долоон орон ямар ч байсан хангалттай сайн гэж би боддог.

Зөвлөмж болгож буй: