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

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

[复制链接]
STMCU小助手 发布时间:2021-12-24 18:00
定时器
) \! T, y$ _  G" ]7 j1、STM32H743 内部包含 10 个通用定时器(TIM2TIM5,TIM12TIM17),
) x, `$ ?$ X0 S3 @$ Q, a' }每个定时器都可以用来产生 PWM 或者用作输入捕获: N3 c. q6 L* z1 R# L
不过 TIM2~TIM5 有 4 个通道,TIM12~TIM17 只有 2 个通道。9 L) `# ~1 O, u" I
2、STM32H743 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32H743 的每个通用定时器都是完全独立的,没有互相共享的任何资源。( D$ W9 |4 ~9 a& u. H) |' I

7 s9 Q& O4 B7 E: W3、如下事件发生时产生中断/DMA(TIM12~TIM14 不支持 DMA):, e: R5 g/ w5 t/ D+ u* F8 F1 s
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)* n& P+ T$ [7 e2 d3 ^
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)/ ~% s, s# l4 R9 w( L
C.输入捕获+ ^& w$ f6 X- j
D.输出比较
, t& t6 W" M1 x5 j4 LE.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM12~TIM17 不支持)- r& [  v' {% S: v. ]# z, z
F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM17 不支持)
  e* ~# I+ ?; S* z) o0 y, D6 l" l0 F+ l' @/ |5 p9 I0 t3 [) t6 e( Q
4、通过修改 ARR 的值,可以改变定时时间。另外,通过修改 PSC 的值,使用不同的计数频率(改变图中 CNT 的斜率),也可以改变定时时间。: K% ~. u& o3 g) E0 V

0 `+ p. Q5 j" k1 L: h相关寄存器6 M, L' L7 r+ J* x( k
DMA/中断使能寄存器(TIMx_DIER)。& R$ b9 \  e) [  H
控制寄存器 1(TIMx_CR1)
0 y7 g, d2 V( M& f+ D* A9 t  V模式选择寄存器(TIMx_SMCR)
7 ?+ d, A. y5 K- T8 A预分频寄存器(TIMx_PSC)4 m% R  k) A( S( u
TIMx_CNT 寄存器,+ y- T$ c; Z9 G5 d# y3 K

3 ^0 `. G, ?8 U) _  r$ K程序设计3 W9 P$ U1 ?% W" c/ I6 Q' Q' m+ k" q
TIM3_Init(u16 arr,u16 psc)函数中的两个参数可以计算中断时间,公式如下:2 P7 S4 m1 N' D8 }5 u& y1 r
Tout= ((arr+1)*(psc+1))/Tclk;
: ?0 `' O4 l0 i5 a, o8 g: \
& T& o3 D. R3 E2 |6 |5 YPWM输出
! u4 ?7 M3 k4 c5 I& m  hSTM32H743 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出!这里我们仅使用 TIM3 的 CH4 产生一路 PWM 输出。
6 K& W! }2 K" h8 |7 d* \" E首先是捕获/比较模式寄存器(TIMx_CCMR1/2),这里我们需要说明的是模式设置位 OC4M[3:0],此部分由 4位组成。总共可以配置成14种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种 PWM 模式的区别就是输出有效电平的极性相反。
3 l* ]4 f' G+ E8 X& T  [TIM3 的捕获/比较使能寄存器(TIM3_CCER),该寄存器控制着各个输入输出通道的开关
  A% ~1 y4 x; |; j7 F3 ~如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存(TIMx_BDTR),
; a8 b" k! ?8 \& l
& P+ t7 L( u) N4 b8 C  D7 R5 p8 F3 `& K步骤
9 l) a- o$ n# _( l  ?0 |! e! ^( ?1)开启 TIM3 和 GPIO 时钟,配置 PB1 选择复用功能 AF1(TIM3)输出。; z; u$ ^1 A) Z) u4 x/ U
2)初始化 TIM3,设置 TIM3 的 ARR 和 PSC 等参数。1 K! p& J7 u$ J4 p& |' Y$ a6 |0 k3 _
3)设置 TIM3_CH4 的 PWM 模式,输出比较极性,比较值等参数。; V+ \2 m1 H! b
4)使能 TIM3,使能 TIM3 的 CH4 输出。1 T" |" e( K* H' j
5)修改 TIM3_CCR4 来控制占空比。
8 {, J# L1 m; B4 H3 ~4 T
: G# j" {7 {: \' c. j  P输入捕获:输入捕获模式可以用来测量脉冲宽度或者测量频率。
: T& \- g  X, T原理- `/ j* }- m7 ], f' V7 A
输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来- W" N8 j6 {# s% ~
说明输入捕获的原理,如图 14.1.1 所示:
5 \3 E8 @# M' h* ?* R# q8 J1 o+ e$ \# e! a9 D$ s" N
20200113164705485.png

: J4 }3 {2 x# D
+ \% [. P6 G. h) e; k& g7 \5 b
图 14.1.1 输入捕获脉宽测量原理
4 z3 y, r( R5 P. W9 v/ V# v
如图 14.1.1 所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 的时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这' z5 p: }! @- {1 {2 E/ j% h2 W# d
样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。! m  N# c8 U1 y, l& S* ~- `
在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出做处理,防止高电平太长,导致数据不准确。如图 14.1.1 所示,t1~t2 之间,CNT 计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。
+ f1 h+ y# {' M  a9 u! ]" k输入捕获的原理,我们就介绍到这。
4 q  ]3 K' S: }. a" v, B3 F9 P% J; J8 ~$ ]# W8 y! h
步骤
  y+ V! a; ^4 ~1)开启 TIM5 和 GPIOA 时钟,配置 PA0 为复用功能(AF2),并开启下拉电阻。* J1 X  a# s; o7 y7 r  Q* h
2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。
/ K# }7 b6 v: }3 {; j3)设置 TIM5 的输入捕获参数,开启输入捕获。* M' ]( N3 \  Z8 D
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器), h+ F; n$ V3 x9 G+ t
5)使能定时器(设置 TIM5 的 CR1 寄存器)
  s" |* m" c  ]: A+ T$ l! t2 ]  M6)设置 NVIC 中断优先级1 P1 v0 u, h2 X: m
7) 编写中断服务函数
2 E* h$ i/ W( P- N8 V3 }6 Z0 u- {- |' [

1 Y0 U0 h( F: g, u- ^9 V# }% ]1 D
" M; b+ N7 j5 x5 t+ |$ ^& Q% V; R
. ?; w3 C& K, T# z% @! f+ Y
收藏 评论0 发布时间:2021-12-24 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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