蓝桥杯的输入捕获较为简单,基本不涉及溢出的问题。所以这里就不介绍溢出了。文末有源码。
核心思想:在第一次上升沿的时候计第一个数,第一次下降沿的时候计第二个数,第二次上升沿的时候计第三个数。
占空比 =(第二个数-第一个数) / (第三个数-第一个数)
其实这个占空比公式并没有写全,是简写了,写完了应该是:
占空比=高电平的时间/周期。即:(第二个数-第一个数) 乘 计一个数的时间 / (第三个数-第一个数) 乘 计一个数的时间,简写是因为正好约去了
周期 = (第三个数-第一个数) 乘 计一个数所需要的时间
计一个数所需要的时间 = psc / pclk
一、Cubemx配置
二、代码编写
1.在捕获回调函数中
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
switch(count)
{
case 1:
{
jishu1=__HAL_TIM_GET_COUNTER(&htim3);
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
count++;
break;
}
case 2:
{
jishu2=__HAL_TIM_GET_COUNTER(&htim3);
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
count++;
break;
}
case 3:
{
jishu3=__HAL_TIM_GET_COUNTER(&htim3);
count++;
HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1);
break;
}
}
}
}
2.在main函数中
LCD_Init();
LCD_Clear(White);
HAL_TIM_IC_Stop_IT(&htim3, TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
switch(count)
{
case 0:
{
__HAL_TIM_SET_COUNTER(&htim3, 0);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
count++;
break;
}
case 4:
{
fre=1000000.0/(jishu3-jishu1);
zkb=(jishu2-jishu1)*100.0/(jishu3-jishu1);
// 频率为占空比为
sprintf(buff,"zkb:%.2f%% fre:%.2f",zkb,fre);
LCD_DisplayStringLine(Line4, buff);
count=0;
break;
}
}
}
/* USER CODE END 3 */
}
三、现象
通过调节开发版上的旋钮改变占空比跟频率
小编的源码输入捕获源码