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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm3 r; h& G, w- o. [( i& T2 `
IDE: KEILv5.27
; \+ y& _& |( x  d6 v* UFirmware Package:STM32Cube FW_H7 V1.8.0; R4 K( x. J% D( S- X
芯片:STM32H750VBT6
5 _  P$ e, f* g$ Z
) X! B! s; t8 c) y$ W1 J, ^( S# ~
20200923170713848.png
" u* b( H4 c! }) l4 i  ?
  L6 }0 t: S' m: S# v" o9 ^
开启tim2输入捕获
& K( X9 ]6 n6 Q4 f# N9 F
20200923170800298.png
9 _; S' x) g6 w0 J) ~9 _

9 u$ j5 K: h' _配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。4 }* Y' H8 R" J# k; W& q( E9 v/ @
( g' @9 }0 @' D- e
20200923171321738.png

9 O: o6 r0 R4 p% L' A* S) Y9 }+ b9 B
通道一和二都配置成捕获上升沿。! `/ t" w* K8 o) C# Y  I# o5 F
( b$ g% o4 j8 Z& Z: z& q" s
20200923171403115.png
3 G' _! ^5 X8 W! z+ ]6 C! \9 X" q4 A
$ j# r4 G2 j: T
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。- U+ \; v. G: u& q" P# R1 P9 M1 |
3 a3 J4 X8 w' e3 _" C7 c
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); ! ?, }* y4 J$ G8 [
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);& x% Q4 O) x0 O% e& R
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)' S: r/ [' T4 {% V% P
  2. {//hal库输入捕获回调函数、
    ! j- N; N7 e$ K% c: p5 @) _
  3.    if(htim->Instance == TIM2)
    : W* v% L) I( O* {; p' W1 {
  4.          {//判断是否为TIM29 ~7 \6 M  `& T  g" ~
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一- u/ @6 u0 Z4 J) ?% e; N1 ?
  6.                          TIM2_CaptureChannel1_Callback();# o2 K1 C/ t0 s; q& x  @. H& ~. ?( b
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    0 G6 g, ~' y' q4 i6 F( T3 \
  8.                          TIM2_CaptureChannel2_Callback();
    7 ?, i; V: g: R- _6 g
  9.          }
    , B8 t5 T% g! D
  10.    if(htim->Instance == TIM4)
    1 R" _- B/ o  r5 d" D
  11.          {8 b8 P9 @# o/ V: P& E- l3 t: I( Y
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    ! z& U) Y. E* S4 {5 V
  13.                          TIM4_CaptureChannel1_Callback();
    & h% @8 J4 v3 }, S; P/ ?6 ]. O" M9 p; Y
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    - o; B% X& n  P! i- f0 K
  15.                          TIM4_CaptureChannel2_Callback();
    3 Y; s7 {7 c9 Q% V3 \3 f; K) l$ E
  16.          }0 w( ~4 l: h' y3 a+ A
  17. }5 f' y  C! B$ o1 R. U% L" A
  18. % H1 l2 X7 i4 L3 R9 T: M
  19. % Q# l" S& a9 P1 L- g

  20. . Z) r* g+ p: W6 j% K* ?5 o( S
  21. void TIM2_CaptureChannel1_Callback(void), ^8 ]! H: o! l$ W( }+ F5 Y4 f
  22. {
    ( ]3 Z8 \  S1 X2 H& e
  23.          switch(tim2_ch1.capture_edge)" r! s2 A; S+ w) j& N+ D$ q0 v
  24.          {( K% `  u" f) h! `: p% u' V
  25.                  case RASING:& J3 k- K" t5 l! o* ]
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);/ d# A! J1 R; a+ n- U9 `
  27.                         tim2_ch1.capture_edge = FALLING;               
    7 q6 w5 r" F$ L; U* h6 R8 z
  28.                         
    . T! W' _0 N) \0 E) M
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);3 s" W/ w/ ]# P
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);  z( I0 N4 e4 s- I  q3 G$ f+ ~+ {) o
  31.                   break;
    ) y: ]( K, r. g  E
  32.                  case FALLING:
    + O& p' r# i5 [; y: n
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
    % a8 @$ }! V, `  Z1 \
  34.             tim2_ch1.capture_edge = RASING;               
    ; H/ s4 k, O6 {; Q1 y' L
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         
    $ r7 m( H% {" d8 l9 I  f/ G- U2 X
  36.          }
    6 m# P, C& U2 X" ~6 r- e& O9 `

  37. . t) X5 c" l& H" o* |4 G$ i
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \
    % m) J% V7 Y/ d/ \) n5 z
  2.   do{                                                                     \) _6 L9 M) Y$ \5 y
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \
    ' P3 [) X# s7 e+ z$ ?
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
    - B; E8 R1 e2 k7 `" H4 a
  5.   }while(0)
复制代码

0 w0 r9 y  o' t5 Z这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
# B2 q2 m, q6 O6 d  k6 G0 ^
1 V7 `- @% J* P8 s0 Q9 c4 _+ n
  1. __HAL_TIM_GetCounter(&htim2)! R/ j9 {* T8 C) G$ Z, z
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。9 B8 a) O5 C. S7 r
实验结果:50HZ方波捕获到的周期为20000us基本不变。
4 ]6 z! L6 ?: Y+ W5 V
6 s, ?8 E7 {* M  y7 J$ k; w' t0 ?; G
6 {& Q0 C' g1 k4 C
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

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