Мазмұны:

Жоғары ажыратымдылықты есептегіш: 5 қадам (суреттермен)
Жоғары ажыратымдылықты есептегіш: 5 қадам (суреттермен)

Бейне: Жоғары ажыратымдылықты есептегіш: 5 қадам (суреттермен)

Бейне: Жоғары ажыратымдылықты есептегіш: 5 қадам (суреттермен)
Бейне: Күйеуің қаласа да алма! Минет жасаудың қауптілігі қандай? Ауызға беру! Минет жасау! 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 миллисекунд. Дәл сол логикалық AND-шлюзін алыңыз, оны 10 МГц (мысалы, 0,1 импульс) беріңіз және басқа порттағы сигналыңыз 200000 импульсті шығарады, сондықтан кезең 20000,0 uS құрайды және ол 50 Гц-ке айналады. Сіз тек 199650 импульсін өлшегенде жиілігі 50.087 Гц құрайды, бұл әлдеқайда жақсы және ол бір секундтық өлшеу уақытында. Өкінішке орай, бұл жоғары жиіліктермен жақсы жұмыс істемейді. Мысалы, біз қазір 40 кГц өлшегіміз келеді. Анықтама ретінде 10 МГц кіріс жиілігімен біз қазір тек 250 импульсті өлшейміз. Біз тек 249 импульсті есептегенде, есептеу 40161 Гц береді, ал 251 кезінде 39840 Гц. Бұл қабылданатын шешім емес. Әрине, анықтамалық жиілікті жоғарылату нәтижені жақсартады, бірақ микро контроллерде қолдануға болатын шектеулер бар.

2 -қадам: өзара жол

Қайтымды жол
Қайтымды жол
Қайтымды жол
Қайтымды жол

Төмен жиілікте де, жоғары жиілікте де жұмыс істейтін шешім - кері жиілікті санауыш. Мен оның принципін түсіндіруге тырысамын. Сіз өлшеу уақытын шамамен 1 секундтан бастайсыз, бұл өте дәл болмауы керек, бірақ бұл өлшеу үшін ақылға қонымды уақыт. Бұл 1 Гц сигналды D кірісіне D-флипфлопқа беріңіз. Шығармаларда әлі ештеңе болмайды. Өлшегіңіз келетін сигналды D-флипфлоптың CLOCK кірісіне қосыңыз.

Бұл сигнал LOW-дан HIGH-ға ауысқан кезде, D-flipflop шығысы D-кірісінің күйін шығысқа (Q) береді. Бұл RISING сигналы кіріс сигналын, сонымен қатар анықтамалық сағат сигналын санауды бастау үшін қолданылады.

Сонымен, сіз бір уақытта ЕКІ сигналды, өлшегіңіз келетін сигналды және анықтамалық сағатты санап отырсыз. Бұл анықтамалық сағат нақты мәнге ие және тұрақты болуы керек, қалыпты кристалды осциллятор жақсы. Мән өте маңызды емес, өйткені ол жоғары жиілікте және оның мәні жақсы белгілі.

Біраз уақыттан кейін, айталық, бірнеше миллисекунд, сіз D-флипфлоптың D-кірісін қайтадан төмендетесіз. Келесі CLOCK-кірісінде Q шығысы кіріс жағдайына сәйкес келеді, бірақ басқа ештеңе болмайды, себебі микроконтроллер тек RISING сигналына жауап береді. Содан кейін, өлшеу уақыты аяқталған соң (шамамен 1 секунд) сіз D кірісін ЖОҒАРЫ етіп жасайсыз.

Келесі CLOCK-кірісінде 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 кГц -ты сыртқы 1000x бөлгішпен тікелей бөлетін болсаңыз да, ажыратымдылық бірдей.

3 -қадам: Жабдық және оның схемасы

Аппараттық құралдар және оның схемасы
Аппараттық құралдар және оның схемасы
Аппараттық құралдар және оның схемасы
Аппараттық құралдар және оның схемасы

Мен жиіліктің есептегіштерінің бірнеше түрін жасадым. Ұзақ уақыт бұрын мен оны ATMEGA328 (Arduino -дегідей контроллер), кейіннен ST -ден ARM микроконтроллерлерімен жасадым. Ең соңғысы 168 МГц жиілігіндегі STM32F407 көмегімен жасалды. Бірақ енді мен * әлдеқайда кішісімен де осылай жасасам не болады деп ойладым. Мен тек 2 кбайт FLASH жады мен 128 байт жедел жады бар ATTINY2313 таңдадым. Менде бар MAX7219 дисплейі, сегіз сегментті дисплейі бар, бұл дисплейлер Ebay -де бар -жоғы 2 еуроға қол жетімді. ATTINY2313 -ті 1,5 евроға сатып алуға болады, қалған бөлшектердің бағасы бір центке ғана тұрады. Ең қымбат пластикалық қорап болды. Кейінірек мен оны литий-ионды аккумулятормен жұмыс істеуге шешім қабылдадым, сондықтан мен (LDO) 3.3В кернеу тұрақтандырғышын батареяны зарядтау модулін және батареяның өзін қосуым керек болды. Бұл бағаны біршама жоғарылатады, бірақ менің ойымша, оны 20 евродан төмен салуға болады.

4 -қадам: Кодекс

Кодекс
Кодекс
Кодекс
Кодекс

Код C Atmel (Microchip) Studio 7 -мен жазылған және OLIMEX AVR_ISP (клон?) Көмегімен ATTINY2313 -ке бағдарламаланған. Төмендегі zip файлындағы (main.c) ашыңыз, егер сіз мұнда сипаттаманы ұстанғыңыз келсе.

БАСТАУ

Алдымен ATTINY2313 сыртқы кристалды қолдануға арналған, себебі ішкі RC-осцилляторы ештеңені өлшеуге жарамсыз. Мен кіші айнымалы конденсатормен 10 000 000 Гц жиілікті дұрыс реттейтін 10 МГц кристалын қолданамын. Инициализация порттарды кірістер мен шығуларға орнатуға, таймерлерді орнатуға және MAX7219 үзілістерін және инициализациясына мүмкіндік береді. TIMER0-бұл сыртқы сағатты, TIMER1 ішкі сағатты санауға, сонымен қатар D-флипфлоптан келетін ICP көтерілетін жиегіндегі есептегіштің мәнін түсіруге арналған.

Мен негізгі бағдарламаны соңғы рет талқылаймын, келесіде үзіліс тәртібі.

TIMER0_OVF

TIMER0 255 (8 бит) дейін есептеп, содан кейін 0 -ге ауысқанда, толып кетулер санын санау үшін бізге үзіліс қажет. Бұл тек TIMER0_OVF жасайды, тек толып кету санын есептеңіз. Кейін бұл сан есептегіштің мәнімен біріктіріледі.

TIMER1_OVF

TIMER1 65536 (16 бит) дейін санауы мүмкін, сондықтан TIMER1_OVF үзілуі толып кету санын да есептейді. Бірақ ол көбірек жасайды. Ол сондай-ақ 152-ден 0-ге дейін азаяды, ол шамамен 1 секундқа созылады, содан кейін флипфлоптың D-кірісіне шығатын түйреуішті орнатады. Бұл үзіліс тәртібінде жасалатын соңғы нәрсе-бұл 5 секундқа созылатын 765-тен 0-ге дейінгі тайм-таймерді азайту.

TIMER1_CAPT

Бұл D-flipflop сигнал жіберген сайын, кіріс сигналының көтерілу жиегінде (жоғарыда түсіндірілгендей) іске қосылатын TIMER1_CAPT үзілісі. Түсіру логикасы TIMER1 есептегішінің түсірілу сәтіндегі мәнін сақтауға қамқорлық жасайды, ол сонымен қатар толып кететін есептегіш ретінде сақталады. Өкінішке орай, TIMER0 -де кіріс түсіру функциясы жоқ, сондықтан оның ағымдағы мәні мен толып кету санауышының ағымдағы мәні оқылады. Хабарламаның айнымалы мәні-бұл жаңа бағдарлама екенін айту үшін оның негізгі бағдарламасы.

Бұдан әрі MAX7219 басқару үшін екі функция бар

SPI

Чипте әмбебап сериялық интерфейс (USI) бар болса да, мен оны пайдаланбауды жөн көрдім. MAX7219 дисплейі SPI арқылы басқарылуы керек және бұл USI көмегімен мүмкін. Бірақ SPI -ді жіберу соншалықты қарапайым, мен оны USI -мен жасауға уақыт жұмсамадым.

MAX7219

MAX7219 -ді орнату хаттамасы нұсқаулықты оқығаннан кейін өте қарапайым. Ол әр цифр үшін 16 биттік мәнді қажет етеді, ол цифрлық сан үшін 8 биттен тұрады (1 -ден 8 -ге дейін), содан кейін оны көрсету үшін 8 биттен тұрады.

НЕГІЗГІ БАҒЫТ

Соңғы нәрсе - негізгі бағдарламаны түсіндіру. Ол шексіз циклде жұмыс істейді ((1)), бірақ үзіліс тәртібінен хабар (1) болғанда немесе күту уақыты есептегіші нөлге дейін төмендегенде (кіріс сигналы жоқ) бірдеңе жасайды.

Айнымалы хабарлама бір мәнге қойылған кезде жасалатын бірінші нәрсе - сигналдың бар екенін білетіндіктен, күту уақытының есептегішін қалпына келтіру. D-флипфлоп оны өлшеу уақытынан кейін келетін секундтық триггерге дайын болу үшін қалпына келтіріледі (секунд күтіңіз).

Түсіру үзілісінде тіркелген сандар сілтеме санын және кіріс жиілігін санау үшін қосылады. (біз сілтеме ешқашан нөлге тең болмайтынына көз жеткізуіміз керек, өйткені біз оны кейін бөлеміз)

Келесі - нақты жиілікті есептеу. Мен, әрине, тек 2 кбайт флэш және 128 байт коэффициенті бар микроконтроллерде өзгермелі сандарды қолданғым келмейді, мен бүтін сандарды қолданамын. Бірақ жиіліктер 314.159 Гц болуы мүмкін, бірнеше ондықтармен. Сондықтан мен кіріс жиілігін тек сілтеме жиілігімен ғана емес, сонымен қатар мультипликатормен көбейтемін, содан кейін ондық бөлшек өтетін жерге санды қосамын. Сіз мұны жасаған кезде бұл сандар өте үлкен болады. Мысалы, 500 кГц кірісімен, 10 МГц анықтамасымен және 100 мультипликаторымен бұл 5 x 10^14 береді, бұл өте үлкен! Олар 32 биттік санға сәйкес келмейді, сондықтан мен 1,8 x 10^19 дейін болатын 64 биттік нөмірлерді қолданамын (бұл ATTINY2313 -те жақсы жұмыс істейді)

Ең соңғы нәрсе - нәтижені MAX7219 дисплейіне жіберу.

Код 1600 байтты құрайды, сондықтан ол ATTINY2313 -те қол жетімді 2048 байт флэшке сәйкес келеді.

Сақтандырғыштар келесідей оқылуы керек:

Ұзартылған 0xFF

ЖОҒАРЫ 0xDF

LOW 0xBF

5 -қадам: дәлдік пен дәлдік

Дәлдік пен дәлдік
Дәлдік пен дәлдік
Дәлдік пен дәлдік
Дәлдік пен дәлдік
Дәлдік пен дәлдік
Дәлдік пен дәлдік

Дәлдік пен дәлдік - бұл екі бөлек аң. Мұндағы дәлдік - жеті сан, нақты дәлдік аппараттық құрал мен калибрлеуге байланысты. Мен GPS дисциплиналы осцилляторы бар басқа жиіліктік есептегішпен 10 МГц (сынақ нүктесінде 5 МГц) калибрледім.

Және бұл өте жақсы жұмыс істейді, мен қолданған ең төменгі жиілік 0,2 Гц, ең жоғары 2 МГц. Ол орнында. 2 МГц -тен жоғары контроллер үзіліс жасай бастайды, бұл 2 МГц кіріс сигналында TIMER0 секундына 7800 -ден астам үзіліс тудыратынын білсеңіз, бұл таңқаларлық емес. ATTINY2313 басқа нәрселерді де жасауы керек, TIMER1 үзілістері, секундына тағы 150 үзіліс және әрине дисплей мен D-флипфлопты басқара отырып, есептеулер жасайды. Нақты құрылғыны қараған кезде, мен дисплейдің сегіз санының жетеуін ғана қолданатынымды көресіз. Мен мұны бірнеше себептермен жасаймын.

Біріншіден, кіріс жиілігін есептеу - бұл бөлу, оның қалдығы әрқашан болады, сіз оны көре алмайсыз, себебі бұл бүтін сан. Екіншіден, кварц кристалды осцилляторы температураны тұрақтандырмайды.

Оны 10 МГц -ке дәл реттейтін конденсаторлар керамикалық, температураның өзгеруіне өте сезімтал. Содан кейін TIMER0 -де түсіру логикасы жоқ және үзіліс функциялары өз жұмысын орындауға біраз уақыт кетеді. Менің ойымша, жеті сан жеткілікті жақсы.

Ұсынылған: