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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm
) B. p' ?' _* p% U' zIDE: KEILv5.278 B% c+ F* _" w. G
Firmware Package:STM32Cube FW_H7 V1.8.0
8 y* E% R+ |2 ?芯片:STM32H750VBT6
! g7 v! ~  Y( W  U
, _6 B: |/ ^% I6 T8 V  K
20200923170713848.png
# f: N; }6 C% I6 F- A( |& z7 }) [, R$ `

- W5 d4 V; \& s( S开启tim2输入捕获
: [9 b" F( E+ i. H: k1 e) g
20200923170800298.png
7 }4 D; L  D& S" g
* [' g* P$ S  y* ^1 W: {5 c0 t. g0 x
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。% Q; b( d: n: E( d5 V$ |
6 G0 J* Z7 D7 r) f2 V
20200923171321738.png

0 i' J& D6 r7 [: u6 k# }2 ]# v+ h9 V! E* u7 w6 p+ u8 ^
通道一和二都配置成捕获上升沿。2 ~8 f4 q8 v5 U0 f

5 \! f, O: U6 P- O6 g3 N9 T  k, Q
20200923171403115.png
) e* y0 M& }. k1 T& n! i/ G- j/ L
: t. ~! R* u6 k
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。
$ L" p+ T$ N4 U/ ^6 i& m- L' K  _) j* N* |
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
    ( d: _0 F# B# x9 `  w1 H, ^
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
    ( A: A; ~1 Q  `1 j. w! ~
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    9 S( j% i2 `; e3 n* E
  2. {//hal库输入捕获回调函数、. I" H5 z' D' Z7 M+ E* u/ e
  3.    if(htim->Instance == TIM2)
    6 i# L5 Q' K. s
  4.          {//判断是否为TIM2
    6 S* u& d: L. M8 f" P& t! x: w# g
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一* P8 Q0 x; o7 }3 c* l; Y; i6 R
  6.                          TIM2_CaptureChannel1_Callback();
    # r" b; X0 Z+ m5 h
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2), r) p5 j: B' u1 |; H+ ^
  8.                          TIM2_CaptureChannel2_Callback();
    * S+ P% r4 t6 z  ]( H$ U* Z
  9.          }) `* Y! q: S0 r4 s! J$ ~/ Q; W
  10.    if(htim->Instance == TIM4)' ~) x) a6 F) |; ]7 ^
  11.          {/ g9 Y0 u" O! f% P
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    , x4 D: _) ?/ E. s+ K
  13.                          TIM4_CaptureChannel1_Callback();+ J. ]% \, K9 L' _8 T/ t
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)  N+ h3 r' I) J0 f: u& ]
  15.                          TIM4_CaptureChannel2_Callback();1 M; Y+ o, P; o) K9 J( u) ?2 j
  16.          }& _7 Y& A9 o! \0 o8 ^% b0 w5 `8 f7 _
  17. }
    & C+ B% s, k0 s# ?, j
  18. 3 U& N  C' f- L$ e) @

  19. / b1 D+ i: m  V' E0 U" o
  20. ( b- c  o* m; y/ U
  21. void TIM2_CaptureChannel1_Callback(void)8 }' r- q+ F! {$ D& l& ]
  22. {8 B" J. s. P. Y5 t
  23.          switch(tim2_ch1.capture_edge)
    5 L" l. w" ]" }- Y4 z$ I2 N
  24.          {
    : j& W+ v. q/ B1 c2 U& [7 R
  25.                  case RASING:
    * [/ n- n$ a& _! |& X4 Z1 n
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);. t' `, t$ N1 \; |1 K
  27.                         tim2_ch1.capture_edge = FALLING;               
    0 N- `5 D5 e$ A$ y- G& f
  28.                         
    3 C. y* c5 I1 I: ~# ]" \
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
    ! [+ Q% P) P1 n8 @' G
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);' e( [) b  E4 K2 G$ @8 j0 v3 D) S+ I7 V
  31.                   break;
    / n0 b$ f% N8 G& Z% v5 D
  32.                  case FALLING:
    ( I' p7 Z" h# Q3 \8 V/ ]3 \. \
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
    * _. Q. g2 {. V5 ]# W0 h
  34.             tim2_ch1.capture_edge = RASING;               
    # F0 ?) n, M0 c9 k& d9 `- m
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         
    1 }. ~6 ~6 a, e/ [& Q
  36.          }
    5 h0 a% g' v: Z% B' u* U
  37. 5 f; \1 W# D" [6 b9 K0 Q4 B
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \
    ; C  J1 `) R& n# g; ^$ V0 D3 F1 X
  2.   do{                                                                     \, q* z; f% ^  H" Y7 I* T
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \) g4 D5 ]+ L! x, w
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
    7 I. x+ s) E# i1 {9 h  k! U- k, n7 p
  5.   }while(0)
复制代码
8 Y- k% Z9 n4 Q: Z0 _3 P
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。2 ]" M% e. c8 ]9 N  z: I
8 X9 K" J* t9 d" ?5 B: ]; z
  1. __HAL_TIM_GetCounter(&htim2)5 b- d5 [% _7 M* Q" K
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。5 M7 Z  q, x: c2 |, N
实验结果:50HZ方波捕获到的周期为20000us基本不变。% o; u* L' ?6 r; `- e9 J: n1 Y
2 q" G4 y6 y7 \6 L/ U$ Z; G
$ c# b! s; S, N+ I
& h) G4 m+ Z- c6 `5 e9 M" x* H
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版