历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2020年02月04日 | 掌握这三个思路告诉你如何使用STM32测量频率和占空比

2020-02-04 来源:eefocus

题目

(1)测量脉冲信号频率fo,频率范围为10Hz~2MHz,测量误差的绝对值不大于0.1%。


(2)测量脉冲信号占空比D,测量范围为10%~90%,测量误差的绝对值不大于2%。

使用官方STM32F429 Discovery开发板,主频180MHz,定时器频率90MHz。


思路一、外部中断

这种方法是很容易想到的,而且对几乎所有MCU都适用(连51都可以)。方法也很简单,声明一个计数变量TIM_cnt,每次一个上升沿/下降沿就进入一次中断,对TIM_cnt++,然后定时统计即可。如果需要占空比,那么就另外用一个定时器统计上升沿、下降沿之间的时间即可。


缺陷显而易见,当频率提高,将会频繁进入中断,占用大量时间。而当频率超过100kHz时,中断程序时间甚至将超过脉冲周期,产生巨大误差。同时更重要的是,想要测量的占空比由于受到中断程序影响,误差将越来越大。


笔者当时第一时间就把这个方案PASS了,没有相关代码(这个代码也很简单)。不过,该方法在频率较低(10kHz以下)时,可以拿来测量频率。在频率更低的情况下,可以拿来测占空比。


思路二、PWM输入模式

翻遍ST的参考手册,在定时器当中有这样一种模式:

简而言之,理论上,通过这种模式,可以用硬件直接测量出频率和占空比。当时我们发现这一模式时欢欣鼓舞,以为可以一步解决这一问题。


但是,经过测量之后发现这种方法测试数据不稳定也不精确,数据不停跳动,且和实际值相差很大。ST的这些功能经常有这种问题,比如定时器的编码器模式,在0点处频繁正负跳变时有可能会卡死。这些方法虽然省事,稳定性却不是很好。


经过线性补偿可以一定程度上减少误差(参数在不同情况下不同):

freq=Frequency×2.2118-47.05

这种方法无法实现要求。所以在这里笔者并不推荐这种方法。


思路三、输入捕获

一般来说,对STM32有一定了解的人在测量频率的问题上往往都会想到利用输入捕获。

首先设定为上升沿触发,当进入中断之后(rising)记录与上次中断(rising_last)之间的间隔——周期,其倒数就是频率。


再设定为下降沿,进入中断之后与上升沿时刻之差即为高电平时间(falling-rising_last),高电平时间除周期即为占空比。

该方法尤其是在中低频(<100kHz)之下精度不错。


缺点是该方法仍然会带来极高的中断频率。在高频之下,首先是CPU时间被完全占用,此外,更重要的是,中断程序时间过长往往导致会错过一次或多次中断信号,表现就是测量值在实际值、实际值×2、实际值×3等之间跳动。实测中,最高频率可以测到约400kHz。

该方法在低频率(<100kHz)下有着很好的精度,在考虑到其它程序的情况下,建议在10kHz之下使用该方法。同时,可以参考以下的改进程序减少CPU负载。


改进方案

前述问题,限制频率提高的主要因素是过长的中断时间,一般应用情景之下,还有其它程序部分的限制。所以需要进行改进。


方案一

1.使用2个通道,一个只测量上升沿,另一个只测量下降沿。这样可以减少切换触发边沿的延迟,缺点是多用了一个IO口。

2.使用寄存器,简化程序

之所以改用TIM2是因为TIM5的CH1(PA0)还是按键输入引脚。本来想来这应当也没什么,按键不按下不就是开路嘛。所以,当使用别人的程序之前,请一定仔细查看电路图。

这样,最高频率能够达到约1.1MHz,是一个不小的进步。但是,其根本问题,中断太频繁,仍然存在。


解决思路也是存在的。本质上,实际只需要读取CCR1和CCR2寄存器。而在内存复制过程中,面对大数据量的转移时,会想到什么?


显然,很容易想到——利用DMA。所以,笔者使用输入捕获事件触发DMA来搬运寄存器而非触发中断即可,然后将这些数据存放在一个数组当中并循环刷新。这样,可以随时来查看数据并计算出频率。


方案二

1.可以设定仅有通道2进行下降沿捕获并触发中断,而通道1捕获上升沿不触发中断。在中断函数当中,一次读取CCR1和CCR2。这样可以节省大量时间。

2.可以先进行一次测量,根据测量值改变预分频值PSC,从而提高精度

3.间隔采样。例如每100ms采样10ms.


这样的改进应当能够将最高采样频率增加到2M.但是频率的进一步提高仍然不可能。

因为这时的主要矛盾是中断函数时间过长,导致CPU还在处理中断的时候这一次周期就结束了,使得最终测量到的频率为真实频率的整数倍左右。示意图如下:

结 语

外部中断:编写容易,通用性强。缺点是中断进入频繁,误差大。

PWM输入:全硬件完成,CPU负载小,编写容易。缺点是不稳定,误差大。

输入捕获:可达到约400kHz。低频精度高,10kHz可达到0.01%以下,400kHz也有3%。缺点是中断频繁,无法测量高频,幅值必须在3.3~5V之间。

推荐阅读

史海拾趣

Alpha Semiconductor公司的发展小趣事

Alpha Semiconductor公司于1983年创立,成立之初,公司主要从事代工服务业务。这一策略为Alpha Semiconductor在半导体行业打下了坚实的基础。通过为其他公司提供高质量的代工服务,Alpha Semiconductor逐渐积累了技术实力和行业经验,为后续的自主研发和产品创新奠定了坚实的基础。

Cree(科瑞)公司的发展小趣事

Cree公司成立于1987年,初期专注于硅碳(SiC)材料的研发。在LED灯珠的制造工艺中,Cree的工程师们发现采用SiC材料制成的MOS功率管具备更好的市场价值。随着技术的不断进步,Cree开始将其应用于LED生产,这一创新使得Cree在LED行业中脱颖而出。公司的LED产品以其高效、耐用的特性受到市场的广泛认可,为Cree的后续发展奠定了坚实的基础。

Chenmoun Enterprise Ltd公司的发展小趣事

随着公司业务的不断扩张,Chenmoun Enterprise Ltd开始实施全球化战略布局。公司在全球范围内设立了研发中心和生产基地,充分利用各地的资源优势和人才优势,提升产品的竞争力。同时,公司积极开拓国际市场,与多家国际知名企业建立了紧密的合作关系,实现了业务的快速增长。

Degson Electronics Co Ltd公司的发展小趣事

为了提高产品的品质和可靠性,Degson积极引进国际先进的管理体系和技术标准。公司通过了ISO9001、ISO14001等国际管理体系认证,并严格按照相关标准进行生产和质量管理。此外,Degson还建立了亚洲首家获得美国UL和德国VDE认可的专业实验室,以确保产品的性能和品质符合国际标准。这些举措使Degson的产品在品质上得到了显著提升,赢得了客户的信任和好评。

Comair Rotron公司的发展小趣事

随着电子技术的飞速发展,Comair不断投入研发,力求在技术上取得突破。在某次关键的技术研发中,公司成功开发出了一种新型高效风扇,其性能远超当时市场上的同类产品。这一技术突破为Comair赢得了更多电子行业客户的青睐,公司的市场份额也逐渐扩大。

DSP Group Inc公司的发展小趣事

为了进一步拓展业务领域和市场份额,DSP Group于2021年与Synaptics公司进行了合并。这次合并使DSP Group能够借助Synaptics在触控、显示和人机交互技术方面的优势,进一步拓展其在物联网、智能家居等领域的应用。同时,合并后的新实体也通过资源整合和优势互补,实现了更高的运行效率和更大的市场竞争力。

问答坊 | AI 解惑

ARM的三种中断调试方法介绍

1 嵌入式软件开发流程   参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。   在整个流程中,用户首先需要建立工程并对工程做初步的配置,包 ...…

查看全部问答>

单片机菜鸟请教一个功能需要什么硬件实现

我想做一个简单的单片机,目的就是通过旋转一个按钮(电位器或其它),然后通过单片机采集变化得到一个步进的数值,比如说可以在101.00~120.99之间,就等于是收音机调频率一样,然后送到PC机.请问要些什么电子器件呢,然后怎么从模拟量变成得数字量,…

查看全部问答>

求助 12864的菜单设计时出新的问题

请问, 我在做菜单设计的时候用的是如下结构:碰到的问题是在功能函数void Name0(){},void Name1(){},void Name2(){}等函数中我都有调用显示数字和汉字串的显示函数。结果运行时就提示  warning:RECURSIVE TO CALL SEGMENT .说我 ...…

查看全部问答>

[cetk]cetk测试的时候wince test kit工具弹出对话框说遇到问题需要关闭

小弟请教各位一个问题: 条件: pc机上运行wince test kit工具(即cetest.exe),通过activesync连接到target device并检测到设备上的驱动模块 操作: 选择任一device driver,并开始测试,都会弹出一个对话框提示wince test kit遇到问题需要关闭 ...…

查看全部问答>

【急】新手请教一个关于wince spi驱动的问题

我下载了一个wince6.0 环境下编译的spi驱动源码,请问可以直接加到wince 5.0平台上操作吗? 另外,我在wince5.0平台上用该驱动程序编译之后,成功下载内核映象,烧了内核映象,在2440开发板上也可以成功显示界面,但在VC上(导入了前面建的SDK)用 ...…

查看全部问答>

Wince 5.0唤醒后USB不能用

现象: 1,正常启动,若此时插入usb同步线,连接正常;但是此时再休眠,唤醒后死机 2,正常启动,若先休眠再唤醒,此时插入USB同步线,同步不上 3,休眠唤醒期间USB_DEVICE的USB_EN脚一直是高,USB驱动里在休眠的时候给置低了,不知道谁又把它置 ...…

查看全部问答>

请问大侠以下MAX7219的程序,有什么问题?谢谢

#include /***************************************************************** 常用符号定义 ******************************************************************/ #define uchar unsigned char /******************************** ...…

查看全部问答>

RS-232 第2个串口初始化出现问题(串口功能一个用于控制台 一个用于通讯)

powerpc+linux环境下的串口驱动 目前状态 控制台好使 ,另外的一个串口(用于传输数据使用出现问题) 在测试应用程序中报出如下的错误(open出错)!!请各位大虾帮忙解决,小弟不胜感激!! Machine check in kernel mode. Caused by (from SRR1 ...…

查看全部问答>

【MSP430共享】.MSP430程序综合

这里面是一些小程序 ,有对flash ,1602(用1602显示AD值),串口,定时器的一些综合应用 希望msp430初学者能喜欢…

查看全部问答>

三种LED电路保护方法经验总结

尽管led技术是当今市场的主流,但LED技术上尚有许多没有攻克的难题,而且LED的寿命以及节能、价格问题一直是大家热心讨论的话题。而在这个过程中 LED电路保护电路显得十分重要,我爱方案网总结了3种LED电路的保护方法,希望对大家设计LED保护电路有 ...…

查看全部问答>