| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Честотен детектор с pic 12F1840 http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=14998 |
Страница 1 от 2 |
| Автор: | lcr [ Сря Яну 18, 2017 1:38 pm ] |
| Заглавие: | Честотен детектор с pic 12F1840 |
Здравейте, специалисти! Налага се да меря честота на импулси в обхвата 3 - 4 kHz. На базата на дадена стойност на въпросната честота ще управлявам даден изход. Ще Ви бъда благодарен, ако ударите едно рамо със сорса на "C" (ползвам Xc8 компилатор). Накратко - трябва ми целочислената променлива, чиято стойност да съответства на честотата в гореспоменатия обхват. |
|
| Автор: | slav4o.com [ Сря Яну 18, 2017 1:50 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
Е съвсем наготово едва ли. Но основното е да мериш честотата като бориш импулсите чрез входа. ECCP модул в режим Capture. Пускаш го за 1 сек точно и броиш импулсите 3000 - са 3kHz . Резултата се намира в CCPR1H:CCPR1L . Това са два байта, но на XC8 мисля че можеше да работиш направо като с 16 битово число CCPR1. В сайта на Microchip има много Application Notes , и примери за различни неща. |
|
| Автор: | ToHu [ Сря Яну 18, 2017 3:37 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
За тая честота по-добре мери период, а най-добре и двете, така ще можеш да сведеш едно измерване до 10 на мс като запазваш високата точност на измерването. Готов сорс едва ли, ооне не от мен, но ако искаш насоки няма проблем. |
|
| Автор: | lcr [ Сря Яну 18, 2017 3:48 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
Благодаря ви за насоките. Тъй като няма изисквания към скоростта на измерването, по-добрият вариант ми се струва този в който се броят импулси за секунда. Понеже мисля да ползвам вътрешния осцилатор, меренето на периода вероятно ще доведе до по-голяма грешка. |
|
| Автор: | valioman [ Сря Яну 18, 2017 5:09 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
Е ако ще броиш импулси направо си се закачи на гейта на таймера и след някакво време си вземи стойността му . Но и аз както Тони предпочитам да меря периода .. |
|
| Автор: | lcr [ Сря Яну 18, 2017 5:33 pm ] | |||||||||
| Заглавие: | Re: Честотен детектор с pic 12F1840 | |||||||||
Това ми се вижда най-просто и би трябвало да ми свърши работа. Ако правилно съм разбрал, трябва да подавам импулсите на T1CKI пина, след определено време, примерно 1 секунда да изчета съдържанието на T1, да нулирам таймера и да се върна в началото. |
||||||||||
| Автор: | ToHu [ Сря Яну 18, 2017 7:25 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
Да, общо взето е така. Дали ще броиш импулси или период грешката е еднаква, защото винаги базата идва от вътрелния ти таймер. Период се мери при ниски честоти защото дава точност, при високи се мери брой импулси. Мерейки и двете получаваш виока точност в целия диапазон. |
|
| Автор: | lcr [ Чет Яну 19, 2017 6:49 pm ] |
| Заглавие: | 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++); } Благодаря на всички за съветите и насоките |
|
| Автор: | ToHu [ Пет Яну 20, 2017 2:35 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
ммм и всичко това ще се изпълни веднъж. А това pause_1 ...... |
|
| Автор: | lcr [ Пет Яну 20, 2017 5:10 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
Върви си циклично. Паузата е за да задам време за пълнене на брояча. Сигурно има и по-елегантни начини да се направи това, но това е първото за което се сетих и в крайна сметка работи добре. |
|
| Автор: | ToHu [ Пет Яну 20, 2017 7:56 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
Е как върви циклично като никъде нямаш затворен луп, освен ако този компилатор не затваря по дифолт мейна... Което ще е доста странно. |
|
| Автор: | slav4o.com [ Пет Яну 20, 2017 9:09 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
Ами да изпълнява main() изпълнява после nop-овете FFFF до края на флаша и си почва отначало. По принцип на microchip-ските стекове стила на писане е слагат вътре while(1) { } и вътре в къдравите скоби е цикъла. |
|
| Автор: | ToHu [ Пет Яну 20, 2017 9:42 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
Това как го измисли, , какви нопове какви 5 лева, там може да има всичко, кода не е задължително да е линеен, няма майкрочипски и не майкрочипски, дали и как ще върви зависи от цикъла на луната, така код не се пише. Да си сложил един цикъл while(true) и там да си върти програмата. |
|
| Автор: | slav4o.com [ Пет Яну 20, 2017 10:07 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
Ами по принцип би могло да има. Обаче практиката показва, че компилатора слага нещата в края. При тази елементарна програма "всичкото" няма откъде да дойде, има само един main()... съгласен съм напълно, че не се пише така програма FFFF или 3FFF се интерпретира се като nop(); На XC8 компилатора си слага автоматично това while(1){} но и там може да се махне. Кода може да е изпляскан и на края на флаша. Но все така ако няма това while няма кой да върне програмния брояч и той накрая се превърта и почва отначало.... |
|
| Автор: | ДедоБоре [ Пет Яну 20, 2017 10:09 pm ] |
| Заглавие: | Re: Честотен детектор с pic 12F1840 |
а с while (2) { } дали ще го прави 2 пъти? |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|