| Автор |
Съобщение |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Честотен детектор с pic 12F1840
Здравейте, специалисти!
Налага се да меря честота на импулси в обхвата 3 - 4 kHz. На базата на дадена стойност на въпросната честота ще управлявам даден изход.
Ще Ви бъда благодарен, ако ударите едно рамо със сорса на "C" (ползвам Xc8 компилатор).
Накратко - трябва ми целочислената променлива, чиято стойност да съответства на честотата в гореспоменатия обхват.
|
| Сря Яну 18, 2017 1:38 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Честотен детектор с pic 12F1840
Е съвсем наготово едва ли. Но основното е да мериш честотата като бориш импулсите чрез входа. ECCP модул в режим Capture. Пускаш го за 1 сек точно и броиш импулсите 3000 - са 3kHz . Резултата се намира в CCPR1H:CCPR1L . Това са два байта, но на XC8 мисля че можеше да работиш направо като с 16 битово число CCPR1. В сайта на Microchip има много Application Notes , и примери за различни неща.
|
| Сря Яну 18, 2017 1:50 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Честотен детектор с pic 12F1840
За тая честота по-добре мери период, а най-добре и двете, така ще можеш да сведеш едно измерване до 10 на мс като запазваш високата точност на измерването. Готов сорс едва ли, ооне не от мен, но ако искаш насоки няма проблем.
|
| Сря Яну 18, 2017 3:37 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: Честотен детектор с pic 12F1840
Благодаря ви за насоките.
Тъй като няма изисквания към скоростта на измерването, по-добрият вариант ми се струва този в който се броят импулси за секунда.
Понеже мисля да ползвам вътрешния осцилатор, меренето на периода вероятно ще доведе до по-голяма грешка.
|
| Сря Яну 18, 2017 3:48 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
 Re: Честотен детектор с pic 12F1840
Е ако ще броиш импулси направо си се закачи на гейта на таймера и след някакво време си вземи стойността му . Но и аз както Тони предпочитам да меря периода .. 
|
| Сря Яну 18, 2017 5:09 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: Честотен детектор с pic 12F1840
Това ми се вижда най-просто и би трябвало да ми свърши работа. Ако правилно съм разбрал, трябва да подавам импулсите на T1CKI пина, след определено време, примерно 1 секунда да изчета съдържанието на T1, да нулирам таймера и да се върна в началото.
|
| Сря Яну 18, 2017 5:33 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Честотен детектор с pic 12F1840
Да, общо взето е така. Дали ще броиш импулси или период грешката е еднаква, защото винаги базата идва от вътрелния ти таймер. Период се мери при ниски честоти защото дава точност, при високи се мери брой импулси. Мерейки и двете получаваш виока точност в целия диапазон.
|
| Сря Яну 18, 2017 7:25 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: Честотен детектор с pic 12F1840
Всичко е "ток и жица"  Може и да е малко баято, но ето, какво сътворих: #include <xc.h> #include <pic12F1840.h> #define _XTAL_FREQ 8000000 //tell compiler that the clock is 8 MHz #pragma config MCLRE=ON // Reset pin enabled #pragma config CP=OFF // Code protection off #pragma config WDTE=OFF // Watch Dog Timer disabled #pragma config FOSC=INTOSC // Set to internal clock unsigned int i; unsigned int l; unsigned int h; void pause_1(); void main() { OSCCON = 0b01110010; // Set internal clock, 8MHz INTCON = 0b00000000; // Disable all interrupts ANSELA = 0b00000000; // Disable all analog input WPUA = 0b00000000; // Disable all internal weak pull ups TRISA = 0b00100000; // RA5 - input TMR1CS1 = 1; TMR1CS0 = 0; T1OSCEN = 0; TMR1ON = 1; TMR1GE = 1; pause_1(); l = TMR1L; h = TMR1H; if (l>200) LATA2 = 1; if (l<198) LATA2 = 0; TMR1L = 0; TMR1H = 0; } // end of main() void pause_1() { for(i=0; i<9000; i++); } Благодаря на всички за съветите и насоките 
|
| Чет Яну 19, 2017 6:49 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Честотен детектор с pic 12F1840
ммм и всичко това ще се изпълни веднъж. А това pause_1 ......
|
| Пет Яну 20, 2017 2:35 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: Честотен детектор с pic 12F1840
Върви си циклично. Паузата е за да задам време за пълнене на брояча. Сигурно има и по-елегантни начини да се направи това, но това е първото за което се сетих и в крайна сметка работи добре.
|
| Пет Яну 20, 2017 5:10 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Честотен детектор с pic 12F1840
Е как върви циклично като никъде нямаш затворен луп, освен ако този компилатор не затваря по дифолт мейна... Което ще е доста странно.
|
| Пет Яну 20, 2017 7:56 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Честотен детектор с pic 12F1840
Ами да изпълнява main() изпълнява после nop-овете FFFF до края на флаша и си почва отначало. По принцип на microchip-ските стекове стила на писане е слагат вътре while(1) { } и вътре в къдравите скоби е цикъла.
|
| Пет Яну 20, 2017 9:09 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Честотен детектор с pic 12F1840
Това как го измисли, , какви нопове какви 5 лева, там може да има всичко, кода не е задължително да е линеен, няма майкрочипски и не майкрочипски, дали и как ще върви зависи от цикъла на луната, така код не се пише. Да си сложил един цикъл while(true) и там да си върти програмата.
|
| Пет Яну 20, 2017 9:42 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Честотен детектор с pic 12F1840
Ами по принцип би могло да има. Обаче практиката показва, че компилатора слага нещата в края. При тази елементарна програма "всичкото" няма откъде да дойде, има само един main()... съгласен съм напълно, че не се пише така програма  FFFF или 3FFF се интерпретира се като nop(); На XC8 компилатора си слага автоматично това while(1){} но и там може да се махне. Кода може да е изпляскан и на края на флаша. Но все така ако няма това while няма кой да върне програмния брояч и той накрая се превърта и почва отначало....
|
| Пет Яну 20, 2017 10:07 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
 Re: Честотен детектор с pic 12F1840
а с while (2) { } дали ще го прави 2 пъти?
|
| Пет Яну 20, 2017 10:09 pm |
|
|