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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm
1 H' y1 h, h7 S; n0 a) I; OIDE: KEILv5.271 c! B) w; s( ^
Firmware Package:STM32Cube FW_H7 V1.8.02 y4 w! e. O0 G3 C) g$ S
芯片:STM32H750VBT6- v7 a4 X. K/ c, B$ H* A  _

6 ~6 m3 T( E1 R
20200923170713848.png

2 `6 N3 {% `& o0 z- Y
. t# }4 O" u/ K- o1 m! J开启tim2输入捕获
! D4 V9 P1 H$ `3 O4 A* @
20200923170800298.png

+ r- a+ Z) q# C, c/ I6 n' r0 V  c7 e) G
; N: f0 a: u; e3 p配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
2 u7 I. e: V4 s( a
7 E, t) ~3 n- ~- o3 y
20200923171321738.png
9 G4 E' g0 e; L9 b
4 b- X+ `( v8 a9 ?0 K! Y- i6 b( |
通道一和二都配置成捕获上升沿。. y6 ]+ t; q# |) L6 d

0 `* L4 R' F5 O  A2 F1 I9 i# o0 o
20200923171403115.png
7 Y. d, W, v4 G, Z

# b( e8 p5 I9 s% B( z5 @$ O8 D管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。
) }+ f5 H8 {5 L  s! ~7 v0 n) L
" @0 B4 ^+ o# c
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); 5 ~$ f4 W' w2 R7 Y' U9 `4 u
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);& ]7 c* Q  v5 B# \5 e' D5 w# v& j9 X
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    1 X4 P5 c8 H  R, j
  2. {//hal库输入捕获回调函数、3 Y) ]! H% \- M% Q" g/ V4 @$ F
  3.    if(htim->Instance == TIM2)8 U! D4 F! N4 ]- Z. t4 p- d
  4.          {//判断是否为TIM2
    : F/ |& D8 [3 b; H6 [2 O
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
    3 O5 m) M' ^. K7 z9 |3 Y
  6.                          TIM2_CaptureChannel1_Callback();  q* Z& b  M' n. G
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    ( R: `' r, J. n- f9 a
  8.                          TIM2_CaptureChannel2_Callback();1 |4 {" X3 _" v  K/ S4 F
  9.          }/ A9 M. z' r8 c; P/ k6 \
  10.    if(htim->Instance == TIM4). g+ L) P. Q9 L. K6 |8 n- w
  11.          {9 l$ Q- i2 g' q" [6 X0 k$ _
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    ! t. ~8 A0 y/ o! i& h# F6 n3 z5 |
  13.                          TIM4_CaptureChannel1_Callback();  `: L) H1 Q  f
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)' \! V: O: y3 b+ `# j
  15.                          TIM4_CaptureChannel2_Callback();
    . X: p# l$ y; R+ d
  16.          }) H7 \1 O* X9 E( H7 y* s# {1 b
  17. }
    / k4 z7 J' f7 @
  18. ; `) _) d4 V; E/ }5 q- E+ U
  19. 2 q) \( L7 A. n$ ]" U' F

  20. 5 K- ?6 Y1 X# f$ o" S5 j; _
  21. void TIM2_CaptureChannel1_Callback(void)' l! l3 o2 }* j: d& v0 Q
  22. {
    $ \$ @9 C& s; E0 p0 H
  23.          switch(tim2_ch1.capture_edge)
    + L6 x' u, }% j6 o1 n# N
  24.          {# }3 `; u" Y$ }  e+ V/ H# I- c' Q
  25.                  case RASING:
    / W4 c# p8 G. ~
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);# ?* ?- X& z  }8 M. h, L: K" C
  27.                         tim2_ch1.capture_edge = FALLING;               
    ' a5 v9 {) c" O* d0 {
  28.                         " J/ C3 ?  T& H/ n9 i
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);& m7 z. R( O5 `0 ]8 Y
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);
    % S" C+ ^/ A* g- S
  31.                   break;
    . J: \) m% R2 a( \- u, V
  32.                  case FALLING:
    ) P, x. f5 Q, b
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
    . [' z3 ?$ O/ E% o* w: G% q# _
  34.             tim2_ch1.capture_edge = RASING;               
    * S8 V  X( f7 W  g, f2 Q: T! a4 ?. m
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         
    2 V% A& @# q4 @$ S' n
  36.          }/ T0 c& |- r% P: `

  37. 6 R& Q( p+ z3 x
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \
    ; ~8 o! a; m( O3 {# F+ \
  2.   do{                                                                     \+ [/ U! F6 q$ c2 s
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \
    5 D: X3 \+ ~$ ~9 Z
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
    / f, E' R  j- g% M+ j6 l5 z  w
  5.   }while(0)
复制代码
( @* S) V5 m3 u9 `
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。4 F2 i4 B2 K. E+ w. ^% p

, `0 u+ f& n4 j- R- |7 d3 r0 A9 N6 [
  1. __HAL_TIM_GetCounter(&htim2)
    . a3 I, ~  {, Y* A
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。
) g- L2 j7 g5 F实验结果:50HZ方波捕获到的周期为20000us基本不变。
& w$ }0 i; w/ E& C0 C* q: Q: Q: \% A3 V4 U4 _5 l, X. z" C* [( j! F

! ?1 {, ^5 R' x- u, a2 F( h" _) c  A2 C
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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