Микроконтролери и електроника
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

valioman написа:
Е ако ще броиш импулси направо си се закачи на гейта на таймера и след някакво време си вземи стойността му .
Но и аз както Тони предпочитам да меря периода .. :)


Това ми се вижда най-просто и би трябвало да ми свърши работа.

Ако правилно съм разбрал, трябва да подавам импулсите на 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/