当前位置:   article > 正文

蓝桥杯嵌入式(G4系列):定时器捕获_readcapturevalue什么意思

readcapturevalue什么意思

前言:

        定时器的三大功能还剩下最后一个捕获,而这在蓝桥杯嵌入式开发板上也有555定时器可以作为信号发生器供定时器来测量。

原理图部分:

        

 

         开发板上集成了两个555定时器,一个通过跳线帽跟PA15相连,最终接到了旋钮R40上,另一个接到了旋钮R39上。了解了这些,我们下一步到STM32Cubemx上配置就有数了。

STM32Cubemx配置:

        我个人是将PA15设定为了TIM2_CH1

         PB4设定为了TIM16_CH1

         接下来,我们进入TIM2和TIM16的配置界面,配置对应的通道

        然后我们再配置一下响应的参数,分频系数我们设置为79,重装载值,我们就不需要改了

         然后我们再打开中断

         接下来,我们对PB4进行配置,点击TIM16

         设置分频系数和使能中断

 

 代码部分:

        在原有的interrupt.c文件里面,我们新增加一个回调函数HAL_TIM_IC_CaptureCallback,这个回调函数在stm32g4xx_hal_tim.h的2550行的位置,如果大家记不住的话,可以去看一下

         然后,我们可以重新书写回调函数的代码了

  1. unsigned int ccr1_val1 = 0,ccr1_val2 = 0;
  2. unsigned int frq1 = 0,frq2 = 0;
  3. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //中断回调函数
  4. {
  5. if(htim->Instance == TIM2) //PA15
  6. {
  7. ccr1_val1 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
  8. __HAL_TIM_SetCounter(htim,0); //读完之后,将计时值清零
  9. frq1 = (80000000/80)/ccr1_val1; //计算频率
  10. HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
  11. }
  12. if(htim->Instance == TIM16) //PB4
  13. {
  14. ccr1_val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
  15. __HAL_TIM_SetCounter(htim,0); //读完之后,将计时值清零
  16. frq2 = (80000000/80)/ccr1_val2; //计算频率
  17. HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
  18. }
  19. }

         而在回调函数中有HAL_TIM_ReadCapturedValue函数,这个大家如果记不住的话,在stm32g4xx_hal_tim.h的2537行的位置。

        以及HAL_TIM_IC_Start函数,在stm32g4xx_hal_tim.h的2444行的位置。

        然后在main.c里面开启定时器中断

  1. HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); //开启定时器,R39 -> PB4
  2. HAL_TIM_IC_Start_IT(&htim16,TIM_CHANNEL_1); //开启定时器,R40 -> PA15

        这就是最终的一个效果 

 补发:

        采用杜邦线将PA7和PB4相连,将PA6与PA15相连,就可以测量一下上一篇博客定时器输出可调PWM 中提到的PWM频率,如图所示

         这里,我们甚至还可以进一步测量其占空比。通过一个定时器通道去测量整个周期的时间,再用一个定时器的通道去测量高电平持续的时间,其中,高电平持续的时间可以通过检测下变沿来得出。

        接下来,我们进入到STM32Cubemx中去配置一下参数,因为我们的TIM16定时器只有一个通道,所以这里,我们只能用TIM2来做一下占空比测量

        选择一个通道,设定为间接模式

         将间接模式的通道的触发方式设定为下降沿触发

  

        点击生成代码

        我们再进入一下中断回调函数,增加几句代码,在main.c里面只需要声明几个变量即可,不需要额外开启第二通道的函数。

  1. float ccrl_val1a,ccrl_val1b = 0;
  2. unsigned int frq1 = 0,frq2 = 0;
  3. float duty1,duty2 = 0;
  4. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //中断回调函数
  5. {
  6. if(htim->Instance == TIM2) //PA15
  7. {
  8. if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//中断消息来源,选择直接输入通道
  9. {
  10. ccrl_val1a = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //直接
  11. ccrl_val1b = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); //间接
  12. __HAL_TIM_SetCounter(htim,0); //计数值清零
  13. frq1 = (80000000/80)/ccrl_val1a; //计算频率
  14. duty1 = (ccrl_val1b/ccrl_val1a) * 100; //计算占空比
  15. HAL_TIM_IC_Start(htim,TIM_CHANNEL_1); //重新开启定时器通道一
  16. HAL_TIM_IC_Start(htim,TIM_CHANNEL_2); //重新开启定时器通道二
  17. }
  18. }
  19. if(htim->Instance == TIM16) //PB4
  20. {
  21. ccr1_val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
  22. __HAL_TIM_SetCounter(htim,0); //读完之后,将计时值清零
  23. frq2 = (80000000/80)/ccr1_val2; //计算频率
  24. HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
  25. }
  26. }

        最终效果如下:

如果没有读取到占空比是0怎么办:

        我是因为没有把ccrl_val1a,ccrl_val1b 这两个变量设置为float类型,导致读取占空比的时候,我一直都读取不到,这里记录一下,给大家提个醒

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/855027
推荐阅读
相关标签
  

闽ICP备14008679号