|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 2:27 pm
| Автор |
Съобщение |
|
ikarlo
Ранг: Ориентиран
Регистриран на: Пон Авг 24, 2020 4:45 pm Мнения: 214 Местоположение: София, Люлин 3
|
 Относно честотомер с PIC
Здравейте, Всички! Въпросите около PIC-честотомерите са препълнили нета, пък и тук чат-пат е ставало дума за тях. Да припомня: става въпрос за класическия пример, даден още в application note на Microchip (AN592). Съществуват десетки (ако не и стотици) разновидности на този честотомер (с LED 7-сегментна и LCD индикация). Всички използват четвъртия вход на PORT A, който е вход на 8-битовия тайер 0 и има вграден предварителен делител (прескалер), който позволява да се броят импулси с честота до 50MHz, което е в пъти повече от собствената честота на микроконтролера. При максимален коефициент на делене на прескалера може да се натрупа числото 65535, т.е. разполага се с 5 десетични разряда. За да се осигури висока разрешаваща способност се използва автоматична смяна на базовия интервал, така че да се измерват честоти от 10Hz (примерно) до 50MHz. В нета има представени честотомери от този вид с брой на разряди до 8 - 10 десетични знака, но не открих (може би не съм търсил достатъчно) код за тяхното получаване. В същност изпробвах няколко hex файла без успех. Това ме накара да се захвана и да опитам няколко варианта, така че да постигна поне 8 десетични знака, което позволява, например, да се направи скала за свързочен приемник без превключване на обхати и с достатъчна разрешаваща способност. Използвах техниката на прекъсванията при препълване на таймера. За целта трябваше да направя следните сметки: с колко време разполагам за обработване на прекъсването, така че да не се променя базовия интервал и да се влошава точността? При 50MHz числото 65535 се набира за 1,64mS, т.е. кода за обработка на прекъсванията не трябва да бъде по-дълъг. Тъй като са достатъчни за 4 - 5 реда код, микроконтролера дори при 4MHz кварц, ще ги "глътне" за не повече от 10uS, което е предостатъчно. Това е за допълнителен 8-битов файл, т.е. общия брояч става от 16 на 24 бита. Нищо не пречи, да се добавят още 8 бита, до 32 бита общо, само че тогава прекъсването трябва да проверява дали се препълват добавените 8 бита. Но дори и в този случай, времето за обработване е напълно достатъчно. Лично мен ме задоволява и 24 битово число (десетично 16777215), което при базов интервал от 0.1S дава обхват до 150MHz с разрешаваща способност 10Hz. Ето фрагменти от програмата, които задължително трябва да присъстват: ; * * * Impulse macro bsf FR_CNTRL,IMP; NOP ; NOP ; bcf FR_CNTRL,IMP; endm ;
org 0 goto Start ; org 4 goto INTRPT_serv ; ; Start call Init ; * * * Count CLRF FREQ_Lo ; Clear files for FREQ clrf FREQ_Md ; clrf FREQ_Hi ; CALL Set_TIMER0 ; BSF FR_CNTRL,CE ; Enable count CALL TimeBase ; BCF FR_CNTRL,CE ; Disable Count CLRF INTCON ; RETURN ; ; * * * AppendCount MOVF TMR0,w ; Write value in Timer0 in COUNT_Md MOVWF FREQ_Md ; movlw 0xFF ; movwf APPCNT ; ; Loop1 Impulse ; Inc Timer0 until TMR0 change value decf APPCNT,f ; movf TMR0,w ; subwf FREQ_Md,w ; Check change TMR0 btfsc STATUS,C ; GOTO Loop1 ; ; movf APPCNT,w ; movwf FREQ_Lo ; Add w to COUNT_Lo incf FREQ_Lo,f ; return ; ; * * * Set_TIMER0 BCF STATUS,RP0 ; clrf APPCNT ; CLRF TMR0 ; CLRF INTCON ; BSF INTCON,T0IE ; BSF INTCON,GIE ; BCF INTCON,T0IF ; RETURN ; * * * INTRPT_serv BCF INTCON,T0IF ; INCF FREQ_Hi,f ; Inc Hi-byte when TMR0 overflow RETFIE ; ; * * * End Където FREQ_Lo, FREQ_Md и FREQ_Hi са трите части на брояча (в обявлението на променливите, тези трите трябва да са един блок в същия ред за да работи правилно преобразуването от бинарен в десетичен код), FR_CNTRL,CE е порта на микроконтролера, разрешаващ и спиращ броенето, APPCNT е помощна променлива за извличане съдържанието на прескалера. Не харесвам писането на "С" за прости програми, защото много се раздува програмната памет, затова си пиша "дърводелски" на асемблер. Пък и тук е важна идеята, а не самия код. Ако експериментирате, успех!
|
| Пон Май 08, 2023 10:42 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Относно честотомер с PIC
Не ми стана много ясно какъв е въпросът, но при честотомерите на първо място е подхода на измерване. Повечето примери които съм виждал са за най-просто измерване с един брояч. Това работи при висока честота но не работи при ниска. При ниска правилният подход е да мериш период. За целта имаш два брояча, единия брои периодите на сигнала, другия брои импулси от еталонен източник, след това е проста математика. Така получаваш константна точност в целия диапазон, дори и при малко време за измерване. Другия проблем с използването на пикове и като цяло контролери е от една страна ниската работна честота на броячите, а от друга трябва да вземеш в предвид спецификата, кога всъщност брояча инкрементва, дали е синхронно с такта, или е изцяло асинхронно. Всичко останало не е проблем, ако искаш може да имаш и 100 битов брояч, това е въпрос на софтуер.
|
| Пон Май 08, 2023 4:05 pm |
|
 |
|
ikarlo
Ранг: Ориентиран
Регистриран на: Пон Авг 24, 2020 4:45 pm Мнения: 214 Местоположение: София, Люлин 3
|
 Re: Относно честотомер с PIC
Нали писах, че при ПИКовете се разчита на бързия делител на входа (до 50MHz), който, обаче, не може да се чете директно. Затова се налага да се допълват импулси до първа промяна в съдържанието на TMR0, като се взема числото FF-N, където N е броя на допълнителните импулси (това става в AppendCount). В моя пример направо изваждам импулси от хекс числото FF и получавам търсения брой (обратно броене). В примера на Microchip се брои от 0 до N и се използва командата COMPF, която дава търсения брой импулси. Съгласен съм за принципа на честотомерите за ниски и високи честоти, но за конкретния PICконтролер (серията PIC16f8x) а и при по-късните модели метода за определяне на периода и от там да се изчисли честотата е трудно приложим при високи честоти. Преди време имах честотомер Tektronix с тактова честота 320MHz измерваше до 300MHz, но за високи честоти мереше пакети от 10 периода. А 1Hz го показваше с 7 - 8 знака след десетичната запетая. В интерес на истината, тези PIC честотомери не са истински метрологични уреди и се ползват в любителската практика най-вече като цифрови скали на приемници или сигналгенератори. Идеята на поста ми е как от 16-битово броене да се направи 24-битово, като не се набляга на точността, а на удобството при ползване. Трябва да се има предвид, че в един супехетеродинен приемник се мери честотата на (първия) осцилатор и след това се изважда/прибавя междинната честота (или честоти). Това с микроконтролерите не е трудна задача.
|
| Пон Май 08, 2023 5:27 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Относно честотомер с PIC
Относно метода, няма нищо сложно, няма нужда да имаш клок с висока честота за да мериш, повечето уреди използват 10 Mhz, това е достатъчно за ниски честоти, а при високи няма значение. Идеята е че броиш едновременно две неща, броя входни периоди за определено време И перодите от референса за цял брой входни периоди, проста сметка между двете ти дава и честотата. Както и да е , това е чисто на теория. Ако мериш само високи, това не те касае толкова. Останах с впечатлението, че задаваш въпрос, а то по-скоро е споделяне на конкретна реализация, това е по-скоро за проекти и споделяне.
|
| Пон Май 08, 2023 8:04 pm |
|
 |
|
Bai Ui
Ранг: Форумен бог
Регистриран на: Вто Ное 06, 2018 5:18 pm Мнения: 1750
|
 Re: Относно честотомер с PIC
Точно. Няма дори нищо иноваторско в горното упражнение, методът е добре известен в цифрова обработка на сигналите и се нарича oversampling.
_________________ “Intelligence is the ability to adapt to change.” Stephen Hawking
|
| Пон Май 08, 2023 8:22 pm |
|
 |
|
ikarlo
Ранг: Ориентиран
Регистриран на: Пон Авг 24, 2020 4:45 pm Мнения: 214 Местоположение: София, Люлин 3
|
 Re: Относно честотомер с PIC
Постът ми е насочен към колеги, които вече за правили подобен честотомер (или цифрова скала) или правят в момента. Проблемът идва от това, че таймерът на простия ПИК е 8 битов, плюс 8 бита прескалер - всичко 16 бита. В някои от тия честотомери за продан добавят фалшив младши разряд, който показва винаги 0 само и само да му вдигнат (поне да изглежда) разрядите. Разбира се, че нямам претенции да съм открил топлата вода, а само да повиша разрядността на брояча за входната честота. Това не става даром, а за сметка на леко влошаване на точността (по мои сметки около 0.01%). Ако не се използва техниката с прекъсванията (принципно е възможно) точността се влошава повече, защото се набъркват по-голям брой инструкции по време на броенето. Не само е възможно, но почти сигурно и други са се "сетили" за този начин, просто в ровейки в нета не намерих читав сорс или хекс файл, който да върши работа. Споделям това, което се получи при мен и може да е полезно на някой, който търси такова решение. Пак повтарям, това не е метрологичен уред и не бих го използвал за отговорни мерения. Не става и за голям честотен обхват, тъй като грешката се променя. В моя случай ми трябва да измери честоти от 40 до 70MHz (честотата на първия хетеродин при вдигане на междинната честота "нагоре"). Ще се наложи да я разделя на 2, за да влезна в обхвата на ПИКа и със сметки ще докарам истинската стойност. Може би трябваше да наименовам поста "Цифрова скала".
|
| Пон Май 08, 2023 10:33 pm |
|
 |
|
Bai Ui
Ранг: Форумен бог
Регистриран на: Вто Ное 06, 2018 5:18 pm Мнения: 1750
|
 Re: Относно честотомер с PIC
Повечето от пишещите тук са мерили период/честота поне веднъж и са си играли с таймерите на процесорите. Лошо няма, не се обиждай, харесва ми че си играеш с асемблер, но защо точно този архаичен процесор? Аз съм го позабравил но си спомням че при прекъсване съхранявах W и Status регистъра, хайде W не го ползваш в програмата по прекъсването, но използваш инструкцията incf с която ако превъртиш (overflow) съответния регистър ще сетнеш C и Z флаговете, а гледам че проверяваш C на едно място, какво ще се случи ако сетнеш C в прекъсването и се върнеш в основната програма точно там, където го проверяваш в Loop1?
_________________ “Intelligence is the ability to adapt to change.” Stephen Hawking
|
| Пон Май 08, 2023 11:46 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Относно честотомер с PIC
Отделно, погледни по-новите ядра, примерно 16F15324 и подобните им, първо че са малко по-бързи, 15 ns с прескалер или 20 ns без прескалер за TMR0 и 30 ns за TMR1 в асинхронен и 20 nS в синхронен. Отделно имат логически клетки които в твоят случай може да са полезни. И не на последно място, ако честотата е важна, защо не закачиш външен делител, няма нужда да е голям, 7474, два D тригера могат да ти делят на 4. Това с новото ядро ще получиш 200 Mhz без да губиш точност, тригерите може да си ги четеш през порта и да знаеш точно на колко е делителя.
|
| Вто Май 09, 2023 12:18 am |
|
 |
|
Bai Ui
Ранг: Форумен бог
Регистриран на: Вто Ное 06, 2018 5:18 pm Мнения: 1750
|
 Re: Относно честотомер с PIC
Абе аз няколко пъти го препрочитам това и все оставам с впечатлението че пропускам нещо, първо програмата му е много объркана и май липсват фрагменти, къде е например подпрограмата TimeBase? Другото което е ако от Микрочеп са сметнали че прескалера може да се клоква с 50МХз то по всяка вероятност това му е лимита, не съм гледал даташита, но каквито и трикове с фърмуера да правиш то лимита на полупроводника няма как да се преодолее, 70МХз може и да се постигнат но ще бъде на предела, ще зависи вече от температура, ниво на захр. напрежение, абе шаманска работа, нещо не ми вдъхва доверие.
_________________ “Intelligence is the ability to adapt to change.” Stephen Hawking
|
| Вто Май 09, 2023 12:38 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Относно честотомер с PIC
Не друга е схемата, той използва таймер 0 с прескалер, там брои. Обаче пресклаера на микрочвп не се чете, и за да разбере каква е стойността той го превключва на вътрешен генератор, и дебне кога ще направи тик към таймера, след което вади "импулсите" които е подал от сетингите на прескалера и получава колко импулса има в него които не са отчетени. 50 мхц е по спецификация прескалера на таймер 0, той работи асинхронно като го клочиш отвън. Цялата работа е в трика как да разбереш колко периода са в прескалера. Тайм нейза е една съвсем друга бира 
|
| Вто Май 09, 2023 7:09 am |
|
 |
|
Bai Ui
Ранг: Форумен бог
Регистриран на: Вто Ное 06, 2018 5:18 pm Мнения: 1750
|
 Re: Относно честотомер с PIC
Сега видях че смята външно да ги дели тези 70 МХз, ОК, тук всичко е наред обаче аз все още смятам че програмата му не е пълна - липсва подпрограмата, която споменах, с тая програма по бабешкия начин - с точно определен брой инструкции си изработва фиксиран интервал след изтичане на който проверява колко е наброил Таймер 0 с другите старши регистри, които пак не разбирам как инкрементира, програмата по прекъсвания му инкрементира най-старшия но има един друг, дето е кръстил Междинен. Сега разбирам и за грешката, която споменава, получава се от задържането на основната програма докато трае прекъсването, това може да се коригира с един флаг в прекъсването, дори може да се направи директно с INTCON,T0IF, да не се нулира от прекъсването а да указва на основната програма че е настъпило прекъсване, от там да се нулира и брояча там да се коригира със съответния брой инструкции колкото е отнело прекъсването. Всичко добре само че докато трае измерването нищо друго на ПИК-а не трябва да работи иначе алгоритъма отива в канала.
_________________ “Intelligence is the ability to adapt to change.” Stephen Hawking
|
| Вто Май 09, 2023 8:01 am |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
 Re: Относно честотомер с PIC
нящо такова е направил https://ww1.microchip.com/downloads/en/ ... 00592d.pdfобаче това "чудо", вероятно ще вкара шум в приемника ( ако го използва за приемо-предаватели )
_________________ main[-1u]={1};
|
| Вто Май 09, 2023 8:46 am |
|
 |
|
ikarlo
Ранг: Ориентиран
Регистриран на: Пон Авг 24, 2020 4:45 pm Мнения: 214 Местоположение: София, Люлин 3
|
 Re: Относно честотомер с PIC
Вижте как завършва първият ми пост преди сорсовете "Ето фрагменти от програмата, които задължително трябва да присъстват:" Разбира се, това не е целият сорс, дори е съвсем малка част от него. Таймбазата не съм дал, защото зависи от тактовата честота на процесора, а аз в този случай използвам някакъв 4194,812KHz, свален един господ знае от какво. Не съм дал нито преобразуването от бинарен в BCD код, нито управлението на индикацията, които общо са доста повече сорс. Прекъсването е възможно само по време на таймбазата, има външен гейт, който спира импулсите към контролера. Затова не съм сложил "РОР" и "PUSH", които иначе са задължителни. Не само това, за да намаля до минимум времето на прекъсването, не проверявам флага T01F, а направо го нулирам (и без това не съм разрешавал други прекъсвания). Схемата е подобна на https://www.kn34pc.com/construct/lz2wsg_freq_count_pic16f84a.html. Контролера е наистина стар, просто са ми останали бройки от стари разработки, но това не променя съществено нещата при по-новите и по-големите - и при тях прескалера е вързан към TMR0, а той е 8-битов. Дори и когато са налице TMR1 и повече, които са 16-битови. Освен това и пишещия тия редове е навлезнал във "третата младост" (а може би четвърта?!), та не съм чак такъв оптимист да се захващам с последните достижения в тази област. Проблемът с точността идва от там, че в таймбазата (0.1S) се вмъкват няколко микросекунди (толкова повече, колкото е по-висока честотата), които за определен честотен обхват могат да се корегират с фината и настройка: * * * ; TimeBase MOVLW D'197' ; time base rough tuning CALL X500MKS ; movlw D'105' ; time base fine tuning movwf DCOUNT ; loop3 nop ; decfsz DCOUNT,f ; goto loop3 ; return ; ; * * * X500MKS е стандартна DELAY подпрограма за около 0.5mS, като грубата настройка става с първото десетично число, а второто е за финна. Тук може да се играе и с броя на NOP вътре в цикъла. А за шумовете, както е казал слепия "ще видим"...
|
| Вто Май 09, 2023 9:29 am |
|
 |
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 2:21 am Мнения: 12765 Местоположение: София
|
 Re: Относно честотомер с PIC
За да е по-четим кода е желателно да използваш таг "code".
|
| Вто Май 09, 2023 9:35 am |
|
 |
|
Bai Ui
Ранг: Форумен бог
Регистриран на: Вто Ное 06, 2018 5:18 pm Мнения: 1750
|
 Re: Относно честотомер с PIC
Не са задължителни, фактът че не си ги сложил показва това. Както вече споменах ако в програмата по прекъсване не ползваш W регистъра то няма нужда да го съхраняваш, ако си сигурен че това, дето го инкрементираш там няма да се препълни то няма нужда да съхраняваш и STATUS регистъра. Ами то няма и нужда да го проверяваш, ако си в програмата по прекъсване той със сигурност е сетнат. Ако искаш да намалиш още времето за прекъсване не изнасяй програмата извън вектора на прекъсване а я разположи директно на адрес 4 (непосредствено след org 4), така си спестяваш една инструкция - goto INTRPT_serv. Лично аз смятам че с прекъсванията си влошаваш измерването и то с много, ако си следиш таймера за препълване в основната програма няма да имаш никаква грешка, тая стандартна програма дето я спомена за фиксирания интервал от време ще бъде точно 500 микросекунди а не 500 + броя на прекъсвания (N) умножено по броя на инструкциите във всяко прекъсване (n) умножено по 4 пъти по едно върху 4194812 (500 + N x n x 4 x 1/4194812) - една инструкция в пика се изпълнява за 4 такта. Грешката ще ти е плаваща, има начин да я коригираш но това е още една кръпка върху кръпката дето вече си я направил с прекъсванията. пп възрастта не е оправдание, освен ако не е свързано с някакво съпътстващо заболяване. Аз съм на 50+ и уча като луд.
_________________ “Intelligence is the ability to adapt to change.” Stephen Hawking
|
| Сря Май 10, 2023 8:04 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|