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

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

[复制链接]
STMCU小助手 发布时间:2021-12-24 18:00
定时器& \, {+ U" h- Y& p2 f5 x- a
1、STM32H743 内部包含 10 个通用定时器(TIM2TIM5,TIM12TIM17),
2 \  i" Z  |/ R8 ]每个定时器都可以用来产生 PWM 或者用作输入捕获
0 l! A0 e, L& Z, i1 o/ Y! ?不过 TIM2~TIM5 有 4 个通道,TIM12~TIM17 只有 2 个通道。, u' ?" Y/ R9 o% g( {4 I
2、STM32H743 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32H743 的每个通用定时器都是完全独立的,没有互相共享的任何资源。1 ^1 @8 @: Q* I! E' {

5 f$ V+ m/ W- ^4 I. B) O3、如下事件发生时产生中断/DMA(TIM12~TIM14 不支持 DMA):' R5 s6 ]1 T) q- h/ C3 ?6 X
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)& M% x# [: d* k: e0 o
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)! _( Z3 J; {2 D7 ]
C.输入捕获
& e( i. g( h% LD.输出比较
6 B9 S/ @9 N. P4 @$ TE.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM12~TIM17 不支持)
9 v2 s1 @; e, |$ o) [F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM17 不支持)& s* f  N- Q+ `4 W5 W5 A

4 G7 S  ]! o( Q- r1 G$ q* P) p" Z5 v4 P4、通过修改 ARR 的值,可以改变定时时间。另外,通过修改 PSC 的值,使用不同的计数频率(改变图中 CNT 的斜率),也可以改变定时时间。- p, \% y$ O, B* b6 K; A% @0 G
" Y' I: J5 `/ Y/ ~9 a
相关寄存器& g9 l. [# V# y& @: ^! X
DMA/中断使能寄存器(TIMx_DIER)。- i( f+ S* x7 d/ O
控制寄存器 1(TIMx_CR1)
! H9 g3 _9 ]& |6 [模式选择寄存器(TIMx_SMCR)
( M! R% S2 W/ V( D; X预分频寄存器(TIMx_PSC)
% U% t. ^# C+ j# t! k7 C  kTIMx_CNT 寄存器,  e4 x0 W: R. b

- W: z9 |: i- w& k+ J* ]% \5 _: H! e程序设计
  V7 f- j# T. w( N: yTIM3_Init(u16 arr,u16 psc)函数中的两个参数可以计算中断时间,公式如下:
% U- U& V2 n" W( u5 c. ETout= ((arr+1)*(psc+1))/Tclk;
9 {! D* h' P+ ?4 Q3 f5 b* s2 Q/ S6 y/ j( _
PWM输出
+ l4 R! b9 W9 w" m0 Q/ q  R: n& u7 DSTM32H743 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出!这里我们仅使用 TIM3 的 CH4 产生一路 PWM 输出。" L7 a# G1 r0 H. N6 i
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),这里我们需要说明的是模式设置位 OC4M[3:0],此部分由 4位组成。总共可以配置成14种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种 PWM 模式的区别就是输出有效电平的极性相反。
8 m( Z7 F1 W1 W( Y5 OTIM3 的捕获/比较使能寄存器(TIM3_CCER),该寄存器控制着各个输入输出通道的开关
% P& o8 Z6 c. T' b4 X如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存(TIMx_BDTR),
4 U4 a! _1 y2 e# {; ^  E  n
: b- e- Z* g) N1 a$ \8 V' x步骤
+ Q6 H5 p  X% i! }8 t1)开启 TIM3 和 GPIO 时钟,配置 PB1 选择复用功能 AF1(TIM3)输出。
% i0 H! _( D3 N/ V3 F2)初始化 TIM3,设置 TIM3 的 ARR 和 PSC 等参数。
& q& J; Q% f4 _3)设置 TIM3_CH4 的 PWM 模式,输出比较极性,比较值等参数。- S$ E6 u) p  t/ |9 \+ a
4)使能 TIM3,使能 TIM3 的 CH4 输出。
6 e$ c5 H' I6 {5 G% _# W* c7 b" p/ a( L5)修改 TIM3_CCR4 来控制占空比。
( Q4 Z, _& U* j+ _% n2 E0 N/ L. ~, z
输入捕获:输入捕获模式可以用来测量脉冲宽度或者测量频率。! c6 \. m6 O" Z' f
原理3 o" Y4 g! x9 u, F
输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来! ^: [0 U5 o; B3 H. g
说明输入捕获的原理,如图 14.1.1 所示:
0 E. ^: ^1 |+ B
( B; d4 @& u. W2 w8 V! n1 \- z
20200113164705485.png
0 a6 z. X: l( c$ y7 C5 ^$ w& `

& A+ ~4 |+ _4 r
图 14.1.1 输入捕获脉宽测量原理

1 M9 O7 P& k4 `* S  E8 H如图 14.1.1 所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 的时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这
7 q0 F( D6 ?  a9 K0 }5 k样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。; ?& }% m/ O0 X6 D* v( y$ X' _
在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出做处理,防止高电平太长,导致数据不准确。如图 14.1.1 所示,t1~t2 之间,CNT 计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。0 b2 G  u1 D2 d" w
输入捕获的原理,我们就介绍到这。
% u1 z6 }% G5 \+ K- \1 `6 Q) c
# }& g* x1 t  k步骤8 @4 {; \; O1 n0 Y: s/ }
1)开启 TIM5 和 GPIOA 时钟,配置 PA0 为复用功能(AF2),并开启下拉电阻。
  T8 _  x, Z- \# H! n+ _3 m2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。+ k3 X: m& R, I8 c
3)设置 TIM5 的输入捕获参数,开启输入捕获。. Y2 v# o# ?+ _* B# {( Q
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)+ D$ P) s- f( P: n/ d
5)使能定时器(设置 TIM5 的 CR1 寄存器)5 ]# S, C1 f3 r+ N3 J# J/ n( P4 U
6)设置 NVIC 中断优先级
% t) f$ H# k8 d7) 编写中断服务函数* N0 Q. R5 n9 j4 A) O

0 C: J1 P8 u% @" x' I& m/ P7 W, j* g) i8 o4 F( x1 K
0 h2 l1 a6 b, ]5 @
- J3 K, Q) B, K

$ C' P' L6 L' V7 R1 b' I8 _
收藏 1 评论0 发布时间:2021-12-24 18:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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