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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm* U; O/ |1 ]4 l9 ?' D! B
IDE: KEILv5.27
2 j" }( [' e4 W$ d4 VFirmware Package:STM32Cube FW_H7 V1.8.0( D+ G! y1 h# g
芯片:STM32H750VBT6; C% }. u5 `( Y$ Q0 k) q

( [1 V# }7 k0 v3 ^0 x) {. Z8 T! l! z
20200923170713848.png
  c7 b* R" |4 r8 _

. m6 k& |. H# ], y开启tim2输入捕获
+ k; V0 }: q, k" ?5 y) W5 Y
20200923170800298.png
5 N4 }: X3 j. o! S, o5 g
4 p+ E- b0 J' A8 [
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
& v7 O: R! Q3 |7 t1 `+ |; A6 ?- \+ Z. p+ H- h+ ^
20200923171321738.png
5 N( N+ w; p; _! F: i: A
5 h- I# |# U6 A
通道一和二都配置成捕获上升沿。+ H) r: O' o2 l% H8 x! p# z

! k3 p' l0 V/ A0 X7 i
20200923171403115.png
+ S6 H- b+ {$ ^! _2 R
" M! Z3 ^- L% c% a+ r9 o
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。# n1 \- O. y. x% O: I$ N1 K5 X

6 [4 B2 C) B: g: e4 B! d2 u
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
    " O: Q$ ~" Y: U7 @( B* F/ F
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);+ f0 g4 v7 {/ H9 I0 V; i5 O, O0 X
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    ) ]0 ?% |  x2 s4 C$ M2 M0 P: W( M3 u
  2. {//hal库输入捕获回调函数、9 [3 v7 Z, i4 h( y) y# J5 `
  3.    if(htim->Instance == TIM2); a) W/ D6 M; h* T; e5 w& d7 f
  4.          {//判断是否为TIM2
    + H! F* l- _$ F7 ^
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
    & y" @- h0 E' {6 K* m; Z$ a
  6.                          TIM2_CaptureChannel1_Callback();! H( q1 X+ M6 B
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)5 D8 f  b$ }. i4 A/ Z
  8.                          TIM2_CaptureChannel2_Callback();, b; m% u1 d" t! g( U" v
  9.          }
    # g! k0 ?4 L. ]2 y, b- d# K% l
  10.    if(htim->Instance == TIM4). g3 Y5 D8 z- S/ U7 j
  11.          {* \& z3 _" `; N% K+ ~6 \
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)% W6 J9 F% {% B
  13.                          TIM4_CaptureChannel1_Callback();
    # ?" a9 R2 ?4 o6 z6 h( w5 n
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2), R  T: g9 V& u! R* f9 S* ]2 R  p
  15.                          TIM4_CaptureChannel2_Callback();
    : L" u3 c0 G7 C/ Y
  16.          }# s8 q8 E( m, u" F! N& M* z8 m% ~
  17. }$ u  W" ^5 ]' P$ X* Y9 c* ]1 I% A
  18. 7 z; S; a7 a1 L+ Q! h- j$ t
  19. 3 @* o3 z2 m3 m' l5 R

  20. , }# C/ K/ y$ A; n% W6 u; n
  21. void TIM2_CaptureChannel1_Callback(void)
    : _* N1 D( j% I( v, J; {& H$ `
  22. {
    " ^: G2 g8 s1 y
  23.          switch(tim2_ch1.capture_edge)) y+ w% ~  H. d  Q5 v  ]7 X1 i% h
  24.          {
    , I( R' J" V. r0 M' z
  25.                  case RASING:
    4 G, ?) w" D& a/ O: `! H
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);) r+ X# ^: L: @4 N  ~0 y* P
  27.                         tim2_ch1.capture_edge = FALLING;               
    * B) k  ]: l/ s$ N1 n7 f, d) Z+ x
  28.                         
    ) \4 x3 ^3 _/ t5 d6 }
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
    3 W; L# K* F) P9 e2 V& O' `
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);3 k0 U6 k/ l& X4 a6 o
  31.                   break;
    . E. @. X9 [+ M+ o' U1 n
  32.                  case FALLING:/ N' v- ~9 r) `# [. e/ C. N
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);. P/ C$ H2 [2 T! J) L+ d( b
  34.             tim2_ch1.capture_edge = RASING;               
    8 _5 C2 g! I! j% B% P) M, @% J  e
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         . E9 T0 N% M& A8 i6 d2 w
  36.          }
    ; n# d3 |  Z% }: ~

  37. 8 `: q: T6 s+ E; y! _4 K8 N: q" ?
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \. k3 g0 C$ T3 p8 h. {
  2.   do{                                                                     \
    ; F: D/ b1 K: u2 L. [9 B+ v
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \
    . j9 P' [) a% B
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \  Z% v4 \. \7 }" q8 p, d0 M
  5.   }while(0)
复制代码
8 }& I8 A; M# P6 g' q2 ]
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
7 t2 g$ {! O& A: t$ p8 M( T* a5 J" v- f1 j; _7 j
  1. __HAL_TIM_GetCounter(&htim2)6 \# a9 t0 y- ]7 x+ n$ ]' w
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。& R' A( h2 D" K( |- w6 |! c
实验结果:50HZ方波捕获到的周期为20000us基本不变。
6 U: K/ a2 ^/ R- S2 v( M; k- h4 ?- P
+ N: ?* h+ A/ A/ R! [! A

4 a% A( S$ W5 P! E6 r: \- D! J
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

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