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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm6 X$ a. X1 Q' P* @9 I, Q
IDE: KEILv5.27
. T/ ~4 H7 `2 `" w3 RFirmware Package:STM32Cube FW_H7 V1.8.0/ S* z; r( {9 ~5 o; Z
芯片:STM32H750VBT6
4 C- w/ L# T7 I& n. m3 v$ b8 C0 k( i0 j6 J$ e% X
20200923170713848.png

3 h  o9 a2 [3 i" H4 z0 W3 E) n
  g0 e& J9 k, Z- O开启tim2输入捕获" \% T" l1 R- ]
20200923170800298.png

% k# |, `' F+ x6 o  e  K  N# o7 d, i0 O5 I4 b6 \( s4 q
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。4 _; D9 G  I" F4 a) s) g
) H2 L: z4 M6 U* S
20200923171321738.png
$ f! i. z. t  f( G

  @1 ~6 s( y8 }3 n通道一和二都配置成捕获上升沿。( E" N4 z( A3 j3 @

, {6 K' z  @  }4 D" i
20200923171403115.png

& K7 ?) K' ]) P4 a" {6 r8 _% N! O" b9 d& a
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。8 [9 e: c! ?7 c: |" }+ y0 D
" B0 h' ]4 F1 {% h9 {3 r
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
    : ]6 }7 `8 T& n
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
    " e2 c% F' H# |/ f7 R& w
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    ( B# I% x3 S! Z5 y; G: v
  2. {//hal库输入捕获回调函数、( j& ^9 E! w9 a  N
  3.    if(htim->Instance == TIM2)' ^  k9 _& k" h" q5 C
  4.          {//判断是否为TIM2
    ; F+ h- n. h+ J% y
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
    ' Z& o: m6 H0 l( H. `# V" @/ C
  6.                          TIM2_CaptureChannel1_Callback();
    & ?6 R4 _+ t) F
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    5 M  l! Q$ r# `! I: y  C: U4 \
  8.                          TIM2_CaptureChannel2_Callback();
    $ x8 L% P$ t: B4 s8 V; S( L& Q
  9.          }
      T% ~4 p; i3 F' [- c
  10.    if(htim->Instance == TIM4)
    ' M) J5 H4 i: Y" ]0 S& `) I
  11.          {& Y7 A; {4 h0 \' i
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    9 p4 Y8 @1 p$ S+ L/ P# }( b; A
  13.                          TIM4_CaptureChannel1_Callback();
    ' ~9 v2 Q1 S) H8 O4 I8 {$ Q. B
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)3 Z; ]; {( R0 c. {8 V) h
  15.                          TIM4_CaptureChannel2_Callback();# X6 u2 D! l/ L- ^6 q" @6 v
  16.          }
    2 g9 y4 a( T7 u6 |) b* d' x
  17. }
    # f& \/ i% p; Z9 w
  18. ! G. f2 T8 \4 l, ~
  19.   a7 w, \- b0 r2 O7 p5 d5 x
  20. / ?: t' R7 @, ~
  21. void TIM2_CaptureChannel1_Callback(void)
    3 @! W* R: I* b/ |7 ]
  22. {3 J* O& M  }0 n) w
  23.          switch(tim2_ch1.capture_edge)$ v8 `( I  I2 b. l3 s
  24.          {
    ) @2 l7 y$ P! A( L- C
  25.                  case RASING:8 y- a! B5 V; ~9 O+ T
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
    2 O. U* K( C# P  W
  27.                         tim2_ch1.capture_edge = FALLING;                8 F* R; C5 d+ j) }; Q
  28.                         
    - C2 s- \' v" O6 l0 }9 e, N
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);3 F3 t, O8 \. `' v4 G
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);
    7 ~) A# M: E9 R8 D
  31.                   break;0 M# ^% X0 D. b4 C5 C! I5 ]/ C& @
  32.                  case FALLING:9 [. G8 M' O: w% u1 ]8 @8 P
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
    ! f5 x$ b( r2 S( B5 T" X: m
  34.             tim2_ch1.capture_edge = RASING;                # q/ _( Y+ u% T2 X, d* P4 T( R
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         
    + _2 o& y& V& q, \) [
  36.          }( j: e: `$ j& Q0 u7 a' L& ]
  37. ) ~) k) @  a( F; D4 y: A+ `
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \
    * o, n; o- @" l+ _. S
  2.   do{                                                                     \- V: K: u) ~8 O% t1 [0 k5 k
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \
    ( R% h7 C% R" e" e& n3 o3 p4 z
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
    " o! H1 P" i0 b3 ~% ^* K, J
  5.   }while(0)
复制代码
; k) J4 G/ ]" @0 X, Q  ~5 G8 w
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
0 r8 V8 X" x7 x; F& s8 F* |9 y$ c
5 z7 I4 p3 q' z( I
  1. __HAL_TIM_GetCounter(&htim2)  n% F/ G0 [) j" `2 {$ F
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。  C) p0 _* [2 P! i* [7 S
实验结果:50HZ方波捕获到的周期为20000us基本不变。% y* \3 W. H# [

( @2 z( w. d$ E( L) m+ h# {
! M1 H0 l1 @6 S5 u' N. f+ y- S' T2 E, E' E' [' r; F6 P9 \
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版