进阶——第十六届蓝桥杯嵌入式熟练度练习(开发板捕获频率和占空比)
单通道捕获频率
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%
。