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

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

[复制链接]
STMCU小助手 发布时间:2021-12-24 18:00
定时器
& f. K; J! {, o" g- o5 N+ k1、STM32H743 内部包含 10 个通用定时器(TIM2TIM5,TIM12TIM17),
% x! m! I* q  _  f; V9 x每个定时器都可以用来产生 PWM 或者用作输入捕获9 e' y/ p6 d  Z( Z% U% c
不过 TIM2~TIM5 有 4 个通道,TIM12~TIM17 只有 2 个通道。
9 L0 ]0 ]4 z9 h  g8 O2、STM32H743 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32H743 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
% y* U  ^" p5 [% [2 B. [+ o) o. h- @" `4 q. C! C) d* d
3、如下事件发生时产生中断/DMA(TIM12~TIM14 不支持 DMA):" _* N% q1 s: \0 d; W
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)# `1 m& s# I- f+ a2 u, [4 o
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)* B2 j+ {6 k/ B- G- I% v
C.输入捕获
- ~2 u( A/ @7 B- KD.输出比较$ f) w( N" E: b" K) K; ]2 }
E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM12~TIM17 不支持)
. v) |6 B" N' Y7 _9 V: D" jF.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM17 不支持)8 G$ x0 {' T) Y, r8 L4 b
! D" B9 R" l- A" T
4、通过修改 ARR 的值,可以改变定时时间。另外,通过修改 PSC 的值,使用不同的计数频率(改变图中 CNT 的斜率),也可以改变定时时间。0 R" S! R& ^; g

& m$ p( b- c  P0 J2 |! l: o  e相关寄存器, B$ S' V; K1 B7 _% O' w0 G
DMA/中断使能寄存器(TIMx_DIER)。
$ G: `6 d7 q; m$ Q" J6 ~% Z控制寄存器 1(TIMx_CR1)
+ O# N9 I0 _( e% D& p1 j/ Q7 {模式选择寄存器(TIMx_SMCR)
1 S: V0 n6 t3 _预分频寄存器(TIMx_PSC)
' T6 t: d6 |4 ~8 e1 oTIMx_CNT 寄存器,7 K. b6 ~) a5 Q8 U2 O! i6 j1 }+ ^. u
( |1 n0 t( _' J9 T/ v$ b
程序设计
: Z/ }2 m& q. J; q3 j# w: \/ tTIM3_Init(u16 arr,u16 psc)函数中的两个参数可以计算中断时间,公式如下:
: l/ |7 E/ {* X( k3 u9 z9 pTout= ((arr+1)*(psc+1))/Tclk;
3 q% T. T& g' U0 J1 F
! \* W& I1 j% Z+ c9 RPWM输出3 l- j1 ^! ~# V' @
STM32H743 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出!这里我们仅使用 TIM3 的 CH4 产生一路 PWM 输出。
" O# i" X1 ^9 L, ^0 U首先是捕获/比较模式寄存器(TIMx_CCMR1/2),这里我们需要说明的是模式设置位 OC4M[3:0],此部分由 4位组成。总共可以配置成14种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种 PWM 模式的区别就是输出有效电平的极性相反。  g; I7 E7 Y4 [6 s. u7 i
TIM3 的捕获/比较使能寄存器(TIM3_CCER),该寄存器控制着各个输入输出通道的开关
* G7 j: t$ p5 k/ h如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存(TIMx_BDTR),
) x% d- \) Q4 b. W5 l
& n0 A9 u( Y+ L& U4 {5 t, e步骤
" L, e# h* t/ l' Z4 T0 ~! s7 Y1)开启 TIM3 和 GPIO 时钟,配置 PB1 选择复用功能 AF1(TIM3)输出。
# r7 Q4 x0 B8 R  U2)初始化 TIM3,设置 TIM3 的 ARR 和 PSC 等参数。
8 \5 v% F6 T' l! ^9 j9 z3 Y3)设置 TIM3_CH4 的 PWM 模式,输出比较极性,比较值等参数。7 x0 b* L# N% L1 p
4)使能 TIM3,使能 TIM3 的 CH4 输出。1 _9 K# r' q( Q- c8 C9 u
5)修改 TIM3_CCR4 来控制占空比。
5 @9 P9 v+ i; s7 ^3 W" L; k
+ B3 \: z4 q/ O输入捕获:输入捕获模式可以用来测量脉冲宽度或者测量频率。. v+ j/ P) X8 x8 m/ d
原理# q3 ?' `  d) @6 u/ I
输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来
  Y7 c' E+ n, W8 Z6 ]" r: V说明输入捕获的原理,如图 14.1.1 所示:
, k' k. y: s2 y% q8 r# q$ T( L/ a7 V( f+ A0 I
20200113164705485.png

3 o1 s6 M9 y4 b! F7 [  p/ _- K# k5 Y2 \2 S* Z9 M- d. V
图 14.1.1 输入捕获脉宽测量原理
2 Y: ]* |4 r$ G/ \. U
如图 14.1.1 所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 的时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这5 t0 Q# w! K% F# \4 r3 W! e
样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。
3 |: B9 A. u- K' }# i5 }5 k在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出做处理,防止高电平太长,导致数据不准确。如图 14.1.1 所示,t1~t2 之间,CNT 计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。
0 {4 j4 F$ H; {5 b输入捕获的原理,我们就介绍到这。
2 M2 A# X$ H* {" N7 s* i5 O2 E! q* b# h1 O
步骤
9 a2 Y: U5 J, H/ q4 }: z4 A  p1)开启 TIM5 和 GPIOA 时钟,配置 PA0 为复用功能(AF2),并开启下拉电阻。3 P4 {. t5 U% _4 Q1 o3 D4 |1 D  Q
2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。
: O0 v" \( H. R* r, q3)设置 TIM5 的输入捕获参数,开启输入捕获。5 Y2 ~! \# G, d. O
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)- ^; M% y# S3 n& z/ X4 t
5)使能定时器(设置 TIM5 的 CR1 寄存器)
( B# `" ~5 _) e6)设置 NVIC 中断优先级
% s: [* D( ]$ O$ p9 }6 y7) 编写中断服务函数% w# i, c9 @1 j- M& h& b* p

2 L+ z& ]  E& H/ d8 t6 |
1 n( D# U* }% l  E: a
2 \$ c+ Y  e( c
) o" p3 r9 e( L. i- N8 G4 K8 F* \1 h: \1 M9 J5 T  u
收藏 评论0 发布时间:2021-12-24 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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