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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm
% {$ O; b9 w. m' qIDE: KEILv5.27
1 |% a  ^; M6 L) ?' ?% GFirmware Package:STM32Cube FW_H7 V1.8.0
0 E  R+ ^, W. Y3 G" E7 [0 O芯片:STM32H750VBT63 i4 r* `# J' o' c: |  G6 u: ]

- T1 H: G* |  h. N; e4 \7 d
20200923170713848.png
+ Z1 W; M1 c7 ^4 ]

5 W- O( P4 y) ^7 ]' T3 F! L4 Q开启tim2输入捕获
% I7 y* V! d! a9 J& J$ f" E
20200923170800298.png

% |$ |3 i2 \# v
9 f/ c  A4 h8 d5 U7 u配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
2 Y& j' P  ?* e' X2 X2 L* \6 f2 u7 g" g- `4 P0 W  \
20200923171321738.png

( S. W6 g7 s* H# N8 l8 s9 B9 [: A& o
通道一和二都配置成捕获上升沿。6 J! e1 h! N2 O6 R- i9 |: o8 I
+ |4 \1 n& B) _& K( P' t: D
20200923171403115.png
) v3 S! ~! u1 D! ]) i( n

# ~+ D* h8 S9 W管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。( g4 _$ R, L9 F. c# n- {

6 L) {: _3 e7 G; y6 \2 L! N% \
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); , |" g  A( r* i! u, G7 ?! h% k* y
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);7 R3 q) I% G4 w$ S9 q- E5 W( x4 W& W
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)  R9 |  u- @) M, w4 `/ m" V' W4 F9 v
  2. {//hal库输入捕获回调函数、
    / |* K: Y4 m2 X
  3.    if(htim->Instance == TIM2)
    + c( K# C  _0 p: i
  4.          {//判断是否为TIM2  k6 {3 S( ]. j
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一( S1 e' \' G( x* u
  6.                          TIM2_CaptureChannel1_Callback();1 d0 v: l# L) D0 x  e* X/ e5 A9 D
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)2 C. }. i3 @" D; H" q
  8.                          TIM2_CaptureChannel2_Callback();1 G9 {+ A+ C$ P" K1 V9 n1 L/ E
  9.          }5 o! B4 @: f7 d. ^1 t- f$ j8 H. U5 I
  10.    if(htim->Instance == TIM4)% l* }+ E$ M/ k+ a$ h3 W
  11.          {6 I  ^" [9 v1 D' B
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    1 @  H% [7 ]# Z. N+ v8 x" d; G- f, ]
  13.                          TIM4_CaptureChannel1_Callback();8 S1 l- v+ k3 ?5 a+ x
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)1 O0 R0 v# N7 K/ v1 \: x
  15.                          TIM4_CaptureChannel2_Callback();8 y7 z  z$ f7 A2 C! }
  16.          }0 T! T$ v7 x& _/ a: h
  17. }/ _1 O5 U3 B! }4 P2 p% m$ O1 D
  18. ( V. ^  t+ y7 c" M
  19.   W2 j, G3 h6 b$ W: F' n7 M
  20. . `( c1 P% v) Q" b1 c
  21. void TIM2_CaptureChannel1_Callback(void)
    5 R! Z. ~/ `; W! T
  22. {
    & y" _. t0 x6 u3 B+ ]* P* s6 T, l
  23.          switch(tim2_ch1.capture_edge)
    : B' I" W5 {! y! X3 F) e* S
  24.          {; ]' y: F/ A2 @& ]: e1 h# f+ N
  25.                  case RASING:
    1 H2 p# g* ]& r- M- D# Z
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);( `  B& M1 _- N4 x$ t9 M' }
  27.                         tim2_ch1.capture_edge = FALLING;                ( s# G& L4 R6 X- H* F3 l+ B
  28.                         ) y- b/ n1 |* G& O
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
    : c) i, W6 v6 U& ]' `% h0 |
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);. G9 E( e: h- y3 g
  31.                   break;
    & M" T/ x, f$ y
  32.                  case FALLING:: P4 y/ @9 G8 E: |3 ^  b& N! u! n. E
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
    % Y7 @- \5 Y9 U& v. k" f7 g5 M% K
  34.             tim2_ch1.capture_edge = RASING;               
    % m' V- N4 j/ }
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         " _. n5 U" y) Y) n. @" L0 k
  36.          }3 S/ W# R) D# c* [- H

  37. - T1 y$ M! c( b7 k! G3 k
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \2 N9 [1 A/ e8 b* d
  2.   do{                                                                     \
    0 G( S, G1 Q, o
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \' l, S- l+ I, k$ {( q( C1 c
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
    + p# j% N3 @  o$ a9 B/ w4 x* v! G
  5.   }while(0)
复制代码
# R4 z4 @/ R; N9 R
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。! l% a0 x" g1 W6 P
/ m3 v) a: L% P! y3 M7 }5 W
  1. __HAL_TIM_GetCounter(&htim2)
    - ~9 S. J' c8 Q7 g
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。
8 C& ~  D# A# _6 L' ^3 u6 c+ _% d实验结果:50HZ方波捕获到的周期为20000us基本不变。( t' P0 z) A: v# Q+ W! H# f

/ q& W; U+ L# ?( o) ~1 |: x5 y/ w5 v$ X, k: t
* h8 Y4 o0 s/ F- o- V$ H. {% W
收藏 评论0 发布时间:2021-12-27 20:00

举报

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