| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 8、【STM32】定时器(TIM)——中断、PWM、输入捕获实验(一文精通定时器) -> 正文阅读 |
|
[嵌入式]8、【STM32】定时器(TIM)——中断、PWM、输入捕获实验(一文精通定时器) |
目录 前言使用的是正点原子的探索者开发板进行学习,芯片:STM32F407ZGTx 学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。 本文参考了《正点原子的寄存器开发指南》、《STM32F4参考手册》 ?详细介绍的时钟的配置与,定时器时钟如何从时钟树而来的。 理论学习包括TIM1和TIM8高级控制定时器、TIM2-5和TIM9-14通用定时器、TIM6和TIM7基本定时器。 一、定时器中断
? ? ? ? 这里使用的是32的通用定时器,通用定时器包含一个 16
位或
32
位自动重载计数器(
CNT),该计数器由可编程预分频器(
PSC
)驱动。
STM32F4
的通用定时器可以被用于:测量输入信号的脉冲长度
(输入捕获
)
或者产生输出波形
(
输出比较和
PWM)
等。 使用定时器预分频器和
RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。
STM32F4 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
1.1、时基单元包括:
1.2、通用定时器功能
????????A.输入捕获
????????B.输出比较
????????C.
PWM
生成
(
边缘或中间对齐模式
)
,注意:
TIM9~TIM14
不支持中间对齐模式
????????D.单脉冲模式输出
????????A.更新:计数器向上溢出
/
向下溢出,计数器初始化
(
通过软件或者内部
/
外部触发
)
????????B.触发事件
(
计数器启动、停止、初始化或者由内部
/
外部触发计数
)
????????C.输入捕获
????????D.输出比较
????????E.支持针对定位的增量
(
正交
)
编码器和霍尔传感器电路(
TIM9~TIM14
不支持)
????????F.触发输入作为外部时钟或者按周期的电流管理(
TIM9~TIM14
不支持)
1.3、计数器模式
????????在递增计数模式下,计数器从 0
计数到自动重载值(
TIMx_ARR
寄存器的内容),然后重新
从
0 开始计数并生成计数器上溢事件。每次发生计数器上溢时会生成更新事件,或将 TIMx_EGR 寄存器中的 UG 位置 1(通过软件或使用从模式控制器)也可以生成更新事件。
????????发生更新事件时,将更新所有寄存器且将更新标志(TIMx_SR
寄存器中的
UIF
位)置
1
(取
决于
URS
位):
????????在递减计数模式下,计数器从自动重载值(TIMx_ARR
寄存器的内容)开始递减计数到
0
,
然后重新从自动重载值开始计数并生成计数器下溢事件。每次发生计数器下溢时会生成更新事件,或将 TIMx_EGR
寄存器中的
UG
位置
1
(通过软件或使用从模式控制器)也可以生成更新事件
????????发生更新事件时,将更新所有寄存器且将更新标志(TIMx_SR
寄存器中的
UIF
位)置
1
(取
决于
URS
位):
????????在中心对齐模式下,计数器从 0
开始计数到自动重载值(
TIMx_ARR
寄存器的内容)
— 1
,
生成计数器上溢事件;然后从自动重载值开始向下计数到
1
并生成计数器下溢事件。之后从 0 开始重新计数。
????????发生更新事件时,将更新所有寄存器且将更新标志(TIMx_SR
寄存器中的
UIF
位)置
1
(取
决于
URS
位):
1.3 相关寄存器
二、定时器PWM输出2.1、PWM输入模式
此模式是输入捕获模式的一个特例。其实现步骤与输入捕获模式基本相同,仅存在以下不同
之处:
2.2、定时器PWM输出
????????脉冲宽度调制(PWM)
,是英文“
Pulse Width Modulation
”的缩写,简称脉宽调制,是利用
微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽
度的控制。
上图定时器工作在向上计数
PWM模式,当 CNT<CCRx
时,输出
0
,当
CNT>=CCRx
时输出
1
。
STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出!这里我们仅使用 TIM14 的 CH1 产生一路 PWM 输出。 关于PWM在FPGA上的产生更加有助于理解 二、15【FPGA】呼吸灯实现_追逐者-桥的博客-CSDN博客_fpga 呼吸灯
????????脉冲宽度调制模式可以生成一个信号,该信号频率由 TIMx_ARR 寄存器值决定,其占空比则
由
TIMx_CCRx
寄存器值决定。? ? ? ??
????????在 PWM
模式(
1
或
2
)下,
TIMx_CNT
始终与
TIMx_CCRx 进行比较,以确定是TIMx_CCRx
?
TIMx_CNT
还是
TIMx_CNT
?
TIMx_CCRx(取决于计数器计数方向)。不过,为了与
ETRF
相符(在下一个
PWM
周期之前,
ETR 信号上的一个外部事件能够清除OCxREF
),
OCREF
信号仅在以下情况下变为有效状态:
定时器运行期间,可以通过软件强制
PWM 输出。根据 TIMx_CR1 寄存器中的 CMS 位状态,定时器能够产生边沿对齐模式或中心对齐模式的PWM 信号。
2.3、PWM输出相关寄存器除了使用到了定时器中断的那几个寄存器外还用到了以下寄存器
三、定时器输入捕获?3.1、简介? ? ??
????????输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来
说明输入捕获的原理,如图
15.1.1
所示:
????????就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中
t1~t2
时间,就是我们需要测量的高电平时间。测量方法如下:
首先设置定时器通道 x 为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道 x为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。
这样,根据定时器的计数频率,我们就可以算出
t1~t2
的时间,从而得到高电平脉宽。
????????在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。如图15.1.1所示,t1~t2之间,CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。 ????????STM32F4 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。 3.2、寄存器配置
????????在输入捕获模式下,当相应的 ICx
信号检测到跳变沿后,将使用捕获
/
比较寄存器(TIMx_CCRx) 来锁存计数器的值。发生捕获事件时,会将相应的
CCXIF
标志(
TIMx_SR
寄存器)置
1
, 并可发送中断或 DMA
请求(如果已使能)。如果发生捕获事件时
CCxIF
标志已处于高位, 则会将重复捕获标志 CCxOF
(
TIMx_SR
寄存器)置
1
。可通过软件向
CCxIF
写入
0
来给
CCxIF
清零,或读取存储在
TIMx_CCRx
寄存器中的已捕获数据。向
CCxOF
写入
0 后会将其清零。
????????以下示例说明了如何在 TI1 输入出现上升沿时将计数器的值捕获到 TIMx_CCR1 中。具体操
作步骤如下:
3.3、发生输入捕获时:
????????要处理重复捕获,建议在读出捕获溢出标志之前读取数据。这样可避免丢失在读取捕获溢出
标志之后与读取数据之前可能出现的重复捕获信息。
注意: 通过软件将 TIMx_EGR 寄存器中的相应 CCxG 位置 1 可生成 IC 中断和/或 DMA 请求。
需要用到的寄存器有:
TIMx_ARR
、 TIMx_PSC、
TIMx_CCMR1
、
TIMx_CCER
、
TIMx_DIER
、
TIMx_CR1
、
TIMx_CCR1
实战演练?一、定时器中断配置步骤1.1、TIM3 时钟设置与使能
?想CFGR[12:10]位写5,即4分频,因此APB1=PLLCLK/4=42M
TIM3挂载在APB1时钟总线上, TIM3由于在配置APB1的时候使用了4分频,所以定时器进行了2倍频,为84MHz。?
1.2、设置? TIM3_ARR 和 TIM3_PSC的值时间计算公式:Tout =? ( (arr+1) * (psc+1) )? /? Tclk;
Tclk:TIM3 的输入时钟频率(单位为 Mhz)
Tout:TIM3 溢出时间(单位为 us)
1.3、设置 TIM3_DIER 允许更新中断
1.4、允许 TIM3 工作(TIM3_CR1)
?使能定时计数器器,且为递增计数 1.5、TIM3 中断分组与中断服务函数设置
TIMX-SR状态寄存器:
1.6、主函数的编写TIM(定时器)=84MHz? ? ? ?psc(分频系数)=8400? ? ?arr(重装在值)=5000 定时器计数频率 = 84MHz / 8400 =10KHz Tout = 5000 /?10KHz?= 0.5s
二、定时器PWM输出配置步骤2.1、配置TIM14的输出端口
TIM14这里我们还要配置
PF9
为复用(
AF9
)输出,才可以实现
TIM14_CH1的 PWM
经过
PF9
输出。
2.2、设置 TIM14 的 ARR 和 PSC
2.3、TIM14-CH1设置为PWM输出 模式TIM14-CCMR1捕获比较寄存器1相关位描述 ?TIMx_CCER捕获/比较使能寄存器相关位描述
2.4、TIMx_CR1控制寄存器 1,使能 TIM14
TIMx_CR1控制寄存器
1的相应位配置
2.5、主函数的编写和占空比控制
TIMx_CCR1捕获
/
比较寄存器
1相应位配置
三、定时器输入捕获配置步骤3.1、配置TIM5输入端口
捕获TIM5_CH1
上面的高电平脉宽,所以先配置
PA0 为带下拉的复用功能,PA0
的复用功能为
AF2。
3.2、设置 TIM5 的 ARR 和 PSC计数分频系数与计数器数设置,在定时器中断有相关描述
3.3、TIM5-CH1(TI1)设置为输入捕获模式TIM5-CCMR1捕获比较寄存器1相关位描述 TIM5_CCER捕获/比较使能寄存器相关位描述
3.4、设置 TIM5->DIER,使能捕获和更新中断。
3.5、TIMx_CR1控制寄存器 1,使能 TIM5
3.6、设置中断分组及编写中断函数
3.7、输入捕获主函数
输入捕获功能应用????????电容触摸按键:电容按键是接触式的,点一下就松开(与微动开关类似),因此需要消除抖。在之前的微动开关使用时间延迟判断两次,状态相同时才认为是按下。这里同理,这里使用的是输入捕获即手指接触一定时间后到达B认为电容按键按下。 ?正点原子中的文档内容描述: ?对于电容按键用的不是特别多,这里不进行实验,有需要的可以自己去看一下正点原子的相关实验。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 0:53:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |