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

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

[复制链接]
STMCU小助手 发布时间:2021-12-24 18:00
定时器
1 V  T% n9 d2 w- \1、STM32H743 内部包含 10 个通用定时器(TIM2TIM5,TIM12TIM17),
$ L$ s3 ^% p  F每个定时器都可以用来产生 PWM 或者用作输入捕获1 C1 w7 X6 H( c5 s' b
不过 TIM2~TIM5 有 4 个通道,TIM12~TIM17 只有 2 个通道。
2 k9 A* x+ h/ P7 Z9 m) `2、STM32H743 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32H743 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
2 z( i3 N* P! M* |1 w+ |6 r  g: L- Q2 Y2 X# K
3、如下事件发生时产生中断/DMA(TIM12~TIM14 不支持 DMA):! O. w" p$ i: B$ ]! r1 C
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)0 d& ~7 M* X5 n8 `" |% W
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)5 R" c3 W! J1 d: x/ y
C.输入捕获
3 W0 g1 T1 z+ \" W! Y& f: ID.输出比较
  Z8 s" e, \" Z8 ^; L9 [2 mE.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM12~TIM17 不支持)
; l& H: U, _) ~3 v7 }F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM17 不支持)" H) T4 Z6 u) y9 [- y; m

. M5 b4 i! u/ L  t! l4、通过修改 ARR 的值,可以改变定时时间。另外,通过修改 PSC 的值,使用不同的计数频率(改变图中 CNT 的斜率),也可以改变定时时间。( _; ?, {5 k$ _: b/ y4 B
  K! s0 D4 [# P7 O$ f
相关寄存器+ g  D( e5 h3 D# s' U1 b/ K* Z
DMA/中断使能寄存器(TIMx_DIER)。
  k) s0 W9 h+ J- ]! O+ T' R控制寄存器 1(TIMx_CR1)- Y! h4 ]6 v* ]" A  m: A
模式选择寄存器(TIMx_SMCR)
% a3 }! q0 ]9 m' k# L* n预分频寄存器(TIMx_PSC): B0 G; Q9 f! T9 }
TIMx_CNT 寄存器,
4 V# v; j, r* [
2 x+ e+ \3 c. U程序设计
; n) m0 D* g% {# D# Y3 V8 iTIM3_Init(u16 arr,u16 psc)函数中的两个参数可以计算中断时间,公式如下:
& Q4 V: Y* |$ Y% g0 RTout= ((arr+1)*(psc+1))/Tclk;8 H% y% W7 s) V

* g. R% ?2 m7 A5 L) ]& ]PWM输出) F5 I& F' \( i  w1 H8 y
STM32H743 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出!这里我们仅使用 TIM3 的 CH4 产生一路 PWM 输出。
# z. k7 G2 [5 z! i- }. L4 I首先是捕获/比较模式寄存器(TIMx_CCMR1/2),这里我们需要说明的是模式设置位 OC4M[3:0],此部分由 4位组成。总共可以配置成14种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种 PWM 模式的区别就是输出有效电平的极性相反。  c* }# R0 \, y: P" Z# B' J; u
TIM3 的捕获/比较使能寄存器(TIM3_CCER),该寄存器控制着各个输入输出通道的开关8 B- j# O# d1 O. {, x0 @& z
如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存(TIMx_BDTR),8 H( e) V, G0 M/ o% G4 C

$ z* `" e" f4 `! y- A步骤
  C& V* S/ L3 S9 d% ]9 f1)开启 TIM3 和 GPIO 时钟,配置 PB1 选择复用功能 AF1(TIM3)输出。
4 c0 e  r' V, y2)初始化 TIM3,设置 TIM3 的 ARR 和 PSC 等参数。
1 H; T" \7 J, E  K. U$ \3)设置 TIM3_CH4 的 PWM 模式,输出比较极性,比较值等参数。9 ]6 ^  i( w/ H0 _% x! }
4)使能 TIM3,使能 TIM3 的 CH4 输出。' ^. `+ d0 D  O" h) \1 k6 X
5)修改 TIM3_CCR4 来控制占空比。! f+ q, d2 o6 v6 N* ^

0 q  L+ U, S( z0 p输入捕获:输入捕获模式可以用来测量脉冲宽度或者测量频率。
& q4 _1 k6 M& j9 a5 N& c3 ^+ g原理
( C0 m5 o/ [. s; Y输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来
2 c, q; e/ Z# V7 Q* `3 F& m说明输入捕获的原理,如图 14.1.1 所示:
7 K. I9 C3 X2 p( g/ \% A/ I' ~# m9 h2 l6 O; K/ z8 O
20200113164705485.png

, ]: X2 \! F- H5 i1 p5 `+ a
( h9 q# ~0 n6 e  N' x4 b6 F. Y7 g- ^
图 14.1.1 输入捕获脉宽测量原理

7 I7 Y2 G4 ]& ?! ]$ i2 @, y如图 14.1.1 所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 的时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这
0 T4 o- R9 K/ Y7 i样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。, n( A4 c4 ~: N+ ], }; e: c
在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出做处理,防止高电平太长,导致数据不准确。如图 14.1.1 所示,t1~t2 之间,CNT 计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。) b4 M3 D# S: P* s5 G
输入捕获的原理,我们就介绍到这。: f1 N/ U) @- i3 N' l" P1 |, _3 }1 M/ x
' S5 C+ d8 f) t
步骤2 i+ S1 O" |$ a2 C8 z$ k5 Y, O
1)开启 TIM5 和 GPIOA 时钟,配置 PA0 为复用功能(AF2),并开启下拉电阻。" k4 R+ t$ r6 c) L' |* v
2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。- r( Q! @* E% I2 P* P/ \5 n
3)设置 TIM5 的输入捕获参数,开启输入捕获。# z2 b' t1 w9 X: v. Z. t
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)
+ q1 ?; X& O( h, P; y8 C5)使能定时器(设置 TIM5 的 CR1 寄存器)" L: B! u3 b5 K0 R
6)设置 NVIC 中断优先级
5 N0 m9 d; @8 A) Z: d6 @7) 编写中断服务函数/ c, m  ^1 Q' e+ g$ k* F1 w. A

+ p: p/ L& g+ u
6 v# m5 z/ P; d8 x1 [# j3 {. n4 P8 L) U$ Y: X8 o3 K9 A

9 |% j0 {4 m# @& M) X/ R5 Q  Z4 o% Q  ~7 ^
收藏 评论0 发布时间:2021-12-24 18:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版