0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

掌握这三个思路告诉你如何使用STM32测量频率和占空比

贸泽电子设计圈 来源:未知 作者:李倩 2018-11-16 15:07 次阅读

题目

(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之间。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4820

    浏览量

    209556
  • STM32
    +关注

    关注

    2232

    文章

    10649

    浏览量

    347874

原文标题:如何使用STM32测量频率和占空比?掌握这三个思路就够了!

文章出处:【微信号:Mouser-Community,微信公众号:贸泽电子设计圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    这三个电阻的阻值都是多少啊?

    想用一1k的电阻,可手头没有,只能找电路板拆了,这三个有没有1K的或者接近1K的!
    发表于 08-25 08:46

    谁会用这三个函数啊(数学类的)

    这三个函数分别为pow();平方函数sqrt();开方函数acos();反余弦函数这三个函数都该怎么用,括号里的数据类型都是什么?我这样编对么?float R;double jd1,jd;R=sqrt(pow(x5,2)+pow(y5,2));jd1=x5/R;jd=ac
    发表于 05-31 13:49

    请问这三个板子是什么型号

    请问A-Lead SOT-23 ADC Driver,10-Lead PulSAR ADC Evaluation Board,EVAL-SOP-CB1Z这三个板子是什么型号???
    发表于 08-09 09:17

    如何使用STM32测量频率占空比掌握这三个思路就够了!

    =Frequency×2.2118-47.05这种方法无法实现要求。所以在这里笔者并不推荐这种方法。思路、输入捕获一般来说,对STM32有一定了解的人在测量
    发表于 11-14 18:00

    请问以下这三个元器件是什么?

    `请问以下这三个元器件叫什么名字,干什么用的,哪个厂家的,对硬件一点也不懂,`
    发表于 09-27 15:52

    STM32测量频率占空比的几种方法

    由于我们当时的题目除了测量频率之外,更麻烦的是测量占空比。而这两测量方法联系比较紧密,所以也
    发表于 05-30 07:00

    STM32+ucosii+emwin这三个的配置是多少?

    本人使用的是stm32VET6,内存是64K的,单独移植ucos和emwin都成功了,但是当把两合在一起时程序跑到一半就进入HardFault_Handler。感觉应该是内存溢出了。请问有谁知道我这三个应该大概配置多少呢
    发表于 08-07 08:00

    实例讲解:几种STM32测量频率占空比方式的利与弊

    每次都进中断,1MHz的信号,每秒捕捉100万次,值都是一样有意义吗?是否可以每秒捕捉10次取平均值?把细节处理好就行了。)思路:输入捕获思路:一般来说,对
    发表于 09-01 18:13

    吃透PWM这三个知识点

    关注、星标公众号,直达精彩内容PWM有非常广泛的应用,比如直流电机的无极调速,开关电源、逆变器等等。个人认为,要充分理解或掌握模拟电路、且有所突破,很有必要吃透这三个知识点:PWM电感纹波...
    发表于 11-16 07:52

    如何利用STM32测量PWM的波频率占空比

    如何利用STM32测量PWM的波频率占空比
    发表于 11-18 07:00

    (纯干货)使用STM32测量频率占空比的几种方法

    本文详细介绍了使用STM32测量频率占空比的几种方法。
    的头像 发表于 03-13 15:43 4.2w次阅读
    (纯干货)使用<b class='flag-5'>STM32</b><b class='flag-5'>测量</b><b class='flag-5'>频率</b>和<b class='flag-5'>占空比</b>的几种方法

    基于STM32f103的输入捕获测频率占空比

    基于STM32f103的输入捕获测频率占空比
    发表于 08-02 10:10 122次下载

    STM32产生固定频率占空比可变的PWM

    讲述如何设置PWM波的频率和初始占空比,以及如何实现占空比可调的PWM。本文中笔者使用的STM32型号仍然是F103C8T6,如果你的STM32
    发表于 12-01 13:36 72次下载
    <b class='flag-5'>STM32</b>产生固定<b class='flag-5'>频率</b>和<b class='flag-5'>占空比</b>可变的PWM

    STM32频率占空比计算

    STM32的PWM应用广泛,最重要的就是调节占空比来达到PWM的控制应用。STM32的一个定时器能同时输出4路PWM分别占据一个通道,而定时器的频率确定了,四个通道的
    发表于 12-27 18:24 22次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>频率</b>和<b class='flag-5'>占空比</b>计算

    如何使用STM32测量频率占空比

    题目 (1)测量脉冲信号频率fo,频率范围为10Hz~2MHz,测量误差的绝对值不大于0.1%。 (2)测量脉冲信号
    发表于 02-11 11:01 34次下载
    如何使用<b class='flag-5'>STM32</b><b class='flag-5'>测量</b><b class='flag-5'>频率</b>和<b class='flag-5'>占空比</b>?