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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm; g9 j: Z$ Z% M( C5 L
IDE: KEILv5.27: l8 q+ v3 n) D& s+ W
Firmware Package:STM32Cube FW_H7 V1.8.0
8 X2 [3 C" d- t; I" d9 S7 _9 |芯片:STM32H750VBT6
7 p; \# a, u8 e; F# [. l' A5 a3 g) x$ O0 i2 w- |! ?3 i
20200923170713848.png
( W" e% M; Q( g. K2 Q" c
7 y3 S* _  t+ H, z; P+ F9 ^! f
开启tim2输入捕获3 w) a) n3 V$ N) q5 s
20200923170800298.png
  R! ^% u. @. p8 X7 c

$ o. Y! V- o" n: B/ p3 d配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
0 A5 ]3 Y& i2 ?3 t( N  O% \: L( y
- O# F0 A* N! T& c1 ~2 v
20200923171321738.png

9 r( M* {  F* F) q: j0 N6 {4 @7 q' m) d7 X, p; \, O6 V" E/ u8 E! t2 |, V
通道一和二都配置成捕获上升沿。3 M& [& c7 d3 A

2 |7 R. j: p! [  N9 r
20200923171403115.png

. i% o, H" m$ ]! Z- Y- O6 u8 w. W6 l. [3 {5 p6 P2 i
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。1 K, ?5 M- Y5 s6 [( ^$ x0 p1 l
) `2 ^  [8 l, ]
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
    3 U# k+ h4 C1 d  m4 C2 J
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);2 Y- }. T# j" [; g
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    , m) u( v# o& L" k5 R
  2. {//hal库输入捕获回调函数、4 D9 E' J- _% s' K& e
  3.    if(htim->Instance == TIM2)
    8 h& R6 J6 r) b9 }$ A
  4.          {//判断是否为TIM2
    5 \8 `0 @+ m0 L+ M7 ]2 z
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一+ D. e, h4 a% c9 e5 D/ c
  6.                          TIM2_CaptureChannel1_Callback();
    + v8 N5 B! R$ N
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)$ j: c, D! Q3 q9 K
  8.                          TIM2_CaptureChannel2_Callback();
    $ Q' |5 U, c1 c
  9.          }- C" P7 W% P" a7 j" @+ V0 M! @
  10.    if(htim->Instance == TIM4)
    ! A8 \3 W, f3 B
  11.          {
    4 s. R* j/ p5 \5 s6 f
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)2 ^& a& T& v0 H8 ^& z# T
  13.                          TIM4_CaptureChannel1_Callback();
    . Z* y# }. t1 G
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)8 U0 i* O  s$ n- h7 s
  15.                          TIM4_CaptureChannel2_Callback();& w3 q$ j  ^( n) }9 w! o
  16.          }
    ) }2 A) ]4 D- V: w$ ?9 K$ x0 Q
  17. }& w( K* ?$ r8 a

  18. * l+ l2 l) R- }# Y& J0 [
  19. 5 e" Q" V6 U- C6 d( j5 s

  20. # I( \8 ~* P( A9 B( ^
  21. void TIM2_CaptureChannel1_Callback(void)8 S( ~$ [8 f9 G4 H
  22. {
    ; r; T+ J2 W  S! [, M3 ~9 C
  23.          switch(tim2_ch1.capture_edge)
    2 J# }; T* Y( g
  24.          {
    / ?2 R) r* [. W
  25.                  case RASING:
    ( J+ [7 k$ g6 q# ^. B
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
    ' W) R% C! w1 d8 _5 ~7 B3 D$ ]
  27.                         tim2_ch1.capture_edge = FALLING;                / n$ J3 H6 M) {/ ^1 u% A1 `6 J% c
  28.                         8 l1 U; ^" m1 e# s6 g2 Q- t4 L
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);5 p1 Q  i9 U& v
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);. v/ v8 h. U. H' ]6 S' O0 q( R
  31.                   break;
    % R& i  ^) q$ e9 u0 K8 l
  32.                  case FALLING:
    ; F9 O* q. [7 e; H$ _3 B, E
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);6 Y0 c* g5 n+ K. X$ K/ o
  34.             tim2_ch1.capture_edge = RASING;               
    - _' {+ Z" O9 o5 z
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         7 R2 _& U: }2 y% I/ y
  36.          }) J2 [# }+ w5 Y5 ~+ B
  37. 9 F: W- J( J; P& C
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \
    . i% T! H  t$ T; C, N
  2.   do{                                                                     \5 [9 C7 c$ H& @1 M6 m" l
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \  e* a8 o8 T' ?) ^0 M' G4 J  i
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
    + W  z/ \5 A4 F
  5.   }while(0)
复制代码

, w7 l8 J" a0 R& k8 v: ^这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
' D$ p6 V9 |" G7 n7 _6 ^$ w+ ^% B# t6 `. G9 V
  1. __HAL_TIM_GetCounter(&htim2)
    ; i- ?' w4 k& @, q+ R: U
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。* y4 e$ L* c0 t& s- M+ B
实验结果:50HZ方波捕获到的周期为20000us基本不变。
, Q- C3 w( o3 h. a1 c4 w
! `: l; z  p+ \2 U. y" E6 Q$ X! W" y* s- r' s* c" p$ u

7 j5 k" |' `- w8 c
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

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