试试定时器输入捕捉功能
根据数据手册看,Timer1和Timer2都有外部时钟输入功能
// 使用Timer1作为PWM周期测量
void PWM_Detection_Init(void)
{
// 配置Timer1为外部计数器模式
T1CON = 0b00011000; // T1CK[1:0]=10, T1CKI上升沿计数
T1EN = 1; // 使能Timer1
// 配置Timer0作为时间基准
OPTION = 0b00000111; // 预分频给Timer0,1:256
T0IE = 1; // 使能Timer0中断
}
// Timer0中断用于定期读取Timer1计数值
void interrupt ISR(void)
{
if(T0IF)
{
T0IF = 0;
static unsigned int last_count = 0;
unsigned int current_count = T1;
// 计算频率 = (current_count - last_count) / 定时时间
unsigned int pulse_count = current_count - last_count;
last_count = current_count;
// 根据脉冲计数计算PWM频率
if(pulse_count > 0) {
// 检测到有效PWM信号
}
}
}
|