| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 最强 PWM 输入原理解析贴 -> 正文阅读 |
|
[嵌入式]最强 PWM 输入原理解析贴 |
来源:公众号【鱼鹰谈单片机】 作者:鱼鹰Osprey ID ??:emOsprey 上一篇文章《领悟最强 PWM 捕获功能,1 MHz !》鱼鹰介绍了最强 PWM 一些基本特性,今天鱼鹰从原理上介绍如何实现该功能。 介绍之前,首先介绍一下 STM32F103 TIM 的一些相关特性:
3、高频信号输入时,中断进入很频繁,如果是 100 K 频率,你需要 5 us 进入一次(高低电平各一次,还是在占空比为 50 % 情况下,其它占空比条件更为苛刻),如果采用中断处理方式,你必须在中断中完成很多操作(清标志、计算、翻转极性等),同时你需要保证这两次中断不能被全局中断禁止,或者被高优先级中断打断,否则,你得到的可能就不是一次脉冲的高电平了,这样你的占空比、频率都将计算出错。 正因为有如上问题,而捕获 PWM 脉冲又是比较常见的功能,所以需要一个高效的捕获程序完成该工作。而鱼鹰今天介绍的实现原理我认为就是最高效的。 100K 频率误差 0%,占空比误差1%! 在嵌入式中,100 K 频率已经算比较高的了,当然是在关注占空比情况下,如果只关注频率,那么可测量的频率将更高。 可能有些人会抬杠,说,干嘛不使用 FPGA。鱼鹰当然知道有比单片机更有效的捕获器件,因为我自己买的逻辑分析仪(想买这个的可以找鱼鹰预定,可以给一定的优惠,预定人数需要10个以上)就可以捕获很高的频率、精度,但问题在于成本,在于有必要吗?这个逻辑分析仪可是几百大洋啊。 闲话不多说,鱼鹰首先介绍一下该捕获方法的基本原理。 很简单,就是利用二进制溢出特性实现的。(2038问题-动图) 这个特性鱼鹰在笔记中也多次介绍了其中的应用,比如无锁队列、扩展定时器、编码器、延时等,今天就再加一个应用,PWM 捕获(本篇笔记不介绍这个特性原理,可以看历史相关笔记)。 可以说理解了这个特性,在各种整型数据处理中如虎添翼,再也不担心数据溢出的问题,反而要利用该特性完成一些骚操作,比如今天 PWM 捕获就是如此。 另一个绝技就是使用 DMA 了,这是它高效可靠的原因。 首先我们看看定时器的构成框图: 上面标注部分就是为什么 PWM 输入模式只能使用通道 1 或通道 2 的原因。 这里我们以TI1作为PWM输入,两个捕获通道同时捕获 TI1 为例说明。 基本配置如下:
以上配置就是整个功能最为关键的部分。如果你理解了下面介绍的捕获原理,你自然知道为什么需要这么设置了。 我们首先看看 PWM 捕获时基本工作过程: 另外还需要了解 TIM 一个很重要的DMA 传输特性:通过配置寄存器,可以一次触发,多次DMA连续传输,这个特性在这个功能中也被用上了。 如何利用这个功能呢?一般我们配置 DMA 传输时,比如串口,一般外设地址就是 DR 寄存器。而如果我们想传输 TIM 的捕获值,我们可以设置成 CCR1 寄存器的地址。 这样也可以正常传输,但是只能在触发时传输一个寄存器的值,如果需要把两次捕获值都传输,那么就需要配置两个 DMA 通道完成,但这里又涉及到了两个 DMA 通道同步的问题,因为你肯定希望每次采集的两个数据都属于同一个脉冲。 所以 TIM 用了这两个寄存器解决这个问题,通过 DMAR 中转,就可以完成一次触发,连续传输两个 CCR 的值。 想必看到这里,你应该大概知道该捕获的原理是什么了。 这里鱼鹰再结合上图描述一下。 初始化(定时器、DMA、GPIO)完成后,定时器就准备好工作了,一旦有一个脉冲输入,上升沿触发,此时因为设置了 DMA 触发,同时设置了连续传输两个寄存器,所以它会把当前的 CCR1 和上一次捕获的 CCR2(下降沿触发)传输到用户缓存,这是两次 DMA 传输,所以DMA的计数器会递减两次。并且 CCR1 的值比 CCR2 的值大(不考虑溢出情况下,并且差值情况下,大小没有意义)。这样,上面的三次触发,我们可以得到三组捕获数据。 通过 (uint16_t)(CCR1 – CCR2),我们可以得到低电平,而通过两次CCR1 或者 CCR2 的差值,我们可以得到周期。这样计算频率和占空比就不是什么难事了。特别需要注意的是,三次上升沿捕获期间,定时器不可以产生溢出现象,这可以通过定时器分频实现。分频系数越小,分辨率越高,但越容易溢出。 这里要注意的是,如果频率比较高,建议多测量几组数据,然后取后面几组数据进行简单平均或中值计算(具体根据捕获值来确定),这样准确度更高一些,因为刚开始可能因为初始化的缘故,导致意外捕获,这是可能的(刚开始不确定可以测个 64 组再说)。 另外如果输入 PWM 频率或占空比会不断变化,也需要根据情况多测几组(或定时测),并进行简单处理,这样不容易刚好捕获到变化的脉冲,保证脉冲计算的可靠性。 总之,怎么去让你的程序更加可靠就是各位道友的事情了,鱼鹰只是提供一个解决思路。另外鱼鹰不准备提供源码给各位道友,自由发挥吧。如果确实有需要的话,在本篇文章更新前的时间里,道友有过赞赏或者留言被置顶或转发支持的情况,那么也可以主动联系鱼鹰,鱼鹰可以给一份参考程序,仅供参考。以前没有的就别找鱼鹰了。 好了,今天又是两千字大章,下期再见吧 ------------------2021-08-29 阅读原文中有一篇《一个定时器实现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 0:31:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |