无法使Uno32以预期的频率运行计时器1中断

时间:2019-06-12 16:55:14

标签: c pic microchip pic32

我一直在尝试在基于pic32mx320f128h的开发板上(Digilent的Uno32)设置计时器1。时钟速度假定为80MHz,这意味着每个时钟周期需要12.5ns。 500Hz信号应花费2,000,000ns。按照这种逻辑,这是160,000个时钟周期。我决定使用8的预分频器,以便16位定时器1不会翻转。这应该意味着计时器在500Hz频率下达到20,000的值。

但是在我的示波器上,我只能测量到更低的频率,仅为1.57Hz

如果我将预分频器更改为1,则速度会按预期增加到1.57x8 = 12.56Hz。但是,如果我再将PR1降低一半至9999,则速度不会精确翻倍,仅产生25.2Hz

我必须在这里丢失一些东西,有人可以指导我尝试什么吗?

我尝试调整优先级,并使用非多向量中断无济于事;我也尝试使用定时器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);
}

我希望在第3针上切换到500Hz方波,但频率要低得多,为1.57Hz

0 个答案:

没有答案