Բովանդակություն:
- Քայլ 1. Հին դպրոցի հաճախությունների հաշվարկ
- Քայլ 2: Փոխադարձ ճանապարհ
- Քայլ 3. Սարքավորումը և դրա սխեմատիկ պատկերը
- Քայլ 4: Կոդ
- Քայլ 5: uracyշգրտություն և ճշգրտություն
Video: Բարձր լուծման հաճախականության հաշվիչ ՝ 5 քայլ (նկարներով)
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:45
Այս հրահանգը ցույց է տալիս փոխադարձ հաճախությունների հաշվիչ, որն ունակ է արագ և ողջամիտ ճշգրտությամբ չափել հաճախականությունները: Այն պատրաստված է ստանդարտ բաղադրիչներից և կարող է պատրաստվել հանգստյան օրերին (ինձ մի փոքր ավելի երկար տևեց:-))
Խմբագրել. Կոդը այժմ հասանելի է 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շգրտություն և ճշգրտություն
Accշգրտությունն ու ճշգրտությունը երկու առանձին գազաններ են: Այստեղ ճշգրտությունը յոթ նիշ է, իսկ իրական ճշգրտությունը կախված է սարքավորումից և չափագրումից: Ես չափագրեցի 10 ՄՀց (փորձարկման կետում 5 ՄՀց) մեկ այլ հաճախականության հաշվիչով, որն ունի GPS կարգապահ տատանում:
Եվ դա բավականին լավ է աշխատում, ամենացածր հաճախականությունը, որը ես փորձել եմ, 0,2 Հց է, ամենաբարձրը ՝ 2 ՄՀց: Այն տեղում է: 2 ՄՀց -ից բարձր կարգավարը սկսում է կորցնել ընդհատումները, իսկական զարմանալի չէ, երբ գիտես, որ 2 ՄՀց մուտքային ազդանշանի դեպքում TIMER0- ը մեկ վայրկյանում առաջացնում է ավելի քան 7800 ընդհատում: Եվ ATTINY2313- ը պետք է անի նաև այլ բաներ, ընդմիջումները TIMER1- ից, ևս 150 ընդմիջում վայրկյանում և, իհարկե, կատարի հաշվարկները `վերահսկելով ցուցադրումը և D-flipflop- ը: Երբ նայեք իրական սարքին, կտեսնեք, որ ես օգտագործում եմ ցուցադրման ութ թվանշանից ընդամենը յոթը: Ես դա անում եմ մի քանի պատճառով:
Առաջինն այն է, որ մուտքագրման հաճախականության հաշվարկը բաժանում է, այն գրեթե միշտ կունենա մնացորդ, որը դուք չեք տեսնում, քանի որ դա ամբողջ թիվ է: Երկրորդն այն է, որ քվարցային բյուրեղային տատանումները ջերմաստիճանի կայունացված չեն:
Այն կոնդենսատորները, որոնք այն կարգավորում են ճիշտ 10 ՄՀց հաճախականությամբ, կերամիկական են, շատ զգայուն են ջերմաստիճանի փոփոխությունների նկատմամբ: Այնուհետև կա այն փաստը, որ TIMER0- ը չունի գրավման տրամաբանություն, և ընդհատման գործառույթներին բոլորը ժամանակ են պահանջում իրենց աշխատանքը կատարելու համար: Կարծում եմ, որ ամեն դեպքում յոթ թվանշանը բավական լավ է:
Խորհուրդ ենք տալիս:
CMOS Հաճախականության հաշվիչ `3 քայլ
CMOS Հաճախականության հաշվիչ. Սա ուղեցույց է `ներառված PDF- ներով և լուսանկարներով, թե ինչպես եմ ես նախագծել իմ սեփական հաճախականությունների հաշվիչը` զվարճալի տրամաբանությունից դուրս: Ես ամբողջությամբ չեմ մանրամասնի, թե ինչպես եմ պատրաստել վարագույրները կամ ինչպես պետք է այն միացնել, բայց սխեմաները պատրաստված են KICAD- ով, որը փափուկ է
Բարձր լուծման տեսախցիկ ՝ 9 քայլ (նկարներով)
Բարձր լուծման տեսախցիկ. Որոշ տարիներ ես օգտագործում էի RPi վրա հիմնված տեսախցիկ (PiCam մոդուլով): Ստեղծված պատկերները ամեն ինչ կարգին էին, բայց այն ժամանակ եկավ մի պահ, երբ ես այլևս գոհ չէի որակից: Ես որոշեցի պատրաստել բարձրորակ վեբ-տեսախցիկ: Հետևյալ հատվածները
Բարձր լուծման PWM ազդանշանի ստեղծում RC սերվերների համար STM32 սարքերով `3 քայլ
Բարձր լուծման PWM ազդանշանի ստեղծում RC սերվերների համար STM32 սարքերով. Ներկայումս ես կառուցում եմ RC հաղորդիչ/ընդունիչ ՝ հիմնված SX1280 RF չիպի վրա: Projectրագրի նպատակներից մեկն այն է, որ ես ուզում եմ 12 բիթանոց servo լուծում ձողիկներից մինչև սերվոներ: Մասամբ այն պատճառով, որ ժամանակակից թվային սերվերն ունեն 12 բիթանոց ռեսո
Ինչպես չափել բարձր հաճախականության և աշխատանքային ցիկլը միաժամանակ ՝ միկրոկոնտրոլերի միջոցով. 4 քայլ
Ինչպես չափել բարձր հաճախականության և աշխատանքային ցիկլը ՝ միաժամանակ ՝ միկրոկոնտրոլերի օգնությամբ. Ես գիտեմ, թե ինչ եք մտածում. Կան բազմաթիվ հրահանգներ, թե ինչպես օգտագործել միկրոկառավարիչները ազդանշանի հաճախականությունը չափելու համար: Հորանջում. &Quot; Բայց սպասեք, այս նորամուծությունը կա. Ես նկարագրում եմ հաճախականությունները չափելու միկրոից բարձր
Ինչպես ստանալ բարձր լուծման պատկերներ հրահանգներից. 4 քայլ
Ինչպե՞ս ստանալ բարձր լուծման պատկերներ հրահանգներից. Դուք իսկապես վայելե՞լ եք այդ ուսանելի նկարը և ցանկանում եք պահպանել դրա բարձրորակ պատճենը: Այս հիանալի փոքրիկ հատկությունը հեշտությամբ անտեսվում է