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

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

[复制链接]
STMCU小助手 发布时间:2021-12-24 18:00
定时器! V, T% }) z) ]2 ~, {
1、STM32H743 内部包含 10 个通用定时器(TIM2TIM5,TIM12TIM17),
; l( q! a/ p( u: r每个定时器都可以用来产生 PWM 或者用作输入捕获
8 m+ S' g+ I- |7 X3 j9 G/ s: U' g不过 TIM2~TIM5 有 4 个通道,TIM12~TIM17 只有 2 个通道。
8 w* \7 P! c- G9 H5 g2、STM32H743 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32H743 的每个通用定时器都是完全独立的,没有互相共享的任何资源。5 R( I  D, }% `7 R& ~3 m; A: R

/ z  l' J1 ~; a3、如下事件发生时产生中断/DMA(TIM12~TIM14 不支持 DMA):
+ \1 b3 ?; F+ }; m* M. TA.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
/ l3 \% x8 k* UB.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数), ^4 c8 V& c5 H- V5 v8 J! t
C.输入捕获& X2 C% Q9 \& j- `2 y
D.输出比较; \- R+ @  ]0 e: r
E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM12~TIM17 不支持)3 X8 {- L1 Y* y5 Z( T' I
F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM17 不支持)
5 w# W. p/ e$ M" x0 g4 @$ k9 _5 f4 _9 i2 d# i, x9 F  D) ?
4、通过修改 ARR 的值,可以改变定时时间。另外,通过修改 PSC 的值,使用不同的计数频率(改变图中 CNT 的斜率),也可以改变定时时间。9 a: M7 ^; R  D1 |
0 \. I' U. Y) T" _$ y
相关寄存器; C% O4 M- X! ?# p# K4 i% N4 g
DMA/中断使能寄存器(TIMx_DIER)。
: R8 O5 |" d5 D9 u控制寄存器 1(TIMx_CR1)2 Y$ a7 J. i3 `( |5 A- p
模式选择寄存器(TIMx_SMCR)
% i0 H  M) |  e1 E7 _( A. `3 E预分频寄存器(TIMx_PSC)
3 f% ?$ G% [5 w4 C" `# V1 Z$ }TIMx_CNT 寄存器,
0 h. }0 |- |4 I7 ~( N( q! }
6 k. H" C, x9 T" C8 g程序设计
* J' @$ V2 b) @TIM3_Init(u16 arr,u16 psc)函数中的两个参数可以计算中断时间,公式如下:
& w! Y7 P: N& w; d4 BTout= ((arr+1)*(psc+1))/Tclk;6 I, y1 L4 y" }
7 v% n1 ~/ ?8 V4 I; D7 V
PWM输出8 }7 \! n$ q: F4 C
STM32H743 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出!这里我们仅使用 TIM3 的 CH4 产生一路 PWM 输出。, I. K# [0 y3 }8 u; R% H& }. M
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),这里我们需要说明的是模式设置位 OC4M[3:0],此部分由 4位组成。总共可以配置成14种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种 PWM 模式的区别就是输出有效电平的极性相反。
) u6 n( k  h# GTIM3 的捕获/比较使能寄存器(TIM3_CCER),该寄存器控制着各个输入输出通道的开关2 ~( n/ u4 G" U# [% l
如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存(TIMx_BDTR),- M6 d; l. x) l; o6 O- \; `) Z0 ^
6 [; S; C0 E' `( s9 V# |6 ]' D
步骤
& w, A2 O3 k# |% ^; F& j- p1)开启 TIM3 和 GPIO 时钟,配置 PB1 选择复用功能 AF1(TIM3)输出。, `& y( [! Z/ A3 e  j. L+ y
2)初始化 TIM3,设置 TIM3 的 ARR 和 PSC 等参数。
/ h, y3 S" x7 G" z3)设置 TIM3_CH4 的 PWM 模式,输出比较极性,比较值等参数。  [6 B. G4 z" S1 z4 o2 i% X# m
4)使能 TIM3,使能 TIM3 的 CH4 输出。
3 C& D6 G) j" T5)修改 TIM3_CCR4 来控制占空比。+ B0 W+ u' E: V. l! t$ V1 P

' G. W5 L% ?9 i4 a6 x' q输入捕获:输入捕获模式可以用来测量脉冲宽度或者测量频率。
' F6 H% r1 O& \+ \原理
6 [" k4 U6 R5 E  r8 u4 r# k输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来1 t( B- s: u5 \; p" r
说明输入捕获的原理,如图 14.1.1 所示:
( C7 |& S, ^( [. I( Z: s  j! v6 b/ d- H, ~! _9 o  D& @' B+ X
20200113164705485.png

; S$ g' J9 z% o0 O* M
4 F/ V! l" X# F7 x2 r
图 14.1.1 输入捕获脉宽测量原理
2 a2 Y& Z/ r1 [" ]8 D2 s
如图 14.1.1 所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 的时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这
, Z% l, H& \7 S9 F, }: U; T样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。
7 k' |3 N; f  v- C- a在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出做处理,防止高电平太长,导致数据不准确。如图 14.1.1 所示,t1~t2 之间,CNT 计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。
( _* ^4 f/ S3 r" m输入捕获的原理,我们就介绍到这。
, V& U7 E7 S: _8 q) G; x, g
% f% i0 m' b4 h) \9 G: L步骤
( W$ Z, X# b/ O) j/ l4 @1)开启 TIM5 和 GPIOA 时钟,配置 PA0 为复用功能(AF2),并开启下拉电阻。2 D# w; E4 d6 @1 Z! j% n
2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。
, J$ k, c  e1 l9 g3)设置 TIM5 的输入捕获参数,开启输入捕获。* U% y1 k$ {5 c5 E! u/ u1 F
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)
* Y& ^+ r% B9 |5)使能定时器(设置 TIM5 的 CR1 寄存器)  e- g9 l0 W- Y  `( U7 n/ x( r9 h
6)设置 NVIC 中断优先级
( @" O, `$ z0 V  I7) 编写中断服务函数
' v; h9 z1 x5 v) e9 Y+ Z
9 I  f0 |: U' L& o  n. R1 }5 D
. u; K( s& O5 D* ]! |7 T% T( @
: {6 P0 X/ p) M) \/ r, @, V, ]4 W$ P8 p# }" o" k2 z9 @

& z( T& p0 z& ]  a& G4 L
收藏 评论0 发布时间:2021-12-24 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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