使用单片机型号是PIC24FJ1024GB610,用引脚RC14对波形脉冲计数,使用定时器3计数,定时器4定时1秒读数。现在就是不计数,数据一直是零。定时器4的中断能进。不知道哪里配置有问题。配置如下:/*==============================================================================
* 转速测量初始化(计数法:定时器3计数,定时器4定时1秒)
*============================================================================*/
void Fan_SpeedMeasure_Init(void) {
char buf[32];
// ========== 配置RC14为数字输入 ==========
FAN_FEEDBACK_TRIS = 1;
ANSC &= ~(1 << 14);
//PPS配置
__builtin_write_OSCCONL(OSCCON & 0xBF);
// T3CK映射到 74引脚,RC14 RPI37
RPINR3bits.T3CKR = 37;
// 锁定PPS配置
__builtin_write_OSCCONL(OSCCON | 0x40);
// ========== 配置定时器3为计数器模式 ==========
T3CON = 0;
TMR3 = 0; // 清零计数器
PR3 = 0xFFFF; // 最大计数值
// TCS = 1:使用外部时钟(T3CK引脚输入脉冲)
T2CONbits.T32 = 0;
T3CONbits.TGATE = 0; // 关闭门控
T3CONbits.TCKPS = 0; // 1:1 预分频(直接计数)
T3CONbits.TECS = 0b01; // 使用外部时钟(T3CK引脚输入脉冲)
T3CONbits.TCS = 1;
// 启动定时器3
T3CONbits.TON = 1;
// ========== 配置定时器4用于1秒定时 ==========
T4CON = 0;
TMR4 = 0;
PR4 = FCY - 1; // 6,000,000 - 1 = 5,999,999(1秒)
T4CONbits.TCKPS = 0; // 预分频 1:1
T4CONbits.TON = 1; // 启动定时器4
// 使能定时器4中断
IFS1bits.T4IF = 0;
IEC1bits.T4IE = 1;
}
/*==============================================================================
* 定时器4中断服务程序(每秒计算一次转速)
*============================================================================*/
void __attribute__((interrupt, auto_psv)) _T4Interrupt(void) {
// 关闭中断,避免嵌套
IEC1bits.T4IE = 0;
// 读取TMR3中的脉冲计数
pulses = TMR3;
// 清零计数器,准备下一轮计数
TMR3 = 0;
// 清除中断标志
IFS1bits.T4IF = 0;
// 重新开启中断
IEC1bits.T4IE = 1;
} |
|