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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm
# r* Y7 s) o2 M& }IDE: KEILv5.27
8 t& d3 P2 J+ O/ I1 DFirmware Package:STM32Cube FW_H7 V1.8.05 {/ ~. e) U$ K% U$ {1 [( f( J
芯片:STM32H750VBT6
' s& x8 n( ?. H" Q0 c+ h- [$ {0 x8 j2 V8 p( |/ v, k
20200923170713848.png
; }2 R; K+ e) f

4 P* c9 \8 \* f, e) }开启tim2输入捕获
- ^3 f" b' o. ?. e2 O
20200923170800298.png

! F. p8 h0 P+ D' d1 T0 M- D+ f. k* Y/ S; |5 b+ i' d
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。/ S! i8 Y  o9 |& z
; Q+ y1 \6 b* S0 B! k
20200923171321738.png

! d0 @4 \" [% [, l' Q, D5 u, l( V5 ^2 R% d
通道一和二都配置成捕获上升沿。0 }6 w7 p" o1 o
, R4 k7 t( `! ?" G3 R
20200923171403115.png

' N' y% f: U2 o
% K2 x/ ~- R" x) }管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。$ K. |+ ^8 P# @! X6 ^( c

9 q0 W, r6 N: k$ i1 o: @
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); ) O+ z) }4 g, m9 c* g" P) G9 a
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
    + ?2 [# L0 K- o2 W
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim), f" z" T! i" M* m
  2. {//hal库输入捕获回调函数、
    3 T3 x! o& w% p8 V" T0 c0 Q
  3.    if(htim->Instance == TIM2)1 P, B+ p. \1 S# O
  4.          {//判断是否为TIM2$ w+ m) k* N8 K2 I( i( S
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
    " A% l6 k" u3 h/ M5 u9 `5 I
  6.                          TIM2_CaptureChannel1_Callback();
    - X* c0 y+ m0 N7 I; f" _2 O
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    " ^$ }, x% r! K* t7 c
  8.                          TIM2_CaptureChannel2_Callback();
    ! i# I9 E# f0 X6 E5 x9 w
  9.          }
    8 f9 i. ?( K! c- Y& g9 J  ~
  10.    if(htim->Instance == TIM4)% f1 {1 T4 R: }7 _$ O
  11.          {
    / ?# Q0 N& A$ \
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1). H- d5 u$ q3 V! S4 S7 y* A
  13.                          TIM4_CaptureChannel1_Callback();2 o: y* a; V! q) V7 |: ]7 M! x2 d) a
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)9 @6 {/ l+ j2 g' u
  15.                          TIM4_CaptureChannel2_Callback();
    1 u* e5 u- p$ i! l4 ]; Q
  16.          }
    & Y- L3 h- u2 X, N" v
  17. }* Q. D1 m. n" f' _- W
  18.   ?$ Y9 U) N$ ?) N9 [

  19. ' e- c8 |' h/ ~* J7 G
  20. + F! H. a  @8 ^# v
  21. void TIM2_CaptureChannel1_Callback(void)2 E- C) B, C* o* p) Y) z4 o; q, s
  22. {% f1 f6 k  R9 _* P7 ]
  23.          switch(tim2_ch1.capture_edge)0 Y' U' Z; }6 T( X
  24.          {
    ! M0 i  X1 C1 X+ e
  25.                  case RASING:
    / ]+ a$ p" m4 C
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);& X# _& x$ {* ^
  27.                         tim2_ch1.capture_edge = FALLING;               
    & J3 _/ e# l6 j9 z% j7 }
  28.                         
    0 ^. j% c1 a/ I% @
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);" a" C/ _' \2 S# l' `
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);
    % C4 C9 ^) x% ?$ u6 A1 }9 e
  31.                   break;( T% D, \* d& i& t, C- {
  32.                  case FALLING:
    7 Z4 H3 M+ K) B  Z5 N& H' ?
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);: o) ^4 o3 W% A# _
  34.             tim2_ch1.capture_edge = RASING;                8 c9 k8 S* D! o  p& {
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         
    + E- ?) _1 f, |1 k0 W" N) G; W
  36.          }' v% O4 I" U) D% ?9 p8 q

  37. + {* K0 x! l( P7 V1 k
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \
    & D# a  d  n5 m3 B
  2.   do{                                                                     \! k% ]( C4 u' a6 W5 V0 E
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \
    % U% q& P, ?& g1 j0 N
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \2 B& ]  T7 W- [+ T. Y; t
  5.   }while(0)
复制代码
$ Q- m4 f& ~% P" Z# i7 A( H6 A
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
. c7 G+ M5 z" n& q6 R  n
6 ]3 x+ R+ l5 ?4 R
  1. __HAL_TIM_GetCounter(&htim2)
    * c6 T3 E0 l5 Y6 ?3 O5 s, ]
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。
6 i, C* C7 V$ i- ?( X% a; {$ z实验结果:50HZ方波捕获到的周期为20000us基本不变。% ~$ u) i. y% Z; t7 s% g3 F
9 J, K8 q  a6 T+ ~
0 }8 Y! v) I6 t$ h/ y4 ?$ E; H
" }$ z! U8 o9 _9 P1 @6 `
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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