| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32学习笔记—输入捕获 -> 正文阅读 |
|
[嵌入式]STM32学习笔记—输入捕获 |
1、输入捕获介绍2、函数配置3、代码1、输入捕获介绍输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7, 其他定时器都有输入捕获功能。输入捕获就是边沿信号发生突变的时候,记录下定时器的值,从而得到定时器的值算出脉冲宽度和频率。 2、函数介绍1、首先开启GPIO口的时钟和定时器的时钟 2、初始化io口,此时需要注意如果按键按下接的是高电平,则需要将io口设置为下拉输入。还有注意与pwm输出不同,io口不需要开启复用,所以我们省去了开启复用时钟的开启和io口复用模式的配置。这里面我们需要设置两个重要的系数psc(预分频系数)和arr(自动装载值),计数模式选择向上计数。 3、初始化io口的输入比较参数。这里需要设置映射通道、分频系数、映射到定时器、捕捉模式还有是否使用滤波。 IM_ICInitTypeDef TIM5_ICInitStructure; TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上,这里可以选择映射到通道2上 TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获 TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上,还可以映射到定时器2上 ?TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频,这边主要设置采集的频率,一般需要满足香农采样定理 ?TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波,这里滤波的原理是以上面我们设计的采样频率去采集我们的信号,如果我们设置滤波器的系数为8时,则以采样频率连续检测到8次高电平时才认为我们捕捉到上升沿。 TIM_ICInit(TIM5, &TIM5_ICInitStructure); 4、使能定时器中断和更新中断 这里通过调用TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断和捕获中断。 5、使能定时器,这里我们完成了定时器的配置,才能使能定时器。 6、编写中断服务函数 这里给的代码很绕人,所以这里我写下自己的理解,我们的中断函数其实有两个部分,一部分时是我们基本的捕获的中断服务函数还有一部分是我们的按键如果一直按下,定时器出现溢出的情况,这里溢出一次就记录下一次,具体操作如下 我们定义了一个变量TIM5CH1_CAPTURE_STA,这个变量的低六位是记录捕获高电平后溢出的次数,第七位是记录下已经捕获到高电平,第八位是记录下我们已经完成一次完整的捕捉。 下面我们来看下我们基本的捕获中断函数是怎么运行的 ?这边因为我们初始化的时候设置的是上升沿捕捉,所以这边检测到发生捕获事件后进入我们的中断服务函数,这时变量sta的第七位肯定不是1,所以我们进入else中,清空变量值,然后把定时器5此时的值设置位0,即是定时器5重新开始计时。然后将将sta的第七位设置为1,标记此时我们已经检测到高电平,并设置为下降沿捕捉。如果捕捉到下降沿,再次会进入中断服务函数,然后中断函数已经满足我们if的判断条件(因为我们在捕捉到上升沿的时候已经将sta的第七位设置为1),进入上面的函数,我们标记一次完整的捕捉,然后将此时定时器的值放入我们定义的变量val中,如果定时器不发生溢出,那么此时定时器中的值就是我们需要的那个高电平的时间,但是如果定时器发生了溢出,那么我们需要记录下溢出的次数,才能得到准确的时间,那么就到了我们中断服务函数的领一个函数。 ?这个函数就比较好理解了,这里不做过多解释,就是记录定时器的溢出次数。 最后需要在中断服务函数中清除中断的标志位,否则无法产生下次中断。这里调用TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位 7、经过上诉的步骤,我们的timer函数就已经结束,下面进入主函数,主函数里面需要提到的是我们将arr的值设置为0xffff,psc值我们设置为71(72-1),那么我们定时器的频率就是1mhz,那么相应的周期就是1微妙。剩下的就是计算时间了,不做赘述。 3、源码
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
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 10:32:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |