蓝桥杯嵌入式国赛拓展版——PULSE输入捕获多路频率的方波

物理引脚连接

连接PULS1、PULSE2

对应RP3、RP4

Cubemax

引脚配置

PA1-TIM2_CH2

PA2-TIM2_CH3

初始化
将相应TIM和通道设为input Capture direct mode

PSC:79

Counter Period:0xFFFFFFFF

NVIC使能中断

keil代码部分

主函数中初始化

//开启捕获中断
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);

HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_3);

回调函数主要是复制example中的回调函数,包括其中的变量定义

复制文件路径:

2-新版竞赛平台\4-库文件\STM32Cube_FW_G4_V1.2.0\Projects\NUCLEO-G431RB\Examples\TIM\TIM_InputCapture

找到里面的回调函数代码

//变量定义
uint32_t uwIC2Value1 = 0;
uint32_t uwIC2Value2 = 0;
uint32_t uwDiffCapture = 0;

/* Capture index */
uint16_t uhCaptureIndex = 0;

/* Frequency Value */
uint32_t uwFrequency = 0;
//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
    if(uhCaptureIndex == 0)
    {
      /* Get the 1st Input Capture value */
      uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
      uhCaptureIndex = 1;
    }
    else if(uhCaptureIndex == 1)
    {
      /* Get the 2nd Input Capture value */
      uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); 

      /* Capture computation */
      if (uwIC2Value2 > uwIC2Value1)
      {
        uwDiffCapture = (uwIC2Value2 - uwIC2Value1); 
      }
      else if (uwIC2Value2 < uwIC2Value1)
      {
        /* 0xFFFF is max TIM1_CCRx value */
        uwDiffCapture = ((0xFFFF - uwIC2Value1) + uwIC2Value2) + 1;
      }
      else
      {
        /* If capture values are equal, we have reached the limit of frequency
           measures */
        Error_Handler();
      }

      /* Frequency computation: for this example TIMx (TIM1) is clocked by
         APB2Clk */      
      uwFrequency = HAL_RCC_GetPCLK2Freq() / uwDiffCapture;
      uhCaptureIndex = 0;
    }
  }
}

上面是复制过来的代码,下面需要把上面的代码完整复制下来,用keil5新建文件(就像建立一个.c文件一样),放到里边进行修改,修改完文件也不用保存,再复制到回调函数中即可。

修改:

用ctrl加h调出来集体替换的按钮

完成以下替换
 uwIC2Value1--> uwIC3Value1
uwIC2Value2-->uwIC3Value2
uwDiffCapture-->uwDiffCapture_ch3
uhCaptureIndex-->uhCaptureIndex_ch3
uwFrequency-->uwFrequency_ch3

HAL_TIM_ACTIVE_CHANNEL_2-->HAL_TIM_ACTIVE_CHANNEL_3

换完后放入将定义的变量放入之前定义变量的地方,回调函数的内容复制到刚才复制的回调函数中

(注意大括号)

最后将这两个通道的回调函数的内容在回调函数中用下面的if包起来,防止与其他TIM冲突

if(htim->Instance == TIM2)
{

}

最后的结构类似:

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        //TIM_2CH3的频率捕获
        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
            {

            }
        //TIM_2CH2的频率捕获
        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
            {

            }

    }
}

下面是完整的回调函数代码 

//输入捕获

uint32_t uwIC2Value1 = 0;
uint32_t uwIC2Value2 = 0;
uint32_t uwDiffCapture = 0;
/* Capture index */
uint16_t uhCaptureIndex = 0;
/* Frequency Value */
uint32_t uwFrequency = 0;

uint32_t uwIC3Value1 = 0;
uint32_t uwIC3Value2 = 0;
uint32_t uwDiffCapture_ch3 = 0;
/* Capture index */
uint16_t uhCaptureIndex_ch3 = 0;
/* Frequency Value */
uint32_t uwFrequency_ch3 = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==TIM2)
	{
		if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
    if(uhCaptureIndex == 0)
    {
      /* Get the 1st Input Capture value */
      uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
      uhCaptureIndex = 1;
    }
    else if(uhCaptureIndex == 1)
    {
      /* Get the 2nd Input Capture value */
      uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); 

      /* Capture computation */
      if (uwIC2Value2 > uwIC2Value1)
      {
        uwDiffCapture = (uwIC2Value2 - uwIC2Value1); 
      }
      else if (uwIC2Value2 < uwIC2Value1)
      {
        /* 0xFFFF is max TIM1_CCRx value */
        uwDiffCapture = ((0xFFFFFFFF - uwIC2Value1) + uwIC2Value2) + 1;
      }
      else
      {
        /* If capture values are equal, we have reached the limit of frequency
           measures */
        Error_Handler();
      }

      /* Frequency computation: for this example TIMx (TIM1) is clocked by
         APB2Clk */      
      uwFrequency = HAL_RCC_GetPCLK2Freq() / uwDiffCapture;
      uhCaptureIndex = 0;
    }
  }
	
	  if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
  {
    if(uhCaptureIndex_ch3 == 0)
    {
      /* Get the 1st Input Capture value */
      uwIC3Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
      uhCaptureIndex_ch3 = 1;
    }
    else if(uhCaptureIndex_ch3 == 1)
    {
      /* Get the 2nd Input Capture value */
      uwIC3Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3); 

      /* Capture computation */
      if (uwIC3Value2 > uwIC3Value1)
      {
        uwDiffCapture_ch3 = (uwIC3Value2 - uwIC3Value1); 
      }
      else if (uwIC3Value2 < uwIC3Value1)
      {
        /* 0xFFFF is max TIM1_CCRx value */
        uwDiffCapture_ch3 = ((0xFFFFFFFF - uwIC3Value1) + uwIC3Value2) + 1;
      }
      else
      {
        /* If capture values are equal, we have reached the limit of frequency
           measures */
        Error_Handler();
      }

      /* Frequency computation: for this example TIMx (TIM1) is clocked by
         APB2Clk */      
      uwFrequency_ch3 = HAL_RCC_GetPCLK2Freq() / uwDiffCapture_ch3;
      uhCaptureIndex_ch3 = 0;
    }
  }
	}
}

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值