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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm* p; J( B  C# S0 z; n4 Z- W! U
IDE: KEILv5.27$ \4 C5 C' o/ Y6 r8 m4 z
Firmware Package:STM32Cube FW_H7 V1.8.03 t  a1 r4 `. D) m! s8 Q
芯片:STM32H750VBT6+ d9 L8 w0 t0 c( U. B: j

& Q: F/ c5 l+ x" V; E( K
20200923170713848.png

- o0 x9 p: E( F0 z- y2 o4 K2 a, v* Q( W( d9 C" e
开启tim2输入捕获+ j3 W& f6 r; E! @7 M& }
20200923170800298.png
0 z* i- A. x$ Q9 n. j/ v

* t: ~  l) ]$ O, L配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
* }6 X. x5 Y) }+ r: K4 V7 l) D+ |- B4 ~5 P1 l' A1 V. M
20200923171321738.png

! T9 A* ?! P0 O" ^. N5 w
6 u0 B3 |8 D+ c2 E7 V: w通道一和二都配置成捕获上升沿。
' g+ s% S$ J, A6 }1 V) h
. K/ l+ M6 g- P) ^# _
20200923171403115.png

& n2 O. X! D; z3 R' x0 P3 P0 S* C; a' h; P& D
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。/ H3 E8 U7 G- ?1 F) O! g, M' O
# d9 R. ?- p! Q: X
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); 9 [" Q2 l+ `1 k5 c" G3 h
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);. e- R! E9 m( [
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    9 p. G% n; X7 f* r/ j+ [. C+ s
  2. {//hal库输入捕获回调函数、  ^5 Z" o) V' D6 V6 }* w& h( z
  3.    if(htim->Instance == TIM2)1 w- j" N1 F" H9 A& x9 ]0 U5 j
  4.          {//判断是否为TIM2% Y# m% \) T9 l1 ]* G- M
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一) _1 b0 r8 N! {# o
  6.                          TIM2_CaptureChannel1_Callback();1 j7 k% O( E( X: r
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)+ ~4 p% ^; t* X! ]: H
  8.                          TIM2_CaptureChannel2_Callback();: U: ]2 I/ H" a! u* q  @
  9.          }
    $ w8 a- Z" @  w8 Y( j& @% T& |
  10.    if(htim->Instance == TIM4): u0 n, H+ z% m
  11.          {' P2 h5 t5 m' f
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)7 V2 c; f) O% Z4 G1 _
  13.                          TIM4_CaptureChannel1_Callback();
    , h  k" Y7 s' s8 {( ]4 l) Q
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)# i1 U$ M1 A; }! o
  15.                          TIM4_CaptureChannel2_Callback();$ K! S9 v1 Q2 V8 Z  W
  16.          }
    6 c9 X9 p" N  w  `
  17. }
    , r  I  S. S+ Y
  18. $ C: f. m& T- w$ @% K

  19. 8 W/ S+ s0 K& ^( O

  20. ) W4 L8 h; _6 L9 T5 Q6 K! q
  21. void TIM2_CaptureChannel1_Callback(void), U0 _# C0 N, x# g+ r6 W& x
  22. {
      i+ F( F! }6 Q' R6 `1 v
  23.          switch(tim2_ch1.capture_edge)
    9 m  [: D1 L- o! B! t
  24.          {
    % F+ B' J% m! c, H/ i% ~  J9 _
  25.                  case RASING:
    # y2 y! k% E+ w9 _) M
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);: f" q3 c: ?  Q/ S7 |7 {3 W9 m* o4 v3 V
  27.                         tim2_ch1.capture_edge = FALLING;               
    : E. |5 v5 O3 G- M7 ~2 x
  28.                         
    . l$ t+ m* x8 p  `8 m- `; s
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
    / _. A3 C0 K0 s# I( j+ B
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);
    * M7 x) u/ s6 ~( u" _- p
  31.                   break;* ?. C. ]  n3 _9 [
  32.                  case FALLING:% l/ z+ r9 y& D! |9 v* ~
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);* a3 p4 e& O. i7 I" B: ~% X
  34.             tim2_ch1.capture_edge = RASING;               
    2 \7 B9 O+ u& C( Z
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         ) a+ f/ ?5 t* g8 ^7 L
  36.          }
      m2 o  X$ w4 j0 y9 x4 `" D9 ^

  37. # L8 t4 g4 l/ V) C/ F/ o) V
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \$ S" T  ~$ P( n
  2.   do{                                                                     \
    ; f- F, D% `- l+ E
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \
    " G8 [0 E  ?. O8 N
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
    7 Q+ @, @# `: M- n# S2 q  d
  5.   }while(0)
复制代码

9 O4 Z  E4 c( f8 N7 `' A  J这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。0 W$ w+ q  Z& Y% h. R8 e
: W- q( a3 q7 h( K/ m- d8 }9 }! u
  1. __HAL_TIM_GetCounter(&htim2)0 w7 z  X3 e( N: G* `; N
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。4 t. M3 ^% z* f5 _
实验结果:50HZ方波捕获到的周期为20000us基本不变。0 [$ w5 a5 u& H, B
( U6 n% J3 _( S4 x+ Y/ S8 z
3 F, f; x. g' k: k9 T

4 ?- _  f+ b7 Z6 L. x
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版