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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm4 P+ u  K2 e& O6 C- @$ r
IDE: KEILv5.272 j; t' i/ L& n
Firmware Package:STM32Cube FW_H7 V1.8.0
6 o/ T% D1 c, P. a0 M芯片:STM32H750VBT62 k: |# X2 S4 E& z+ I" y) ~
! W" b$ R# m( R) l% O$ j; s
20200923170713848.png

2 P$ U) ^9 E- T% c
" S% C) I& Z7 |; N: [8 D开启tim2输入捕获
# K- a6 g6 V9 i& u$ E1 R0 G
20200923170800298.png

5 f% p2 i1 N5 S& `* D' n4 r1 `2 p( d8 O  z9 d& e
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
( x" B5 ^: p% f, f( ^$ K9 b. H8 v7 G# ]9 J
20200923171321738.png
+ h3 k4 O% G" _

; P7 ?# K4 F  S1 s) J通道一和二都配置成捕获上升沿。
: O* N9 _7 S) p' `- I+ Y+ N$ }  M( I, i+ @* }
20200923171403115.png

& @$ c9 T. T* W' j* v8 p  w. `8 T/ m3 O) l
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。
. `7 q9 d* i, W, N1 s( N5 L* X/ N% ?& g6 ?& A# p7 }" {8 w7 \
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
    , v' b. t; X4 Q. q- U1 n6 H$ p5 e
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
    - W3 @& }1 O; |: e- }) L
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    ; v  i* L3 t2 \6 e' y! p
  2. {//hal库输入捕获回调函数、" M, g# }- n" ?! Z8 ^" g, Z5 I4 g; W3 C
  3.    if(htim->Instance == TIM2)" t$ M6 v% D( _1 i' R, s$ e4 F
  4.          {//判断是否为TIM2
    " X5 E/ g% Q" m" T
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一$ U( M/ d7 u" \+ r+ N# T
  6.                          TIM2_CaptureChannel1_Callback();
    9 D. P6 D6 x( A
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    9 s, W% w" I# n% [
  8.                          TIM2_CaptureChannel2_Callback();1 O) D8 B- t+ ^3 M6 x. X1 ~2 a
  9.          }
    ( |8 t+ ~# w' S6 N/ `
  10.    if(htim->Instance == TIM4)
    ; m) H8 w$ T9 ?4 O, b
  11.          {
    % n0 W7 N/ |2 |( j; z, z
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)/ m' p: \' ~0 q% o, o' b& ]
  13.                          TIM4_CaptureChannel1_Callback();
      f3 d6 n  J% u* s3 v
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    - H/ U' T& L/ o4 b( G& ~
  15.                          TIM4_CaptureChannel2_Callback();# W% f* o0 r& q7 ]
  16.          }
    ( G) E& I! P$ X" `' z8 d
  17. }
    * Q2 u7 G9 h3 d

  18. 9 M* N. X  c/ F0 }& X+ e
  19. . I" E. x7 m, H- B

  20. - S: g# p% g, p* _5 R3 C! `3 f
  21. void TIM2_CaptureChannel1_Callback(void)
    . g& Q9 n# t1 k. H) S
  22. {
    5 n+ L/ g5 P. X  m9 X, [
  23.          switch(tim2_ch1.capture_edge)  Z1 d) A$ H1 m2 \) J2 ^" b
  24.          {4 }. a& h' Q+ b
  25.                  case RASING:8 v& B: ~9 r( K) H4 G% q: R2 |+ J2 A
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);9 A3 |) S8 U8 f$ p3 _6 ~1 H6 f
  27.                         tim2_ch1.capture_edge = FALLING;               
    ( n" W( w5 D+ G) E5 _
  28.                         
    , V& U: @7 y  T3 C& V
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
    % r  h& T* Q) ?* I, R
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);
    3 Y" U: B4 [0 Z, N3 I& k
  31.                   break;4 N& J! d$ N' |/ ?; Z
  32.                  case FALLING:
    / Y/ _  n/ ~7 t# G: X# q
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);: ^0 R1 w) {% V8 k/ T
  34.             tim2_ch1.capture_edge = RASING;                * Z; [4 \, b! w
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         
    0 j: Q2 f: Q8 s1 o9 ?- M' V
  36.          }
    ( @1 X$ H* K2 Q1 n1 ?7 R! x. M

  37. . {' k) n  x; Y$ P& U
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \
    $ {/ _' o# U2 ~$ G0 k, d
  2.   do{                                                                     \
    3 I# g. u/ `6 [& @, K  O
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \9 U2 f' X  I) T, X/ ?( B
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \$ A7 v! P! L/ S; Q( f
  5.   }while(0)
复制代码
: ~" L  b) F9 R" W
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。/ p7 o8 O2 L) M0 h
4 w$ q' B# m, x+ P" [
  1. __HAL_TIM_GetCounter(&htim2)2 c. B2 U9 m$ @' L2 l
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。+ V% u8 |2 h& ^4 Z
实验结果:50HZ方波捕获到的周期为20000us基本不变。
2 }! H$ t7 ~; S0 \( |- G5 X
# J! n4 ?" K" \* [5 b: I! q2 n- v. D" z

3 K1 T9 X8 u  {( R9 L1 K
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

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