| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32-Project32:通用定时器输入捕获脉冲宽度实验;高级定时器捕获PWM的频率与占空比实验 -> 正文阅读 |
|
[嵌入式]STM32-Project32:通用定时器输入捕获脉冲宽度实验;高级定时器捕获PWM的频率与占空比实验 |
一?捕获脉冲宽度实验
硬件设计
根据开发板引脚使用情况,我们选用通用定时器
TIM5
的
CH1
,就
PA0
这个
GPIO
来
测量信号的脉宽。在开发板中
PA0
接的是一个按键,默认接
GND
,当按键按下的时候
IO
口会被拉高,这个时候我们可以利用定时器的输入捕获功能来测量按键按下的这段高电平
的时间。
(1)
定时器用到的
GP IO
初始化
(2)
定时器时基结构体
TIM_TimeBaseInitTypeDef 初始化
(3)
定时器输入捕获结构体
TIM_ICInitTypeDef
初始化
(4)
编写中断服务函数,读取捕获值,计算出脉宽的时间
在初始化时基结构体的周期和时钟分频因子这两个成员时,我们使用了两个宏
GENERAL_TIM_PERIOD
和
GENERAL_TIM_PSC
。
GENERAL_TIM_PERIOD
配置的是
ARR
寄存器的值,决定了计数器一个周期的计数时间,默认我们配置为
0XFFFF
,即最大。
GENERAL_TIM_PSC
配置的是分频因子,默认配置为
72-1
,则可以计算出计数器的计数
周期为
(GENERAL_TIM_PSC+1)/72M = 1US
。所以输入捕获能捕获的最小的时间为
1us
,
最长的时间为
1us*(0Xffff+1)=65536us=65.536ms
,当超过这个计数周期的时候,就会产生
中断,然后在中断里面做额外的处理,需要记录好产生了多少次更新中断,最后把这个更
新时间加入到脉宽的时间里面。
在
GENERAL_TIM_Mode_Config()
函 数 中 , 我 们 配 置 输 入 捕 获 的 起 始 边 沿 为
GENERAL_TIM_STRAT_ICPolarity
,这是一个宏,默认配置为上升沿。我们的按键默认是
接
GND
,当按键按下的时候会被拉高,这个时候这个由低到高的上升沿会被捕获到,这是
第一次捕获,此时我们把计数器清
0,开始计数,同时把捕获边沿改成下降沿捕获。当第
二次进入中断服务函数的时候,说明捕获到下降沿,这个时候表示脉宽捕获完毕,我们读
取捕获寄存器的值即可,然后我们就可以通过这个值算出脉宽的时间。最后把捕获编译配
置为上升沿,为的是下一次捕获。如果脉宽的时间超过了计数器的最大计数时间,那么就
会产生更新中断,我们需要做额外的处理,即产生了多少次更新中断记录下来,最后在算
脉宽的时间的时候把这个更新的时间加进去即可。
中断服务函数里面用到的捕获结束标志位、捕获开始标志位、捕获寄存器的值和自动
重装载更新标志这几个成员是在一个结构体里面定义,具体声明见代码清单
32-12
。其中
声明是在
bsp_GeneralTim.h
这个头文件中,定义和初始化则在
bsp_GeneralTim.c
文件。
二??高级定时器捕获PWM的周期与占空比
在本节实验中,我们用通用定时器产 生一路 PWM
信号,然后用高级定时器的通道
1
或者通道
2
来捕获。
硬件设计
实验中用到两个引脚,一个是通用定时器
TIM3
的通道
1
,即
PA6
,用于输出
PWM
信
号,另一个是高级控制定时器
TIM1
的通道
1
,即
PA8
,用于
PWM
输入捕获,实验中直接
用一根杜邦线短接即可
PA6
和
PA8
即可,同时可用示波器监控
PA6
的波形,看看实验捕
获的数据是否正确。
编程要点
(1)
通用定时器产生
PWM
配置
(2)
高级定时器
PWM
输入配置
(3)
编写中断服务程序,计算测量的频率和占空比,并打印出来比较
编程的要点主要分成两部分,一个是通用定时器的
PWM
信号输出,另一个是
PWM
信号输入捕获。
通用定时器
PWM
输出
高级定时器
PWM
输入捕获
在上面的宏定义里面,我们可以算出计数器的计数周期为
T=72M/(1000*72)=1MS
,这
个是定时器在不溢出的情况下的最大计数周期,也就是说周期小于
1ms
的
PWM
信号都可
以被捕获到,转换成频率就是能捕获到的最小的频率为
1KHZ
。所以我们要根据捕获的
PWM
信号来调节
ADVANCE_TIM_PERIOD
和
ADVANCE_TIM_PSC
这两个宏。
ADVANCE_TIM_Mode_Config()函数中初始化了两个结构体,
因为是
PWM
输入模式,只能使用通道
1
和通道
2
,假如我们使用的是通道
1
,即
TI1
,
输入的
PWM
信号会被分成两路,分别是
TI1FP1
和
TI1FP2
,两路都可以是触发信号。如
果选择
TI1FP1
为触发信号,那么
IC1
捕获到的是
PWM
信号的周期,
IC2
捕获到的是占空
比 , 这 种 输 入 通 道
TI
和 捕获通道
IC
的映射 关系叫直连,输入捕获结构体的
TIM_ICSelection
要配置为
TIM_ICSelection_DirectTI
。如果选择
TI1FP2
为触发信号,则
IC2
捕获到的是周期,
IC1
捕获到的是占空比,这种输入通道
TI
和捕获通道
IC
的映射关系
叫非直连,输入捕获结构体的
TIM_ICSelection
要配置为
TIM_ICSelection_IndirectTI
。有关
输入通道
TI
和捕获通道
IC
的具体映射关系见图
,有直连和非直连两种。
当捕获到
PWM
信号的第一个上升沿时,产生中断,计数器被复位,锁存到捕获寄存
器
IC1
和
IC2
的值都为
0
。当下降沿到来时,
IC2
会捕获,对应的是占空比,但是会产生中
断。当捕获到第二个下降沿时,
IC1
会捕获,对应的是周期,而且会再次进入中断,这个
时间就可以根据
IC1
和
IC2
的值计算出频率和占空比。有关
PWM
输入的时序见图?
中断复位函数中,我们获取输入捕获寄存器
CCR1
和
CCR2
寄存器中的值,当
CCR1
的值不为
0
时,说明有效捕获到了一个周期,然后计算出频率和占空比。在计算的时候
CCR1
和
CCR2
的值都必须要加
1
,因为计数器是从
0
开始计数的
?
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
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/25 22:27:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |