我一直在尝试在基于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