Привет! Делаю проект на этом кристалле. Слепил себе макетку, бикоз в сети ничего путного не нашел.
Выкладываю, может кому пригодится. Делал методом ЛЛТ (ламинатор вместо утюга). Обвязка согласно даташита.
Да, неплох по скорости и возможностям. У меня на нем одет оцифровка видео с камеры в реалтайме, разбор картинки и подсчет проходящих людей в разные стороны + RS485.
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Кстати, вопрос к коллегам кто имеет опыт использования этого контроллера... Какова достижимая погрешность измерения периода модулем input capture? Мне нужно измерять частоту от 5 до 10 мгц с точностью+\- 1Гц - возможно ли это?
Разрешение периода будет равно одному такту таймера, который подключен к модулю захвата.
Погрешность, соответственно, будет равна погрешности генератора, тактирующего этот самый таймер.
Предпочтительнее использовать вместо упомянутого в заголовке практически идентичный ему по цене dsPIC33FJ128MC802.
По сути оный PIC24 является обрубком упомянутого мной 33-его.
maxlab писал(а):Мне нужно измерять частоту от 5 до 10 мгц с точностью+\- 1Гц - возможно ли это?
Все зависит от потребной СКОРОСТИ измерений и точности опорного генератора.
Если 1 измерение в секунду устроит, то можно. Можно чуть напрячься и уменьшить период измерений до 0,25 сек...
Этих контроллеров мне отсыпали 5 штук... надо использовать
В качестве процедуры измерения хочу использовать код из даташита, немного адаптировав его под CCS PICC
// Initialize the Input Capture Module
IC1CONbits.ICM = 0b00; // Disable Input Capture 1 module
IC1CONbits.ICTMR = 1; // Select Timer2 as the IC1 Time base
IC1CONbits.ICI = 0b01; // Interrupt on every second capture event
IC1CONbits.ICM = 0b011; // Generate capture event on every Rising edge
// Enable Capture Interrupt And Timer2
IPC0bits.IC1IP = 1; // Setup IC1 interrupt priority level
IFS0bits.IC1IF = 0; // Clear IC1 Interrupt Status Flag
IEC0bits.IC1IE = 1; // Enable IC1 interrupt
// Capture Interrupt Service Routine
unsigned int timePeriod= 0;
void __attribute__((__interrupt__)) _IC1Interrupt(void)
{
unsigned int t1,t2;
t1=IC1BUF;
t2=IC1BUF;
IFS0bits.IC1IF=0;
if(t2>t1)
timePeriod = t2-t1;
else
timePeriod = (PR2 - t1) + t2;
}
Нужно подключить InputCapture к DMA и по прерыванию от DMA выставлять флаг готовности данных. По этому флагу в main производить расчет. DMA массив можно сделать массивом FIR (КИХ), таким образом в скользящем окне фильтровать результат и сделать его стабильным, тем самым повысить и точность и разрешение (суперсемплингом).