Я пытаюсь использовать модуль захвата ввода на PIC32MX250F128B для измерения частоты прямоугольной волны. Результаты, которые я получаю, противоречивы и неверны. Все, что я пытаюсь здесь сделать, это измерить частоту входной прямоугольной волны, считывая значение захвата при каждом прерывании по заднему фронту. Затем я сбрасываю Timer2 и снова считываю значение захвата при следующем прерывании.
Вот мой ISR:
void __ISR(_INPUT_CAPTURE_4_VECTOR, ipl1) Capture4(void) {
mPORTBToggleBits(BIT_10);
capture_value = IC4BUF;
mIC4ClearIntFlag();
TMR2 = 0;
}
Вот мои конфигурации модуля:
IC4Rbits.IC4R = 0; // Assign peripheral pin RPA0 to IC4
mPORTASetPinsDigitalIn(BIT_0);
IC4CONbits.C32 = 0; // 16-bit source timer
IC4CONbits.ICTMR = 1; // Use Timer2
IC4CONbits.ICI = 0; // Interrupt every capture event
IC4CONbits.ICM = 2; // Simple Capture Event mode - every falling edge
IFS0bits.IC4IF = 0; // Clear interrupt flag
IFS0bits.IC4IE = 1 // Enable IC interrupt
IFS0bits..IC4IP = 1; // Set interrupt priority to 1
IC4CONbits.ON = 1; // Enable IC module
T2CONbits.ON = 0; // Disable while config
TCONbits.SIDLE = 0; // Continue in idle mode
TCONbits.TCS = 0; // Use internal clock
TCONbits.TCKPS = 0; // Set 1:1 prescale
TCONbits.TGATE = 0; // Disable gated time accumulation
PR2 = 0xFFFF; // set period register
TMR2 = 0; // start counting at zero
T2CONbits.ON = 1; // enable module
Вы заметите, что первая строка ISR переключает цифровой выход; Я добавил это, чтобы я мог отслеживать активность, чтобы увидеть, было ли когда-либо вызвано прерывание. Прерывание действительно вызывается, и я просмотрел его на осциллографе. Я ожидаю, что ISR будет вызываться последовательно в соответствии с падающими фронтами входной прямоугольной волны, но это не так. Вместо этого ISR вызывается непоследовательно через кажущиеся случайными интервалы. Кроме того, значения, считываемые с IC4BUF, вообще не коррелируют с какими-либо настройками частоты входного сигнала.
Очевидно, я что-то здесь упускаю. Если у вас есть какие-либо предложения или вы можете указать на какие-либо очевидные ошибки, которые я сделал, это было бы очень признательно. Кроме того, я открыт для альтернативных методов выполнения задачи измерения входной частоты. Я выбрал этот маршрут с входным захватом, потому что он показался мне наиболее разумным. Спасибо!
Проверьте эту команду: IFS0bits.IC4IE = 1
. Здесь IEC0
следует использовать регистр IFS0
для проверки битов флага, которые получают SET при возникновении любого прерывания. Итак, измените свою команду следующим образом:
IEC0bits.IC4IE = 1
(Если это по-прежнему не работает, проверьте расположение IC4IE
бит в таблице данных.)
IFS0bits..IC4IP = 1
: эта команда также неверна, вы должны использовать IPC0
регистр для установки приоритета захвата ввода.
брахи
Роджер Роуленд
Джей Браун
Джей Браун