前言

输入捕获的考题十分明确,就是测量输入脉冲波形的占空比和频率,对我们的板子而言,就是检测板载的两个信号发生器产生的信号:

具体来说就是使用PA15PB4来做输入捕获。

输入捕获原理简介

输入捕获能够对输入信号的上升沿和下降沿进行捕获,并且记录下捕获时定时器的数值以及触发中断。

借用一张图来阐明这个动作:

  1. 边沿触发,产生捕获中断

  1. 中断中读取当前的计数值CCR,并且将计数值清零

  1. 退出中断

因此通过计数值可以计算出高电平持续时间,这里面有一个溢出的问题,对于我们的信号发生器来说,其信号的频率比较高,计数器不会发生溢出,因此不需要考虑。

根据功能分为两类:

  1. 普通输入捕获(只能测频率)

  1. PWM输入模式(可以测频率和占空比)

普通输入捕获

一、CubeMX配置

以及

之后要记得打开中断:

二、Keil软件编写

  1. 开启捕获

HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);

第一个参数是定时器句柄,在tim.c中定义,第二个参数是通道:

这里大家注意不要写成:HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);,少打两个字母,带来的后果是捕获失败!

我觉得应该是HAL_TIM_IC_Start函数只是开启了捕获,没有开启中断,所以如果读寄存器的话应该还是能读出来数据的。

  1. 编写回调函数

    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM3)  //判断是哪个定时器触发
    {
        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)  //判断是哪个通道触发
        {
            Counter=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;//获取计数值+1
            Freq=1000000/Counter;//计算频率
        }
    }
}

进入回调函数后,先判断定时器类型,再判断是哪个通道,完成之后再获取计数值,并且完成频率计算。

·大家这里还要注意,htim--Channel的参数类型是ActiveChannel,不要写成TIM_CHANNEL,因为一个是结构体变量类型,一个是函数的参数。

并且,经过实际验证,回调函数的末尾并不需要再次开启中断。

PWM输入捕获(双通道模式)

一、CubeMX配置

类似普通单通道输入捕获,这里就是将通道2的输入通道设置为简介模式,并且在下面的配置中,将其捕获的极性设置为下降沿:

双通道的原理借用下图展示:

我们只需要看一个周期,其它周期都一样,这样一来,通道一捕获的值为整个周期的持续时间,通道二捕获的值即为高电平的持续时间,这也为咱们的程序设计提供了依据。

二、Keil软件编写

  1. 开启捕获

HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);//开启CH1输入捕获中断        
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);//开启CH2输入捕获中断
  1. 编写中断回调函数

//输入捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
     if(htim->Instance==TIM3)
      {
        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
        {
            T_Count = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_1)+1;//得到周期值
            Freq = 1000000 / T_Count;
            Duty = (float)D_Count/T_Count * 100;
        }
        else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
        {
            D_Count = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_2)+1;//得到占空比
        }                    
    }    
}

由于我们使用双通道模式,因此无论是启动操作还是回调函数,都必须要写两个通道,这样代码思路就十分明确,便于我们记忆。

总结

想要在比赛中正确地完成输入的捕获,我们需要掌握两点内容:

  1. CubeMX配置,只能通过不断练习来记忆

  1. Keil代码编写,主要记忆思路(启动捕获,中断回调函数编写)

对于程序的思路:

  • 首先启动捕获中断(HAL_TIM_IC_Start_IT();)注意双通道要写两个

  • 其次回调函数编写(void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim))注意双通道时,一个通道测周期,一个通道测高电平持续时间。

  • 获取计数值的函数为:HAL_TIM_ReadCapturedValue

易错点总结

  1. 变量的声明一共有四个,(uint16_t)Frez,(float)Duty,(uint16_t)F_Count,(uint16_t)D_Count,注意变量类型!

  1. 计算占空比时,注意标准化为: Duty = (float)D_Count/F_Count * 100。不要擅加括号,由于D_count和F_count为整形,如果加括号(D_Count/F_Count)的结果为0,从而导致错误。

  1. 记忆获取计数值函数:HAL_TIM_ReadCapturedValue如果忘记不太容易找。

  1. 主函数开始一定要先开启各个通道的中断 ,切勿漏写IT,完整的为HAL_TIM_IC_Start_IT

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐