登录
|
立即注册
网站首页
网站论坛
BBS
积分充值
每日签到
搜索
MCU智学网
»
网站论坛
›
单片机论坛
›
STM32/STM8单片机
›
帖子
如何使用STM32测量频率和占空比?掌握这三个思路就够了!
[复制链接]
2664
0
发表于 2018-12-13 23:28:48
|
查看全部
|
阅读模式
本文包含源代码、原理图、PCB、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
题目
(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之间。
举报
回复
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
admin
管理员
293
主题
21
回帖
3995
积分
Ta的主页
发信息
签到
连续天
6人
签到看排名
更多
精彩推荐
RV1126 RV1109硬件设计全套参考资料包
1、介绍 RV1126和RV1109是专用于视觉处理的高性能处理器SoC,可广泛应用于智能门锁、
瑞芯微 RK3326 RK3326S 硬件参考设计分享
RK3326是为个人平板电脑和智能音频设备设计的高性能四核应用程序处理器。提供了许多嵌
更新自动建库工具PCB Footprint Expert 202
已更新至目前最新版本Footprint Expert 2024.04 自动建库工具Footprint Expert 2023.
RK1808全套资料 包含芯片手册 参考设计 硬
一、简介 随着物联网和人工智能的兴起,AIoT(AI+IoT)芯片也随之兴起,RK1808是瑞芯
瑞芯微 RK3568 硬件参考设计分享 原理图 PC
RK3568芯片介绍简介瑞芯微RK3568芯片是一款定位中高端的通用型SOC,是一款高性能低功
更多
热点动态
1.
量程自动切换数字电压表proteus仿真 程序资
2.
自制FM收音机
3.
Cadence Allegro 17.4 电子设计速成实战宝
4.
RTL8309N方案-8口Switch原理图PCB规格书
5.
思特威SC4336_数据手册 SC4336_设计应用指
6.
思特威SC3338_数据手册 SC3338_设计应用指
7.
思特威SC3336_数据手册 SC3336_设计应用指
8.
思特威SC3335_数据手册 SC3335_设计应用指
更多
随手拍
1.
量程自动切换数字电压表proteus仿真 程序资
2.
自制FM收音机
3.
免费分享 全开源全协议245W桌面充电站-无线
4.
Cadence Allegro 17.4 电子设计速成实战宝
5.
VL817-Q7 USB3.0 HUB方案 包含规格书 参考
更多
客服中心
微信扫描二维码
服务时间:周一至周日 8:30-22:00
在线客服
客服微博
产品咨询
售后中心
快速回复
返回顶部
返回列表