你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32H7 输入捕获(cubemax和hal)

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm
IDE: KEILv5.27
Firmware Package:STM32Cube FW_H7 V1.8.0
芯片:STM32H750VBT6

20200923170713848.png


开启tim2输入捕获
20200923170800298.png


配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。

20200923171321738.png


通道一和二都配置成捕获上升沿。

20200923171403115.png


管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。

  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  2. {//hal库输入捕获回调函数、
  3.    if(htim->Instance == TIM2)
  4.          {//判断是否为TIM2
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
  6.                          TIM2_CaptureChannel1_Callback();
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  8.                          TIM2_CaptureChannel2_Callback();
  9.          }
  10.    if(htim->Instance == TIM4)
  11.          {
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  13.                          TIM4_CaptureChannel1_Callback();
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  15.                          TIM4_CaptureChannel2_Callback();
  16.          }
  17. }



  18. void TIM2_CaptureChannel1_Callback(void)
  19. {
  20.          switch(tim2_ch1.capture_edge)
  21.          {
  22.                  case RASING:
  23.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
  24.                         tim2_ch1.capture_edge = FALLING;               
  25.                         
  26.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
  27.                         __HAL_TIM_SET_COUNTER(&htim2,0);
  28.                   break;
  29.                  case FALLING:
  30.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
  31.             tim2_ch1.capture_edge = RASING;               
  32.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         
  33.          }

  34. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \
  2.   do{                                                                     \
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
  5.   }while(0)
复制代码

这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。

  1. __HAL_TIM_GetCounter(&htim2)
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。
实验结果:50HZ方波捕获到的周期为20000us基本不变。



收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版