Բովանդակություն:

Բարձր լուծման հաճախականության հաշվիչ ՝ 5 քայլ (նկարներով)
Բարձր լուծման հաճախականության հաշվիչ ՝ 5 քայլ (նկարներով)

Video: Բարձր լուծման հաճախականության հաշվիչ ՝ 5 քայլ (նկարներով)

Video: Բարձր լուծման հաճախականության հաշվիչ ՝ 5 քայլ (նկարներով)
Video: Երեխայի մարմնի 7 ժեստ, որոնք ՊԵՏՔ է իմանա յուրաքանչյուր ծնող 2024, Նոյեմբեր
Anonim

Այս հրահանգը ցույց է տալիս փոխադարձ հաճախությունների հաշվիչ, որն ունակ է արագ և ողջամիտ ճշգրտությամբ չափել հաճախականությունները: Այն պատրաստված է ստանդարտ բաղադրիչներից և կարող է պատրաստվել հանգստյան օրերին (ինձ մի փոքր ավելի երկար տևեց:-))

Խմբագրել. Կոդը այժմ հասանելի է GitLab- ում ՝

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

Քայլ 1. Հին դպրոցի հաճախությունների հաշվարկ

Հին դպրոցի հաճախությունների հաշվարկ
Հին դպրոցի հաճախությունների հաշվարկ
Հին դպրոցի հաճախությունների հաշվարկ
Հին դպրոցի հաճախությունների հաշվարկ

Ազդանշանի հաճախականությունը չափելու հին դպրոցական եղանակն է տրամաբանական AND- դարպասի օգտագործումը, չափվելիք ազդանշանը մի նավահանգստի մեջ դնելը և ազդանշանը ՝ ճշգրիտ 1 վայրկյան արագությամբ մյուս նավահանգստին և հաշվել ելքը: Սա բավականին լավ է գործում մի քանի կՀց հաճախականությամբ ԳՀց ազդանշանների դեպքում: Բայց ի՞նչ անել, եթե ցանկանում եք չափել ցածր հաճախականության ազդանշանը լավ լուծաչափով: Ասացեք, որ ցանկանում եք չափել ցանցի հաճախականությունը (այստեղ 50 Հց): Հին դպրոցի մեթոդով դուք հաջողակ լինելու դեպքում ձեր էկրանին կտեսնեք հաստատուն 50, բայց, ամենայն հավանականությամբ, կտեսնեք, որ ցուցադրիչը փոխվում է 49 -ից 50 -ի կամ 50 -ից 51 -ի: Բանաձևը 1 Հց է, և վերջ: Դուք երբեք չեք տեսնի 50.002 Հց, եթե պատրաստ չեք դարպասի ժամանակը հասցնել 1000 վայրկյանի: Դա ավելի քան 16 րոպե է ՝ մեկ չափման համար:

Frequencyածր հաճախականության ազդանշանները չափելու ավելի լավ միջոց է դրա ժամանակահատվածը չափելը: Էլեկտրական ցանցը կրկին օրինակ վերցնելով, ունի 20 միլիվայրկյան ժամանակաշրջան: Վերցրեք նույն տրամաբանական AND դարպասը, սնուցեք այն, ասենք 10 ՄՀց (0.1 ԱՄՆ իմպուլսներ) և ձեր ազդանշանը մյուս նավահանգստում և դուրս է գալիս 200000 իմպուլս, այնպես որ ժամանակաշրջանը 20000.0 uS է, և դա թարգմանվում է 50 Հց: Երբ դուք չափում եք ընդամենը 199650 իմպուլսներ, հաճախականությունը 50.087 Հց է, դա շատ ավելի լավ է, և դա ընդամենը մեկ վայրկյան չափման ժամանակ է: Unfortunatelyավոք, դա լավ չի աշխատում ավելի բարձր հաճախականությունների դեպքում: Օրինակ ՝ մենք հիմա ուզում ենք չափել 40 կՀց: Նույն 10 ՄՀց մուտքային հաճախականությամբ, ինչպես տեղեկանքը, մենք այժմ չափում ենք ընդամենը 250 իմպուլս: Երբ հաշվում ենք ընդամենը 249 իմպուլս, հաշվարկը տալիս է 40161 Հց, իսկ 251 -ով արդյունքը 39840 Հց է: Դա ընդունելի բանաձև չէ: Իհարկե, հղումների հաճախականության բարձրացումը բարելավում է արդյունքները, բայց կա մի սահմանափակում, թե ինչ կարող եք օգտագործել միկրոկառավարիչում:

Քայլ 2: Փոխադարձ ճանապարհ

Փոխադարձ ճանապարհ
Փոխադարձ ճանապարհ
Փոխադարձ ճանապարհ
Փոխադարձ ճանապարհ

Լուծումը, որն աշխատում է ինչպես ցածր, այնպես էլ ավելի բարձր հաճախականությունների համար, փոխադարձ հաճախությունների հաշվիչ է: Ես կփորձեմ բացատրել դրա սկզբունքը: Դուք սկսում եք չափման ժամանակով, որը կազմում է մոտավորապես 1 վայրկյան, այն չպետք է լինի շատ ճշգրիտ, բայց դա չափման ողջամիտ ժամանակն է: Այս 1 Հց ազդանշանը փոխանցեք D- մուտքի D-flipflop- ի մեջ: Դեռ ոչինչ չի պատահում ելքի (ներ) ի վրա: Միացրեք ազդանշանը, որը ցանկանում եք չափել D-flipflop- ի OCԱՄԱՈՅ մուտքի հետ:

Հենց որ այս ազդանշանը LOW- ից բարձր է դառնում, D-flipflop- ի ելքը D- մուտքի վիճակը փոխանցում է ելքին (Q): Այս RISING ազդանշանը, որն օգտագործվում է, օգտագործվում է մուտքային ազդանշանը, ինչպես նաև տեղեկատու ժամացույցի ազդանշանը հաշվելու համար:

Այսպիսով, դուք հաշվում եք ԵՐԿՈ signals ազդանշան միաժամանակ, ազդանշանը, որը ցանկանում եք չափել և տեղեկատու ժամացույց: Այս տեղեկատու ժամացույցը պետք է ունենա ճշգրիտ արժեք և լինի կայուն, նորմալ բյուրեղյա տատանողը լավ է: Արժեքը այնքան էլ կարևոր չէ, քանի դեռ դա բարձր հաճախականություն է, և դրա արժեքը լավ հայտնի է:

Որոշ ժամանակ անց, ասենք մի քանի միլիվայրկյան, դուք կրկին ցածր եք դարձնում D-flipflop- ի D- մուտքը: CLԱՄԱՈՅ հաջորդ մուտքի ժամանակ Q ելքը հետևում է մուտքի վիճակին, բայց այլ բան տեղի չի ունենում, քանի որ միկրոհսկիչը կարգավորված է արձագանքելու միայն RISING ազդանշանին: Հետո, չափման ժամանակի ավարտից հետո (մոտ 1 վայրկյան) D- մուտքը կատարում եք ԲԱՐՁՐ:

Կրկին ժամացույցի հաջորդ մուտքի ժամանակ Q ելքը հետևում է, և այս RISING ազդանշանը միացնում է միկրոհսկիչը `այս անգամ երկու հաշվիչների հաշվարկը դադարեցնելու համար:

Արդյունքը երկու թիվ է: Առաջին թիվը տեղեկանքից հաշված իմպուլսների թիվն է: Քանի որ մենք գիտենք հղումների հաճախականությունը, մենք գիտենք նաև այն ժամանակը, որը տևեց այդ իմպուլսները հաշվելու համար:

Երկրորդ համարը մեր չափած մուտքային ազդանշանի իմպուլսների թիվն է: Քանի որ մենք սկսեցինք հենց այս ազդանշանի ԱISԵ եզրերին, մենք շատ վստահ ենք այս մուտքային ազդանշանի իմպուլսների քանակի վերաբերյալ:

Այժմ դա ընդամենը հաշվարկ է մուտքային ազդանշանի հաճախականությունը որոշելու համար:

Օրինակ, ենթադրենք, որ մենք ունենք այս ազդանշանները և ցանկանում ենք չափել f- մուտքը: Հղումը 10 ՄՀց է, որը ստեղծվում է քվարցային բյուրեղային տատանման միջոցով: f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), չափման ժամանակը մոտ. 1 վայրկյան

Այս ընթացքում մենք հաշվեցինք 32 իմպուլս: Այժմ, այս ազդանշանի մեկ ժամանակահատվածը տևում է 1 / 31.416 = 31830.9 uS: Այսպիսով, 32 ժամանակահատվածը մեզանից վերցրեց 1,0185892 վայրկյան, ինչը 1 վայրկյանից մի փոքր ավելի է:

Այս 1.0186 վայրկյանում մենք նույնպես կհաշվենք հղման ազդանշանի 10185892 իմպուլսը:

Սա մեզ տալիս է հետևյալ տեղեկությունները. Input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Ստացված հաճախականությունը հաշվարկելու բանաձևը սա է `հաճախականություն = (մուտքագրման_հաշիվ * f_reference) / ref_count

Մեր օրինակում սա է `f-input = (32 * 10000000) / 10185892 = 31.416 Հց

Եվ սա լավ է աշխատում ինչպես ցածր հաճախականությունների, այնպես էլ բարձր հաճախությունների դեպքում, միայն այն դեպքում, երբ մուտքային ազդանշանը մոտենում է (կամ նույնիսկ ավելի բարձր) հղման հաճախականությանը, ավելի լավ է օգտագործել չափման ստանդարտ «դարպասավոր» եղանակը: Բայց հետո մենք կարող ենք պարզապես մուտքագրման ազդանշանին ավելացնել հաճախականության բաժանարար, քանի որ այս փոխադարձ մեթոդը նույն հաճախականությունն ունի ցանկացած հաճախականության համար (կրկին մինչև հղումը): Այսպիսով, անկախ նրանից, թե դուք չափում եք 100 կՀց ուղղակիորեն բաժանված արտաքին 1000x բաժանարարով, լուծումը նույնն է:

Քայլ 3. Սարքավորումը և դրա սխեմատիկ պատկերը

Սարքավորումը և դրա սխեմատիկ պատկերը
Սարքավորումը և դրա սխեմատիկ պատկերը
Սարքավորումը և դրա սխեմատիկ պատկերը
Սարքավորումը և դրա սխեմատիկ պատկերը

Ես պատրաստել եմ այս տեսակի հաճախությունների հաշվիչներից մի քանիսը: Շատ վաղուց ես պատրաստեցի ATMEGA328- ով (նույն կարգավորիչը, ինչ կա Arduino- ում), հետագայում ST- ի ARM միկրոկառավարիչներով: Ամենավերջինը պատրաստվել է 168 ՄՀց հաճախականությամբ STM32F407- ով: Բայց հիմա ես մտածեցի, թե ինչ անեմ, եթե նույնը անեմ * շատ ավելի փոքր մեկի հետ: Ես ընտրեցի ATTINY2313- ը, որն ունի ընդամենը 2 կբայթ FLASH հիշողություն և 128 բայթ RAM: Էկրանը, որն ունեմ, MAX7219 է, որի վրա տեղադրված է 8 յոթ հատվածային էկրան: Այս ցուցադրումները մատչելի են Ebay- ում ընդամենը 2 եվրոյով: ATTINY2313- ը կարելի է գնել մոտ 1,5 եվրոյով, մնացած մասերը, որոնք ես օգտագործել եմ, արժեն ընդամենը մեկ կտոր ցենտ: Ամենաթանկը, հավանաբար, պլաստիկ նախագծի տուփն էր: Հետագայում ես որոշեցի այն դարձնել լիթիում-իոնային մարտկոցով, ուստի անհրաժեշտ էր ավելացնել (LDO) 3.3 Վ լարման կայունացուցիչ մարտկոցի լիցքավորման մոդուլ և մարտկոցը: Սա որոշ չափով բարձրացնում է գինը, բայց ես ենթադրում եմ, որ այն կարող է կառուցվել 20 եվրոյից պակաս:

Քայլ 4: Կոդ

Օրենսգիրքը
Օրենսգիրքը
Օրենսգիրքը
Օրենսգիրքը

Կոդը գրվել է C- ով ՝ Atmel (Microchip) Studio 7 -ով և ծրագրավորված ATTINY2313- ով ՝ օգտագործելով OLIMEX AVR_ISP (կլոն): Բացեք (main.c) ստորև նշված zip ֆայլում, եթե ցանկանում եք նկարագրությանը հետևել այստեղ:

ԻՆԻՏԱԼԻZԱԻՈՄ

Սկզբում ATTINY2313- ը սահմանեց օգտագործել արտաքին բյուրեղ, քանի որ ներքին RC- տատանումն անօգուտ է որևէ բան չափելու համար: Ես օգտագործում եմ 10 ՄՀց բյուրեղ, որը միացնում եմ ճիշտ 10 000 000 Հց հաճախականությանը փոքր փոփոխական կոնդենսատորով: Նախաստորագրումը հոգ է տանում մուտքերի և ելքերի նավահանգիստների կարգավորմանը, ժամաչափերի կարգավորմանը և MAX7219- ի ընդհատումների և սկզբնավորման հնարավորության մասին: TIMER0- ը կարգավորված է արտաքին ժամացույցը հաշվելու համար, TIMER1- ը `ներքին ժամացույցը, ինչպես նաև հաշվիչի արժեքը ICP- ի աճող եզրին, որը գալիս է D-flipflop- ից:

Ես վերջնականապես կքննարկեմ հիմնական ծրագիրը, ուստի հաջորդը ընդհատման ռեժիմներն են:

TIMER0_OVF

Քանի որ TIMER0- ը հաշվում է մինչև 255 (8 բիթ), այնուհետև գլորվում է 0 -ի, մեզ անհրաժեշտ է ընդհատում `հոսքերի քանակը հաշվելու համար: Դա այն ամենն է, ինչ անում է TIMER0_OVF- ը, պարզապես հաշվեք արտահոսքի թիվը: Հետագայում այս թիվը զուգակցվում է բուն հաշվիչի արժեքի հետ:

TIMER1_OVF

TIMER1- ը կարող է հաշվել մինչև 65536 (16 բիթ), ուստի ընդհատումը TIMER1_OVF- ն նաև հաշվում է արտահոսքի քանակը: Բայց դա ավելին է անում: Այն նաև նվազում է 152-ից 0-ի համար, ինչը տևում է մոտ 1 վայրկյան, այնուհետև սահմանում է ելքային փին ՝ անցնելով մատնահետքի D- մուտքին: Եվ վերջին բանը, որ արվում է այս ընդհատվող ռեժիմում, դա ժամանակի հաշվիչի նվազեցումն է `765-ից հասնելով 0-ի, ինչը տևում է մոտ 5 վայրկյան:

TIMER1_CAPT

Սա TIMER1_CAPT ընդհատումն է, որը գործարկվում է ամեն անգամ, երբ D-flipflop- ն այն ազդանշան է ուղարկում մուտքային ազդանշանի բարձրացող եզրին (ինչպես վերը բացատրված է): Գրավման տրամաբանությունը հոգ է տանում TIMER1 հաշվիչի արժեքը պահելու պահին, այն պահվում է, ինչպես նաև գերհոսքի հաշվիչը: Unfortunatelyավոք, TIMER0- ը չունի մուտքի գրավման գործառույթ, ուստի այստեղ ընթերցվում է նրա ընթացիկ արժեքը և արտահոսքի հաշվիչի ընթացիկ արժեքը: Հաղորդագրության փոփոխականը սահմանվում է մեկի համար `հիմնական ծրագրի համար` ասելով, որ դրանք նոր տվյալներ են:

Հաջորդը MAX7219- ի կառավարման երկու գործառույթ է

SPI

Չիպում առկա է ունիվերսալ սերիական ինտերֆեյս (USI), որը ես նախընտրեցի չօգտագործել: MAX7219 էկրանը պետք է վերահսկվի SPI- ի միջոցով, և դա հնարավոր է USI- ի միջոցով: Բայց bitbanging SPI- ն այնքան պարզ է, որ ես ժամանակ չեմ տրամադրել դա անել USI- ով:

MAX7219

MAX7219- ի տեղադրման արձանագրությունը նույնպես բավականին պարզ է, երբ կարդաք դրա ձեռնարկը: Այն պետք է 16 բիթանոց արժեք յուրաքանչյուր նիշի համար, որը բաղկացած է թվանշանի համար 8 բիթից (1 -ից 8 -ը), որին հաջորդում է 8 բիթ `այն ցուցադրելու համար անհրաժեշտ թվին:

ՀԻՄՆԱԿԱՆ PROՐԱԳԻՐ

Վերջին բանը `հիմնական ծրագրի բացատրությունն է: Այն աշխատում է անսահմանափակ հանգույցով (մինչդեռ (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

OWԱOWՐ 0xBF

Քայլ 5: uracyշգրտություն և ճշգրտություն

Շգրտություն և ճշգրտություն
Շգրտություն և ճշգրտություն
Շգրտություն և ճշգրտություն
Շգրտություն և ճշգրտություն
Uracyշգրտություն և ճշգրտություն
Uracyշգրտություն և ճշգրտություն

Accշգրտությունն ու ճշգրտությունը երկու առանձին գազաններ են: Այստեղ ճշգրտությունը յոթ նիշ է, իսկ իրական ճշգրտությունը կախված է սարքավորումից և չափագրումից: Ես չափագրեցի 10 ՄՀց (փորձարկման կետում 5 ՄՀց) մեկ այլ հաճախականության հաշվիչով, որն ունի GPS կարգապահ տատանում:

Եվ դա բավականին լավ է աշխատում, ամենացածր հաճախականությունը, որը ես փորձել եմ, 0,2 Հց է, ամենաբարձրը ՝ 2 ՄՀց: Այն տեղում է: 2 ՄՀց -ից բարձր կարգավարը սկսում է կորցնել ընդհատումները, իսկական զարմանալի չէ, երբ գիտես, որ 2 ՄՀց մուտքային ազդանշանի դեպքում TIMER0- ը մեկ վայրկյանում առաջացնում է ավելի քան 7800 ընդհատում: Եվ ATTINY2313- ը պետք է անի նաև այլ բաներ, ընդմիջումները TIMER1- ից, ևս 150 ընդմիջում վայրկյանում և, իհարկե, կատարի հաշվարկները `վերահսկելով ցուցադրումը և D-flipflop- ը: Երբ նայեք իրական սարքին, կտեսնեք, որ ես օգտագործում եմ ցուցադրման ութ թվանշանից ընդամենը յոթը: Ես դա անում եմ մի քանի պատճառով:

Առաջինն այն է, որ մուտքագրման հաճախականության հաշվարկը բաժանում է, այն գրեթե միշտ կունենա մնացորդ, որը դուք չեք տեսնում, քանի որ դա ամբողջ թիվ է: Երկրորդն այն է, որ քվարցային բյուրեղային տատանումները ջերմաստիճանի կայունացված չեն:

Այն կոնդենսատորները, որոնք այն կարգավորում են ճիշտ 10 ՄՀց հաճախականությամբ, կերամիկական են, շատ զգայուն են ջերմաստիճանի փոփոխությունների նկատմամբ: Այնուհետև կա այն փաստը, որ TIMER0- ը չունի գրավման տրամաբանություն, և ընդհատման գործառույթներին բոլորը ժամանակ են պահանջում իրենց աշխատանքը կատարելու համար: Կարծում եմ, որ ամեն դեպքում յոթ թվանշանը բավական լավ է:

Խորհուրդ ենք տալիս: