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

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

[复制链接]
STMCU小助手 发布时间:2021-12-27 20:00
简述:使用TIM2捕获pwm* A/ H. ]' M) {$ E. v2 z5 Q
IDE: KEILv5.27! C' ?; {8 K* l
Firmware Package:STM32Cube FW_H7 V1.8.0
% p8 a$ V, @, \3 J芯片:STM32H750VBT6
  e4 }4 |' Y4 f9 t9 s2 u) A4 D" n, x0 i' V% }2 J& I  F, z9 G7 g
20200923170713848.png

( X/ g# ?: t9 r1 F4 ~, b$ [: K7 z, e( k+ z/ z5 i
开启tim2输入捕获
$ T' l5 N. U- p6 F; Y8 y) @
20200923170800298.png

/ U; V  ~  f" a1 Q4 ^8 B; V. {: b% g6 q. R# X0 o! L; a
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
; E% X- o  A2 L/ U7 C$ y- r
7 s( u0 p1 U) b- R2 C
20200923171321738.png

8 R7 {% I: `. B; V& m* s
. a: {7 P* C6 X: w0 {通道一和二都配置成捕获上升沿。
- a% m8 a0 Y2 h" C7 Y% N8 `- z' R( E6 N! L9 J$ W0 c. t
20200923171403115.png

# F% J) c( H$ g6 E5 g6 Q% Q
/ {) k* O* [1 z管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。4 c, _* m( _7 }# D+ Q( [
% O  x2 p0 F8 F
  1.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); 3 L8 D2 T! J+ }: L& R* s
  2.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
    ) g! ]+ H" \! e+ x1 y% w0 \
  3.         //开启tim2两通道的输入捕获
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    0 S7 d1 `1 J) ?, p8 A8 k
  2. {//hal库输入捕获回调函数、2 Z; ~% p8 m8 @4 X6 G4 t0 J
  3.    if(htim->Instance == TIM2)# p3 x" ^4 \) b. U% x
  4.          {//判断是否为TIM2* s; s- ]+ P: m0 t
  5.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一  `" G9 W9 o/ Q9 h) G+ E
  6.                          TIM2_CaptureChannel1_Callback();/ `) Z7 Y- z8 U8 d* b+ ~8 o! z
  7.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    4 ]# i5 b" m+ K' B
  8.                          TIM2_CaptureChannel2_Callback();
    , d3 _9 v8 t7 P/ H
  9.          }. [5 e# ^0 f& i# }8 q7 G3 L
  10.    if(htim->Instance == TIM4)' J5 G2 ?1 b( M" }2 o) v
  11.          {
    ; y* G( N$ s: v& B' O) ?
  12.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)2 n; B$ F' L/ h* P1 P/ E
  13.                          TIM4_CaptureChannel1_Callback();
    : D* d" l7 _& u
  14.                  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    2 e% `& W  p+ R# Q! j) Z. D
  15.                          TIM4_CaptureChannel2_Callback();
    ' G4 ?  b2 B; c, V8 R% H
  16.          }8 h9 I/ d6 s  ]( F# }
  17. }& s- U2 u6 O' g( G5 ]7 F( N

  18. . q4 g9 v: G6 b4 l% r2 A5 w

  19. 2 c  I; g- y% F2 q* |: C) H

  20. 0 T  s9 G# Q+ A0 J
  21. void TIM2_CaptureChannel1_Callback(void)
    4 D3 C% {0 {' S* b# S/ y+ e
  22. {
    ' {* H, a# M/ e4 H; d  Q; k
  23.          switch(tim2_ch1.capture_edge); {5 ~3 m4 W; q$ n
  24.          {
    9 H0 w' a; b0 ]; E' h
  25.                  case RASING:6 d8 }' A3 x7 }: O, w8 _* l/ _
  26.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
    9 b$ T% J: ~! C6 [6 `8 V
  27.                         tim2_ch1.capture_edge = FALLING;               
    6 T  w! U( y% |5 m1 H% S
  28.                         . L3 |2 B& w7 }0 A# A
  29.                         tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);. `7 j% \# p1 a1 e( \) F( U
  30.                         __HAL_TIM_SET_COUNTER(&htim2,0);3 y8 O  {3 k! ]$ e( P
  31.                   break;
    5 U" g3 N1 z2 f6 \2 l  L
  32.                  case FALLING:/ M7 l. p: s- P) U
  33.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);( h: z+ l1 R$ ?: m( Q
  34.             tim2_ch1.capture_edge = RASING;               
    - I8 b; w. b: K4 X$ c$ H
  35.                     tim2_ch1.capture_half_period =        __HAL_TIM_GetCounter(&htim2);         2 |/ O9 G& _4 B- A& \! M# f. y
  36.          }
    # v: K4 S1 r, |1 W% O
  37. ' p* N6 F' N& F& g7 ^( @" E- b
  38. }
复制代码
  1. #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \5 [% d# c; v1 u3 R
  2.   do{                                                                     \
    2 {6 n0 {/ s0 o- Z
  3.     TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \
    1 o( L$ i+ q3 |4 |9 K; ~3 v
  4.     TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \) {0 l+ e" K  d8 D, s
  5.   }while(0)
复制代码
3 M& N, z2 W, i, K( l+ q
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。# J' C5 A7 k0 q" I1 \

; P. L! s) j8 [4 m3 q, @
  1. __HAL_TIM_GetCounter(&htim2)
      v- s- R: W/ E+ f6 i4 E  [
  2. __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码
这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。
% T! \6 A/ H7 J' F1 g0 N" J实验结果:50HZ方波捕获到的周期为20000us基本不变。+ e* F0 t. f# j/ g( L/ k
) Y% o8 s" f3 Y9 Z% k  U7 Q

, ~  l* X8 e' o; T: y. e, W% F" S. E* B* p
收藏 评论0 发布时间:2021-12-27 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

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