如何利用外部中断和定时器测量信号频率

发布者:Huayu8888最新更新时间:2024-07-09 来源: elecfans关键字:外部中断  定时器  信号频率 手机看文章 扫描二维码
随时随地手机看文章

摘要:利用定时器产生PWM波。然后利用32的外部中断和定时器来测量32输出的波形硬件:STM32F103C8T6核心板、示波器、串口调试助手所用到的的引脚为PA8和PA0。测量方案:在第一次外部中断(上升沿触发)到之时,开启定时器,同时计数器清零。

然后等待第二次中断到来,在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,同时关闭计数器。因为知道了计数器计数一个数的时间,所以在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,通过这个值就知道一个脉冲的时间周期。时间周期的倒数就是外部信号的频率。


一、利用TIM1的CH1产生PWM波

pwm.c

pIYBAF_hsaSAQGuFAAE6ludMWJY825.jpg

pwm.h

pIYBAF_hsbeAYdbyAAAY5I0_Ip0776.jpg

main.c

o4YBAF_hsc2AIZqLAAAY5I0_Ip0616.jpg



定时器1的通道1对应的是PA8引脚,连接示波器可以测出波形


二、将PA8与PA0相连接

这里利用PA8输出的PWM波形让PA0外部中断引脚测量。


三、外部中断和定时器测量频率

在配置定时器时最重要的就是配置定时器的预分频系数和重装载值。定时器的本质就是一个计数器,计数到我们设定的值后就会溢出,也就是重新从0开始开始计数。设置预分频系数就是设置计数器的频率,假设为71,F1的系统时钟为72M,经过72分频,给计数器的时钟频率就是1M,周期就是1/1M=1us。也是就1us计一个数。那么计几个数呢?这就要看重装载值ARR,这里我们设置为0XFFFF,也就是计数65536个数,就是计满整个寄存器的值。为什么要分频系数为72,重装载值为0XFFFF?这里给出详细的分析过程。

1 为什么要分频系数为72 F1的系统时钟为72M,F1的系统时钟为72M,如果不分频的话,提供给定时器的时钟就直接是72MHZ。72MHz是个什么概念?72MHz它对应的周期就是(1/72000000)秒,也就是计数器从0计数到最大值65535,只需要花费(65535/72000000)秒≈1ms。

这句话的意思就是如果你不分频,计数器最大只能定时1ms。那么你的定时器每隔1ms就会溢出一次。如果经过72分频,给计数器的时钟频率就是1M,周期就是1/1M=1us,也是就1us计一个数。换句话就是可以采样的波形频率为1M,提高了采样频率。另一方面也是容易计算,计一个数1us,计count个数就是count个us,频率就是1000000/count(HZ)。

2 为什么要重装载值为0XFFFF 最大采样间隔是跟定时器的中断间隔相关的,定时器产生溢出中断后计数值CNT会自动清0,定时器的中断间隔由分频系数Prescaler和自动重装载寄存器Period决定,分频系数前面已经确定,那最大采样间隔只需要考虑自动重装载寄存器Period的设置。

比如频分析系数71,自动重装寄存器值65535,则中断间隔=65536/72000000/72=65.536ms,即最大采样间隔65.536ms,如果65.536ms内没有检测到一个脉冲,则这么设定间隔是不合理的,必须想办法牺牲最小的采样时间1us(扩大分频系数)或者扩大自动重装寄存器值(16位<65535)来增加定时器中断间隔,也可以编写自己的应用函数来计算溢出的定时时间。

一般来说我们使用外部中断是不需要用到定时器的,看原子和野火的外部中断实验也没有用到外部中断。但是现在不是利用外部中断简单的处理一件事,而是利用外部中断测量频率,而测频率就涉及到时间,而只要涉及到时间,就需要用到定时器了。测量外部信号的频率,就是测量PWM波对吧!

如果我们测量到一个周期的时间,那么不就知道了信号的频率了吗?测量方案:在第一次外部中断(上升沿触发)到之时,开启定时器,同时计数器清零。然后等待第二次中断到来,在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,关闭计数器。因为我们知道了计数器计数一个数的时间,所以我们到在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,通过这个值就知道一个脉冲的时间周期。时间周期的倒数就是外部信号的频率。

具体代码如下:


当然你可能觉得这只是测量信号的一个周期脉冲不够准确,那么也可以测量100次脉冲的时间再除以100,就是一个脉冲的时间,然后再取倒数就可以算出频率,这种方法也是可以的。具体代码如下:

程序流程图

efae85dc-442d-11eb-8b86-12bb97331649.png

串口打印结果


当然测量信号频率的方法可以直接利用TIM的输入捕获的方法就可以实现。用外部中断只是另一种测量方案,具体用哪一种还要看具体情况。


关键字:外部中断  定时器  信号频率 引用地址:如何利用外部中断和定时器测量信号频率

上一篇:riscv中gd32vf103的中断行为分析
下一篇:如何实现模拟看门狗?

推荐阅读最新更新时间:2024-11-01 19:39

51单片机普通定时器时钟参考程序
/* 1、按键可以调整当时时间 2、按键可以调节定时时间 *8位数码管显示 时间格式格式 12-08-00 标示12点08分00秒 S1 用于小时 加1操作 S2 用于小时减1操作 S3 用于分钟 加1操作 S4 用于分钟减1操作 */ #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit KEY1=P3^0; //定义端口参数 sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; co de unsigned char tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
[单片机]
中断触发定时器:99秒计时+99秒倒计时
___________________________________________ 功能:99秒计时 时间2010—7—18 _________________________________________ #include reg52.h code unsigned char tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Dis_Shiwei; unsigned char Dis_Gewei; void delay(unsigned int cnt) { while(--cnt); }
[单片机]
定时器计数LED显示的简单程序
/* 注:该程序主要是如何运用定时器进行计数 体现模块化的子函数,是一个比较浅显的程序 */ #include reg52.h //头文件 #define uchar unsigned char //宏定义 #define uint unsigned int uchar count; //定义全局变量 void display_led() //led显示子函数 { if(count==20) //每隔1S发生变化(晶振为:12MHZ) { count=0; //计数清零,以便下次计数 P2=~P2; //P2的值取反 P2=P2 1; //P2的值左移 P2=~P2; if(P2==0xff) //如果最后一个LE
[单片机]
单片机控制外部中断输入
1、什么是外部中断 外部中断即通过外部电平或上下降沿触发所产生的中断 2、寄存器介绍 外部中断主要设置3个寄存器参数EA、EX、IT,这些寄存器分别属于IE和TCON; 其中 EA为总中断开关,1为打开,0为关闭; EX为外部中断允许寄存器,1为允许,0为关闭; IT为外部中断触发方式选择寄存器,1为边沿触发,0为电平触发; 3、程序设计 使用外部中断零设计电路,使单片机每中断一次,数码管显示加1,到10后返回0; #include reg52.h #define uchar unsigned char #define uint unsigned int uchar code smg_du ={0x3f,0x06
[单片机]
STC89C52单片机 定时器
怎么去设置定时? 例如: 定时 50微秒 首先 50000 ÷ 1.085 = 46,082.94930875576 从 0 开始加 19,453 次会溢出 这样的计算会有误差,但是影响比较小可以忽略不计 TH0 = (65535 - 46082) / 256; // 将商放在高八位 TL0 = (65535 - 46082) % 256; // 将余数放在低八位 或者 65535 - 46082 = 19453 十六进制得到:4BFD 二进制得到:0100 1011 1111 1101 将得到的十六进制分别放入 TH0 和 TL0; TH0 = 0x4
[单片机]
S3C2440开发板裸机程序系列03--定时器
1. S3C244时钟系统 与时钟有关的关键词: Fin – 外部输入的晶振频率,TQ2440外接晶振是12MHz; FCLK – 用于CPU核,即CPU核的频率; HCLK – 用于AHB(Advanced High Performance Bus)总线上的设备,包括存储控制器,LCD控制器,DMA等; PCLK – 用于APB(Advanced Peripheral Bus)总线上的低速设备,包括定时器,UART,ADC等 模式控制引脚OM3和OM2的组合关系决定了S3C2440的时钟源。 S3C2440有2个锁相环(PLL): MPLL提供给FCLK、HCLK、PCLK,UPLL专用于USB模块。 设置FCL
[单片机]
S3C2440开发板裸机程序系列03--<font color='red'>定时器</font>
单片机定时器工作模式1
通过前面的定时器理论了解到,使用一个定时器,要经过下面四步: 1、设置定时器/计数器的工作模式TMOD(常用的是模式1:TMOD=0x01); 2、装入预置数到THx和TLx中(THx=TLx=MAX(8192/65536/256)-计数次数); 3、如果工作在中断方式,则需要开定时器/计数器的中断TCON中的标志位:TF0/TF1=0/1; 4、启动定时器/计数器:TR0/TR1=1; //1、设置定时器/计数器的工作模式TMOD(常用的是模式1:TMOD=0x01); //2、装入预置数到THx和TLx中(THx=TLx=MAX(8192/65536/256)-计数次数); //3、如果工作在中断方式,则需要开定时器
[单片机]
STM32CUBEMX开发GD32F303(15)----外部中断EXTI
概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。 使用外部中断EXTI进行驱动LED。 最近在弄ST和GD的课程,需要GD样片的可以加群申请:615061293 。 视频教学 https://www.bilibili.com/video/BV1Ld4y1i7pF/ csdn课程 课程更加详细。 https://download.csdn.net/course/detail/37152 生成例程 这里准备了自己绘制的开发板进行验证。 查看原理图,PB14为按键管脚。 LED管脚为PB7. 配置时钟树 配置时钟为64M。 中断口配置 G
[单片机]
STM32CUBEMX开发GD32F303(15)----<font color='red'>外部中断</font><font color='red'>EXTI</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved