进阶——第十六届蓝桥杯嵌入式熟练度练习(开发板捕获频率和占空比)
- 互联网
- 2025-09-04 11:09:02

单通道捕获频率 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%。
进阶——第十六届蓝桥杯嵌入式熟练度练习(开发板捕获频率和占空比)由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“进阶——第十六届蓝桥杯嵌入式熟练度练习(开发板捕获频率和占空比)”
上一篇
数仓搭建:DWB层(基础数据层)
下一篇
.NET软件开发框架简记