Я пытался настроить Таймер 1 на моей плате разработки на базе pic32mx320f128h (Uno32 от Digilent).Предполагается, что тактовая частота составляет 80 МГц, что означает, что каждый тактовый цикл занимает 12,5 нс.сигнал 500 Гц должен занимать 2 000 000 нс.По этой логике это 160000 тактов.Я решил использовать прескаляр 8, чтобы 16-битный таймер 1 не переворачивался.Это должно означать, что таймер достигает значения 20000 для частоты 500 Гц.
Однако на моем осциллографе я измеряю гораздо более низкую частоту, составляющую всего 1,57 Гц
. Если я изменяю предскаляр на 1, скорость возрастает, как и ожидалось, до 1,57х8 = 12,56 Гц.Однако, если я тогда уменьшу PR1 вдвое до 9999, скорость не удваивается, в результате чего получается только 25,2 Гц
Я должен что-то здесь упустить, может кто-нибудь подсказать мне, что я могу попробовать?
Я попытался отрегулировать уровни приоритета и использовать не многовекторные прерывания, но безрезультатно. Я также попытался использовать таймер 2 с аналогичными проблемами скорости.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <plib.h>
#define TICKS_PER_SECOND 80000000 //80MHz
#define PIN2_TRIS TRISDbits.TRISD8
#define PIN2_BIT PORTDbits.RD8
#define PIN2_LAT LATDbits.LATD8
#define PIN3_TRIS TRISDbits.TRISD0
#define PIN3_BIT PORTDbits.RD0
#define PIN3_LAT LATDbits.LATD0
#define PINA0_TRIS TRISBbits.TRISB2
#define PINA0_BIT PORTBbits.RB2
#define PINA0_LAT LATBbits.LATB2
int8_t pwmActive = 0;
void __ISR(_TIMER_1_VECTOR, IPL5SOFT) Timer1ISR(void){
PIN3_LAT = ~PIN3_LAT;
IFS0bits.T1IF = 0; //set timer 1 int flag back to off
}
int main(int argc, char** argv) {
// PIN2_TRIS = 1;
// PINA0_TRIS = 1;
//
// PIN3_LAT = 0;
INTDisableInterrupts();
T1CONbits.TCKPS = 1; //prescale 8
T1CONbits.TCS = 0; //80MHz internal source
PR1 = 19999; //500Hz period
TMR1 = 0; //start timer at 0
T1CONbits.ON = 1; //start the timer
IPC1bits.T1IP = 5; //int priority 5
IPC1bits.T1IS = 0; //sub int priority 0
IFS0bits.T1IF = 0; //set timer 1 int flag off
IEC0bits.T1IE = 1; //enable interrupt for timer 1
INTEnableSystemMultiVectoredInt();
PIN3_TRIS = 0;
while(1){
}
return (EXIT_SUCCESS);
}
Я ожидаю, что на частоте прямоугольной волны 500 Гц будет включенконтакт 3, но вместо этого частота намного ниже на 1,57 Гц