一、什么是输入捕获?对比输出捕获区别?
输入捕获是指对输入信号的特定事件进行检测和记录它主要用于测量输入信号的时间间隔、频率等参数。而输出捕获则是对输出信号的特定事件进行控制和监测。两者的主要区别在于作用对象不同,输入捕获关注的是输入信号,而输出捕获关注的是输出信号。
输入捕获能够对输入信号的上升沿和下降沿进行捕获,并且记录下捕获时定时器的数值以及触发中断。根据功能分为两类:
-
普通输入捕获(只能测频率)
-
PWM输入模式(可以测频率和占空比)(双通道)
二、使用步骤
1.配置工程
2.输入捕获频率
如图有两个信号发生器,R40和R39可调整信号发生器的频率,PA15和PB4可设置为定时器输入捕获模式,用于采集他所发出的信号
定义变量
uint32_t cap1,cap2,R39_frq,R40_frq;
uint32_t cap1_2,cap2_2,R39_duty,R40_duty;
开启定时器
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
中断回调函数
当
htim
的实例为TIM2
时:
- 如果
htim
的通道为HAL_TIM_ACTIVE_CHANNEL_1
,则执行以下操作:
cap1 = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)
:读取定时器 2 的通道 1 的捕获值并存储到cap1
中。cap1_2 = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2)
:读取定时器 2 的通道 2 的捕获值并存储到cap1_2
中。TIM2->CNT=0
:将定时器 2 的计数器清零。R40_frq = 80000000 / 80 / cap1
:计算与定时器 2 相关的频率值,其中80000000
是系统时钟频率,80
是预分频值,cap1
是捕获值。R40_duty = (1.0 * cap1_2) / (1.0 * cap1) * 100
:计算与定时器 2 相关的占空比值。HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1)
和HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2)
:重新启动定时器 2 的通道 1 和通道 2 的输入捕获中断。
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);
}
}
LCD显示
sprintf(buf," R39_frq:%dHZ ",R39_frq);//输入捕获频率
LCD_DisplayStringLine(Line6,(uint8_t*)buf);
sprintf(buf," R40_frq:%dHZ ",R40_frq);
LCD_DisplayStringLine(Line7,(uint8_t*)buf);
sprintf(buf," R39_duty:%d%% ",R39_duty);//输入捕获频率
LCD_DisplayStringLine(Line8,(uint8_t*)buf);
sprintf(buf," R40_duty:%d%% ",R40_duty);
LCD_DisplayStringLine(Line9,(uint8_t*)buf);
三、效果展示
四、代码开源
通过网盘分享的文件:18-TEST8-TIM输入频率和占空比.zip
链接: https://pan.baidu.com/s/1SWKCUrFRDdp6I0CK3vGMtA?pwd=0820 提取码: 0820