单通道捕获频率
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM2)
{cap1=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);TIM2->CNT=0;R40_frq=80000000/80/cap1;HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
}
if(htim->Instance==TIM3)
{cap2=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);TIM3->CNT=0;R39_frq=80000000/80/cap2;HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
}}
双通道捕获下降沿
uint32_t cap1_2,cap2_2,R39_duty,R40_duty;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{ if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1){cap1=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);cap1_2=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2);TIM2->CNT=0;R40_frq=80000000/80/cap1;R40_duty=(1.0*cap1_2)/(1.0*cap1)*100;HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);}
}
if(htim->Instance==TIM3)
{ if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1){cap2=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);cap2_2=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);TIM3->CNT=0;R39_frq=80000000/80/cap2;R39_duty=(1.0*cap2_2)/(1.0*cap2)*100;HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);}
}
}
为什么要使用 (1.0 * cap2_2) / (1.0 * cap2) * 100;
不使用 1.0
时,由于 cap2_2 / cap2
是整数除法,结果为 0,最终得到的占空比也是 0;
当使用 1.0
时,计算表达式变为 (1.0 * cap2_2) / (1.0 * cap2) * 100
。1.0
是一个浮点数常量,在 C 语言里,当一个整数和一个浮点数进行运算时,整数会被隐式地转换为浮点数类型,然后进行浮点数运算。
在 1.0 * cap2_2
中,cap2_2
是整数,1.0
是浮点数,所以 cap2_2
会被转换为浮点数,运算结果是一个浮点数;同理,1.0 * cap2
的结果也是浮点数。这样一来,(1.0 * cap2_2) / (1.0 * cap2)
就变成了浮点数除法。
浮点数除法会保留小数部分,对于 cap2 = 10
和 cap2_2 = 3
的情况,(1.0 * 3) / (1.0 * 10)
就是 3.0 / 10.0
,结果是 0.3
。最后再将这个结果乘以 100
,就得到了准确的占空比 30.00%
。