STM32做PWMI的输入捕获模式,测量20-20Khz的方波,20-1098hz时就不准确,发现时TIM3-CCR2的16位计满溢出了,请问怎么把它的溢出挂在中断上,查询的方式计算,越详细越好。
void Timer3(void)/
{
TIM_ICMode=TIM_PWMI,输入PWM模式
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//通道选择,共四个通道
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//输入活动沿(下降沿,上升沿)
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//管脚与寄存器对应关系 TIM2选择对应和IC1 或 IC2 或 IC3 或 IC4 相连
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频器 ,在捕获输入每检测到一个边沿执行一次,DIV2,3,4每捕获2,3,4个事件执行一次
TIM_ICInitStructure.TIM_ICFilter = 0x4;//选择输入比较滤波器,滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);//选择时钟输入触发源 ,经过滤波定时器输入2
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM2复位模式为从模式,选择触发信号(TRGI)的上升沿重初始化计数器并触发寄存器的更新
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //选择主从模式,主从模式使能,启动定时器的被动触发
TIM_ITConfig(TIM3, TIM_IT_CC2 , ENABLE); //使能捕获/比较4中断源
TIM_Cmd(TIM3, ENABLE); //启动TIM2
}
void TIM3_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);//清除中断挂起位
if(IC3Value!=0)
{
DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC3Value;
Frequency=72000000/IC3Value;//捕获时从输入波形的上升沿开始,对主时钟沿进行计数,得到的是主时钟的个数,即为输入脉冲的周期
}
else
{
Frequency=0;
DutyCycle = 0;
}
}
SYSTICK是72Mhz,其他配置没问题 |