• STM32:TIM通道输入捕获


    本文主要讲解如何使用TIMER通道的输入脉冲捕获功能。基于STM32F7的Timer2 Channel3来进行讲解。

    配置时钟

    Timer2的时钟频率,对应APB1 Timer。

     分频设置为96-1,这样设置定时器每次counter加1,对应的时间为1us(计时精度是1us)。Counter设置为最大即可,默认不使用定时器中断。

     每个通道对应一个GPIO。

     初始化流程

    注意CubeMx生成代码不会开启捕捉,要调用HAL_TIM_IC_Start_IT进行捕捉。

    1. /* TIM2 init function */
    2. void MX_TIM2_Init(void)
    3. {
    4. /* USER CODE BEGIN TIM2_Init 0 */
    5. /* USER CODE END TIM2_Init 0 */
    6. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    7. TIM_MasterConfigTypeDef sMasterConfig = {0};
    8. TIM_IC_InitTypeDef sConfigIC = {0};
    9. /* USER CODE BEGIN TIM2_Init 1 */
    10. /* USER CODE END TIM2_Init 1 */
    11. htim2.Instance = TIM2;
    12. htim2.Init.Prescaler = 96-1;
    13. htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    14. htim2.Init.Period = 0xFFFFFFFF;
    15. htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    16. htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    17. if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
    18. {
    19. Error_Handler();
    20. }
    21. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    22. if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
    23. {
    24. Error_Handler();
    25. }
    26. if (HAL_TIM_IC_Init(&htim2) != HAL_OK)
    27. {
    28. Error_Handler();
    29. }
    30. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    31. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    32. if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
    33. {
    34. Error_Handler();
    35. }
    36. sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
    37. sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
    38. sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
    39. sConfigIC.ICFilter = 0;
    40. if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_3) != HAL_OK)
    41. {
    42. Error_Handler();
    43. }
    44. if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_4) != HAL_OK)
    45. {
    46. Error_Handler();
    47. }
    48. // Start Capture
    49. if(HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3) != HAL_OK)
    50. {
    51. Error_Handler();
    52. }
    53. if(HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4) != HAL_OK)
    54. {
    55. Error_Handler();
    56. }
    57. /* USER CODE BEGIN TIM2_Init 2 */
    58. /* USER CODE END TIM2_Init 2 */
    59. }

    捕获中断处理

     注意TIM输入捕获不会对捕获的脉冲进行计数,需要在中断处理函数里面进行累加处理。HAL_TIM_ACTIVE_CHANNEL_3对应当前输入捕获的Channel是TIM Channel 3。

    1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    2. {
    3. if(htim == &htim2)
    4. {
    5. if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3) Curr_PGA_Counter++;
    6. }
    7. }

    对应时刻脉冲数

    注意HAL_TIM_ReadCapturedValue获取的是以1us为单位的定时器的counter(对应时间),通过此函数可以获取捕捉到脉冲的瞬间对应的时刻。当没有捕获到新的脉冲的话,HAL_TIM_ReadCapturedValue的值返回最后一次脉冲捕获的时刻。如果定时器的counter period设置过小,会很快溢出,重新从0开始计数。建议counter period设置为最大。

    1. uint32_t Get_PG_ChannelA_TimCounter(void)
    2. {
    3. return HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);
    4. }
    5. void PG_Test(void)
    6. {
    7. //Pre_PGA_Counter = Curr_PGA_Counter;
    8. //Pre_PGB_Counter = Curr_PGB_Counter;
    9. uint32_t timer_us = Get_PG_ChannelA_TimCounter();
    10. double timer_s = (double)timer_us/1000000.0;
    11. Usart_Printf("PGA Counter: %d Timestamp: %fs\n", Curr_PGA_Counter, timer_s);
    12. //Usart_Printf("Curr_PGB_Counter: %d\n", Curr_PGB_Counter);
    13. }

    结果测试:

  • 相关阅读:
    解决一个Mysql的utf8编码导致的问题
    去除angular中blob图片显示报unsafe的错误提示
    Uni-ControlNet: All-in-One Control toText-to-Image Diffusion Models——【论文笔记】
    【算法】【递归与动态规划模块】跳跃游戏
    蓝桥杯刷题
    微信小程序-发送Get/Post请求
    Taro 小程序开启wxml代码压缩
    在线存储系统源码 网盘网站源码 云盘系统源码
    Lidar和IMU(INS)外参标定----常用开源项目总结
    Opencv——颜色模型+通道分离与合并
  • 原文地址:https://blog.csdn.net/xikangsoon/article/details/133948830