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

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

[复制链接]
STMCU小助手 发布时间:2021-12-24 18:00
定时器
* r' r& U$ [/ F5 n% }0 h* k  t) U1、STM32H743 内部包含 10 个通用定时器(TIM2TIM5,TIM12TIM17),
; S: S: k* z6 ?7 z% U& ^每个定时器都可以用来产生 PWM 或者用作输入捕获
2 l, c3 Q1 d: o. ]) a不过 TIM2~TIM5 有 4 个通道,TIM12~TIM17 只有 2 个通道。
. g4 }: f9 r# }0 _2、STM32H743 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32H743 的每个通用定时器都是完全独立的,没有互相共享的任何资源。6 e4 D1 F9 s( l" ~8 t4 N2 ?6 W

. u9 {9 s: i: `( N  l3、如下事件发生时产生中断/DMA(TIM12~TIM14 不支持 DMA):. J4 W8 t9 d3 ?5 A& `- n% {
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
" i- `$ R9 ?* V0 U3 n; PB.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)# b/ i2 q" A9 q$ J' }4 r* R2 Q5 X
C.输入捕获2 G1 H% s  D6 g3 T
D.输出比较0 J: J0 M/ R( f2 a( ]
E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM12~TIM17 不支持)
; F" G) w* L; s, b! @' HF.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM17 不支持)( d1 Y$ U' T: V6 T3 A* |

5 |( }1 T7 N: {+ q4、通过修改 ARR 的值,可以改变定时时间。另外,通过修改 PSC 的值,使用不同的计数频率(改变图中 CNT 的斜率),也可以改变定时时间。
# _8 m; o; {4 v& W$ L
! ?  G! ?4 K( B7 e0 m相关寄存器* ~# R; ]* c% }( ]/ Z
DMA/中断使能寄存器(TIMx_DIER)。  R& T" I; g. a5 q. o9 s5 V
控制寄存器 1(TIMx_CR1); \3 y3 J7 N) I, X- F
模式选择寄存器(TIMx_SMCR)
; P% h1 w5 x; r* r$ [预分频寄存器(TIMx_PSC)4 |/ k1 @( e; N: U2 O) i7 ~/ _# \
TIMx_CNT 寄存器,
! d5 C# x% X: I. [+ V' Q3 O
/ W& q' P) K: r3 q4 x程序设计9 _( `1 f' F/ A' ?
TIM3_Init(u16 arr,u16 psc)函数中的两个参数可以计算中断时间,公式如下:2 T: @) _% B4 i* n0 w. C# k' {0 U
Tout= ((arr+1)*(psc+1))/Tclk;1 G  S1 v# D' F1 U. T: ^

; g+ Z5 @% v+ \& fPWM输出- I% _/ \1 l: V+ u% b) G
STM32H743 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出!这里我们仅使用 TIM3 的 CH4 产生一路 PWM 输出。
" Q% Z8 u8 P1 f5 [! j, G! y4 s首先是捕获/比较模式寄存器(TIMx_CCMR1/2),这里我们需要说明的是模式设置位 OC4M[3:0],此部分由 4位组成。总共可以配置成14种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种 PWM 模式的区别就是输出有效电平的极性相反。/ R. E* T1 @% Z: b( n
TIM3 的捕获/比较使能寄存器(TIM3_CCER),该寄存器控制着各个输入输出通道的开关
# z8 d) x" [% _6 J8 d- ^* h如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存(TIMx_BDTR),$ O9 ~4 U( \5 h5 A5 L

1 l1 d: Q4 c8 {. ^& v步骤3 k% k& ^# b4 x1 G
1)开启 TIM3 和 GPIO 时钟,配置 PB1 选择复用功能 AF1(TIM3)输出。( k3 j) I; t1 E( Z8 u; V2 a
2)初始化 TIM3,设置 TIM3 的 ARR 和 PSC 等参数。% L" n1 w4 i4 Z6 ^! a) X7 Q* [
3)设置 TIM3_CH4 的 PWM 模式,输出比较极性,比较值等参数。
- w& Y' _7 D5 {5 ~% g6 K4)使能 TIM3,使能 TIM3 的 CH4 输出。* a* P( E5 V( p* Y+ c
5)修改 TIM3_CCR4 来控制占空比。0 p' m  u0 Y* T

5 k4 C3 g. R( M' P& d输入捕获:输入捕获模式可以用来测量脉冲宽度或者测量频率。
4 r) ]! R! H7 J1 i# `9 u7 p原理' k) y+ ]$ b) E* r. {
输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来
7 M( E, f) G* k* k4 ~1 d5 ^; y说明输入捕获的原理,如图 14.1.1 所示:& t# c4 V$ ^! t
  W: k+ W# ]; a4 k& q. w9 a
20200113164705485.png
! {$ @6 y# V& y! C$ u$ F& S

/ d. ^, R2 _- n8 c4 z/ w$ t1 p
图 14.1.1 输入捕获脉宽测量原理
- g: d8 k# N: x, g$ k
如图 14.1.1 所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 的时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这
, U0 O' m+ V8 h0 L样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。( `0 Z( Q" c% W
在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出做处理,防止高电平太长,导致数据不准确。如图 14.1.1 所示,t1~t2 之间,CNT 计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。  D$ m6 S9 h+ T3 g" y% H
输入捕获的原理,我们就介绍到这。
6 b8 T" v9 E1 J: R: y+ ?6 M" ~- s, Z5 V" h# z! k6 G7 I
步骤
' K$ ^& J: w: g1)开启 TIM5 和 GPIOA 时钟,配置 PA0 为复用功能(AF2),并开启下拉电阻。
" x3 H  h. @& z9 W2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。
, d- K' _4 w/ M$ k# ~0 {' k; K+ \! ]3)设置 TIM5 的输入捕获参数,开启输入捕获。
) ^% a9 v; m5 w+ ]4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)! H8 g9 @9 M+ y& L
5)使能定时器(设置 TIM5 的 CR1 寄存器)
. G' s: k* L9 b  L0 v5 v6)设置 NVIC 中断优先级
( W% q3 W8 k7 p7) 编写中断服务函数9 G* J$ U( {" ]% D5 m; o3 `

0 i" a) z1 H/ @
- D- X) P5 k( O. q: M' @
. a" v  R! {$ Z; n& u
5 V0 Z2 q9 n2 j
9 X* ]. \% N: b2 |: ]0 g+ A5 r8 `
赞 收藏 1 评论0 发布时间:2021-12-24 18:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版