STM32 HAL库定时器捕获占空比和周期设置
一、HAL库配置
这里打开tim3通道二用来捕捉下降沿/上升沿,tim3的时钟用来计时
这里配置成上升沿触发
这里打开定时器2的2通道,输出1KHz的方波让我们捕获
二、实验效果
pwm输出效果:
三、代码展示
1、获取占空比
tim.c
int tim3_duty,tim3_cycle;
uint8_t tim3_flag,tim3_call_count;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim3)
{
tim3_call_count++;
__HAL_TIM_SET_COUNTER(&htim3,0);
}
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim3)
{
switch (tim3_flag)
{
case 0: //上升沿进入
tim3_call_count=tim3_duty=0;
__HAL_TIM_SET_COUNTER(&htim3,0);
HAL_TIM_Base_Start_IT(&htim3);
TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2);//复位触发极性__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);//改为下降沿触发极性
tim3_flag =1;
break;
case 1:
tim3_duty=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
tim3_duty+=tim3_call_count*1000;
printf("duty:%d \r\n",tim3_duty+1);
TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2);//复位触发极性
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);//改为上升沿触发极性
tim3_flag =0;
break;
}
}
}
main.c
__HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,500);
2、获取周期
直接复制粘贴上面的占空比测量
void get_cycle ()
{
switch (tim3_flag)
{
case 0: //上升沿进入
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,0);
tim3_call_count=tim3_duty=0;
__HAL_TIM_SET_COUNTER(&htim3,0);//定时器计数清零
HAL_TIM_Base_Start_IT(&htim3);//开始计时
TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2);//复位触发极性
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);
tim3_flag =1;
break;
case 1:
tim3_duty=__HAL_TIM_GET_COMPARE(&htim3,TIM_CHANNEL_2);
tim3_duty+=tim3_call_count*1000;
printf("cycle:%d \r\n",tim3_duty);
TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2);//复位触发极性
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);
tim3_flag =0;
break;
}
}
输出的pwm:
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,100);
__HAL_TIM_SET_AUTORELOAD(&htim2,2000);
结果:
tim.c一起获取周期和占空比代码
void get_duty ()
{
switch (tim3_flag)
{
case 0: //上升沿进入
tim3_call_count=tim3_duty=0;
__HAL_TIM_SET_COUNTER(&htim3,0);
HAL_TIM_Base_Start_IT(&htim3);
TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2);//复位触发极性
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);//改为下降沿触发极性
tim3_flag =1;
break;
case 1:
tim3_duty=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
tim3_duty+=tim3_call_count*1000;
printf("duty:%d \r\n",tim3_duty);
TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2);//复位触发极性
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);//改为触发极性
tim3_flag =2;
break;
case 2:
tim3_cycle=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
tim3_cycle+=tim3_call_count*1000;
printf("cle:%d \r\n",tim3_cycle);
TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2);//复位触发极性
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);//改为触发极性
tim3_flag =0;
break;
}
}
问题与总结
1、直接使用定时器计时
这段代码中,如果使用__HAL_TIM_GET_COUNTER(&htim3);来获取从上升沿到下降沿的时间,会出现以下读数:
出现这个结果的原因应该是printf("duty:%d \r\n",tim3_duty+1);我对tim3_duty进行了加一,这个1应该是去掉的,因为这个是直接采集的时间,不是计数
2、获取定时器通道的计数值
使用 HAL_TIM_ReadCapturedValue 和 __HAL_TIM_GET_COMPARE
获取定时器通道2的计数值,效果是一样的
文章有错误以及不足之处,欢迎大家指出!
作者:阿哟阿哟