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

【经验分享】STM32H7学习继续(STM32H7系列8) 定时中断,PWM输出,输入捕获

[复制链接]
STMCU小助手 发布时间:2021-12-24 18:00
定时器
: S4 d+ U# ~5 V" H1、STM32H743 内部包含 10 个通用定时器(TIM2TIM5,TIM12TIM17),+ f/ r* X  j7 H
每个定时器都可以用来产生 PWM 或者用作输入捕获
; G% ~; n1 m4 J6 J" p不过 TIM2~TIM5 有 4 个通道,TIM12~TIM17 只有 2 个通道。
' `/ Z, j0 X1 J# E' m( D4 P0 v8 c2、STM32H743 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32H743 的每个通用定时器都是完全独立的,没有互相共享的任何资源。" V' d! a$ K/ p+ W. f. X

2 a6 y* ?! l0 ?; }! o* G  y" s& A3、如下事件发生时产生中断/DMA(TIM12~TIM14 不支持 DMA):
1 s: Q% ]% z9 ?& D* _' rA.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
# O# B. ~7 w/ U; t5 _$ w5 x8 |* F4 SB.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数); P( f6 E9 g4 R5 b8 F9 Q9 B6 s" z
C.输入捕获% y+ {8 \% {9 t, t
D.输出比较
# W+ T" ]! K$ y4 N0 A" K$ X: W  D7 HE.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM12~TIM17 不支持)! R* J4 a- |4 K7 K, l% v
F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM17 不支持): S: ~- c" ]4 ?, u- i; E- ~
, B7 B, Q' \9 M% A  h. \
4、通过修改 ARR 的值,可以改变定时时间。另外,通过修改 PSC 的值,使用不同的计数频率(改变图中 CNT 的斜率),也可以改变定时时间。
3 Y" h0 o$ {* B( M3 k/ W6 I, ~- j& {7 M4 {' ~
相关寄存器
$ l" b4 \: S1 @DMA/中断使能寄存器(TIMx_DIER)。' G+ M$ {% o6 P) _' L
控制寄存器 1(TIMx_CR1)4 r$ k2 |/ Q2 e
模式选择寄存器(TIMx_SMCR)1 L3 l, {3 k1 w+ _
预分频寄存器(TIMx_PSC)' `  j2 U( g! a2 Q9 K# x
TIMx_CNT 寄存器,8 _6 n7 f/ s: ~1 R
/ E% ~7 H6 ?2 x
程序设计
. s: }+ |8 q5 zTIM3_Init(u16 arr,u16 psc)函数中的两个参数可以计算中断时间,公式如下:
& i) g4 m1 ]  n6 ?Tout= ((arr+1)*(psc+1))/Tclk;- _4 I+ e0 Z' j# n5 b

9 ^7 [- C8 e  f# }5 g; ^: ?) gPWM输出6 f4 e( {' O+ T; B
STM32H743 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出!这里我们仅使用 TIM3 的 CH4 产生一路 PWM 输出。
2 n2 {/ Q& M3 f; ]& M+ \& `首先是捕获/比较模式寄存器(TIMx_CCMR1/2),这里我们需要说明的是模式设置位 OC4M[3:0],此部分由 4位组成。总共可以配置成14种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种 PWM 模式的区别就是输出有效电平的极性相反。
7 Y3 y+ s- C( bTIM3 的捕获/比较使能寄存器(TIM3_CCER),该寄存器控制着各个输入输出通道的开关9 l& v# g9 N' c( `7 o4 x6 S6 d
如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存(TIMx_BDTR),
3 R) m, N% g* q  }9 q3 D6 i
' \1 j$ P# Y4 f/ }* d1 j步骤6 s7 R: `! k- |  m" v
1)开启 TIM3 和 GPIO 时钟,配置 PB1 选择复用功能 AF1(TIM3)输出。
  w. w6 o0 y8 _; n( o7 F2)初始化 TIM3,设置 TIM3 的 ARR 和 PSC 等参数。% K; F1 Q% m5 R/ G. J; m+ }6 m
3)设置 TIM3_CH4 的 PWM 模式,输出比较极性,比较值等参数。+ W- x& Z" E3 O# o8 ^
4)使能 TIM3,使能 TIM3 的 CH4 输出。( ~2 q$ {9 Q9 v
5)修改 TIM3_CCR4 来控制占空比。& Q" r! u' }) R  ]

' D: T4 t9 }6 E# |输入捕获:输入捕获模式可以用来测量脉冲宽度或者测量频率。
0 @: L  t! d% U9 ^" W6 U原理
# p4 O, g5 R4 V输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来  ^1 r( }8 y5 C' R7 k2 h* {! m
说明输入捕获的原理,如图 14.1.1 所示:
: Y0 [# F, p3 e7 `
: S3 q. z2 I! h6 I1 c% ?
20200113164705485.png
  S) b3 K( G4 k* _7 G
9 c* m. v' m9 M% @% Z( H
图 14.1.1 输入捕获脉宽测量原理
/ V, }/ h- R: F* }7 B% c
如图 14.1.1 所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 的时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这  w- U1 a( B8 |' T6 j2 l
样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。! N: b: V! s& k" E) |( P: z
在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出做处理,防止高电平太长,导致数据不准确。如图 14.1.1 所示,t1~t2 之间,CNT 计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。
. [+ b& N& r& o0 ?: ?输入捕获的原理,我们就介绍到这。
* W  w* \( d/ Q# D" }' L- |+ w7 X6 M
步骤
' W, d" \3 h, ]) ]1)开启 TIM5 和 GPIOA 时钟,配置 PA0 为复用功能(AF2),并开启下拉电阻。' C) m# i/ M6 v. c) b% o) q
2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。
3 t9 C* {1 Q% c/ T& S- N$ @3)设置 TIM5 的输入捕获参数,开启输入捕获。/ r& k3 H$ ~& q$ ]2 }4 Z  |
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)6 k# V. _$ o1 a& i; o) M3 H
5)使能定时器(设置 TIM5 的 CR1 寄存器)$ g* i4 H" E% V- Z" J4 x/ a, s9 V
6)设置 NVIC 中断优先级8 Z3 u  m5 ~3 d% x6 e
7) 编写中断服务函数
0 U% t. B  H4 u7 q2 R, U7 p% c; q# e* b/ }1 a$ M1 }2 ?+ c! y8 K
9 O' B1 M* r7 ]5 Z
% _4 Z& x# c' u+ N% A

: X5 I$ \' @. J2 ^( K: X5 c8 i1 d- L. C) h; z" I1 K  }% R3 h
收藏 评论0 发布时间:2021-12-24 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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