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

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

[复制链接]
STMCU小助手 发布时间:2021-12-24 18:00
定时器
9 B/ ]- t/ \; U9 B2 [1、STM32H743 内部包含 10 个通用定时器(TIM2TIM5,TIM12TIM17),
) o7 ^) z4 {! y, ^1 p3 h每个定时器都可以用来产生 PWM 或者用作输入捕获
) \! ~' n! F) Y, \8 d% d不过 TIM2~TIM5 有 4 个通道,TIM12~TIM17 只有 2 个通道。
" }; E& x) j/ q" V2、STM32H743 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32H743 的每个通用定时器都是完全独立的,没有互相共享的任何资源。( I1 ]6 b: T! u
+ f; F, L' A- x9 N* S) w
3、如下事件发生时产生中断/DMA(TIM12~TIM14 不支持 DMA):4 a& n0 r1 u' n; `$ D% v7 |
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)' _- u9 m& G5 P2 F/ D& E2 p7 y
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数); o5 }# O% x# W/ w4 N' J. ^) q
C.输入捕获
! x( [# Y7 g! K, z0 \! fD.输出比较; d' B8 L0 K7 g8 f+ B# \9 g
E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM12~TIM17 不支持)  {( ~. I# Y- m! G! B$ ?! v5 V" K
F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM17 不支持)
0 c# t3 Z/ M9 R/ L; N3 t9 C* h2 X6 w4 Z/ Q# X3 g
4、通过修改 ARR 的值,可以改变定时时间。另外,通过修改 PSC 的值,使用不同的计数频率(改变图中 CNT 的斜率),也可以改变定时时间。
5 b" Q4 Y5 Z& G6 M+ f# P
0 y+ Q0 F6 a5 ]3 l4 A+ K相关寄存器  m3 l, w4 y7 E+ a8 r/ V. v
DMA/中断使能寄存器(TIMx_DIER)。# G9 H* e$ v, S# E
控制寄存器 1(TIMx_CR1)* N: a) k  g) k2 T& d: p& C  D. j* }6 j
模式选择寄存器(TIMx_SMCR)6 |4 Y& w+ Y  U! J4 K* n/ z
预分频寄存器(TIMx_PSC)
9 j1 `7 d% k6 z4 f: c" F6 |TIMx_CNT 寄存器,
4 b0 G9 k( N( d- }0 d" |0 \& z5 v; |8 u
程序设计
+ `5 q& t$ ~) ^+ O; xTIM3_Init(u16 arr,u16 psc)函数中的两个参数可以计算中断时间,公式如下:
. l, V3 Y- B2 KTout= ((arr+1)*(psc+1))/Tclk;' r/ }" b: t1 a% r, I
3 F" K8 Y, E7 H  d. B: L+ i
PWM输出
5 X, U2 i0 B! FSTM32H743 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出!这里我们仅使用 TIM3 的 CH4 产生一路 PWM 输出。( K0 A* D: J' d8 I
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),这里我们需要说明的是模式设置位 OC4M[3:0],此部分由 4位组成。总共可以配置成14种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种 PWM 模式的区别就是输出有效电平的极性相反。
2 R' q0 L2 K5 gTIM3 的捕获/比较使能寄存器(TIM3_CCER),该寄存器控制着各个输入输出通道的开关
! Z" R3 y' a, ]4 I如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存(TIMx_BDTR),& l$ N; u/ q9 ]! b1 x% X/ H
2 T# Y! P: f7 _: X9 @! C1 D
步骤
2 B6 O  E' }) Z1)开启 TIM3 和 GPIO 时钟,配置 PB1 选择复用功能 AF1(TIM3)输出。
6 j4 x% X; q; ~3 T2)初始化 TIM3,设置 TIM3 的 ARR 和 PSC 等参数。
7 ^0 P- T! m; }; v3 k. Z, v3 o3)设置 TIM3_CH4 的 PWM 模式,输出比较极性,比较值等参数。: f- W0 C* U5 k$ R# P" [( J
4)使能 TIM3,使能 TIM3 的 CH4 输出。3 H9 J% Q' D6 c# ]- k$ `
5)修改 TIM3_CCR4 来控制占空比。$ {3 I$ p4 V. e7 q& v" u

) h' E; P5 p6 a) `9 X" X输入捕获:输入捕获模式可以用来测量脉冲宽度或者测量频率。! C( O  q) z% L2 o
原理% b) x: W( z7 _  s1 J& {* M
输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来
9 h) e4 |8 B; m$ g说明输入捕获的原理,如图 14.1.1 所示:
! B2 g; y$ c& r, g2 o
4 H/ G9 ~. K6 R0 S" d2 g6 D3 ^" \
20200113164705485.png

$ v2 ]5 W6 i' b( |
+ _0 P, |6 O9 f" w& B3 ]
图 14.1.1 输入捕获脉宽测量原理

: _, \7 K: P/ }/ ^如图 14.1.1 所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 的时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这9 q7 P9 i: ]# f0 C3 e& _
样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。/ m9 q9 z7 i! k. ?9 V% ~* n
在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出做处理,防止高电平太长,导致数据不准确。如图 14.1.1 所示,t1~t2 之间,CNT 计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。" Y3 a' q- L5 O8 e. s; R
输入捕获的原理,我们就介绍到这。! V1 x; k9 v; s7 Q% V2 g0 ^

# v: V( ]8 {+ n  e3 v% ~步骤' d: k7 Y+ S$ @! J
1)开启 TIM5 和 GPIOA 时钟,配置 PA0 为复用功能(AF2),并开启下拉电阻。* j+ n8 A% m! E3 m
2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。+ C! Q$ H/ E9 p/ T
3)设置 TIM5 的输入捕获参数,开启输入捕获。: q4 ]9 ]+ a/ _8 S7 n
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)  w/ c# S6 a6 a9 T5 d! s
5)使能定时器(设置 TIM5 的 CR1 寄存器)
% u+ P1 _+ S3 |8 U  z  _; ?$ W6)设置 NVIC 中断优先级
4 D% y" P) L) U% V1 F6 S7) 编写中断服务函数0 Q/ v4 ^* K; s) j
; l- j0 S8 x- X" H: f( l; |5 p

" B8 g' b7 l+ J. y, H$ I/ }9 E
3 v1 @0 ?9 H9 w' ]" z/ q, q! s+ y
$ i' @! w( F. D& W1 }2 [" p
- m0 ^! }  _" B+ q3 _* K
赞 收藏 1 评论0 发布时间:2021-12-24 18:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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