基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)

这篇具有很好参考价值的文章主要介绍了基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

写在前面

一般的做法(定时器单通道输入捕获)

以外部时钟的方式(高低频都适用)

测试效果


写在前面

STM32的定时器本身有输入捕获的功能。可选择双端捕获,上升沿捕获或者是下降沿捕获。对应捕获频率来说,连续捕获上升沿或下降沿的时间间隔就是其脉冲的周期.

一般的做法(定时器单通道输入捕获)

定时器设置频率为1M.

每次进入输入捕获的中断回调函数  HAL_TIM_IC_CaptureCallback 就让其计数值CNT为0. 那么连续两次采样的计数值也就是 (TIMx->CCRx - 0) ,频率 =定时器频率/(TIMx->CCRx - 0).


void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    
    

    
    if(htim->Instance == TIM2)
    {
        
        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
        {
            
            freq=htim->Instance->CCR2;
            freq = 1e6/freq;
            htim->Instance->CNT =0;
            
            
        
        }
        
    }
}

如果是单个定时器对多个通道进行采样呢?这时候就必须重新考虑如何测量频率了。通用做法:

(以上升沿为例,定时器的计数值TIMx->CNT设置为65535后溢出)

测量第一次上升沿的捕获值CCRx,即为first,并设置标记表示开始测量,若存在溢出则在定时器的溢出回调函数  HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)中记录溢出次数,直到第二个上升沿到来,计为 second,计算频率。

频率= 定时器的频率  /   (second - first +溢出次数*溢出值)

由上面的等式得出,若两个上升沿之间的计数值 > 定时器的频率 ,则脉冲的频率<1hz 属于低频。

低频是非常好测量的,难的是高频。若还想以直接的方式去测量高频,则不太现实,因为高频两个脉冲之间的间隔更短,而定时器的频率总不可能超过其系统频率,更不可能达到高频脉冲的频率。

直接不行变间接,将一段时间内的脉冲的个数进行计数统计,并记录所统计的这一段时间
频率  =  个数 /时间, 若设置时间为1s(特殊情况) 频率= 1s内的脉冲个数. 计时需要用到别的定时器。

以外部时钟的方式(高低频适用)

 

typedef struct mypwm{
  
 u32 ts; //记录的脉冲值
 u8 flag; //开始信号/结束信号
 u16 time; //记录的时间   
    
} mypwm;

mypwm m1 ={0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    
    
    if(htim->Instance == TIM6)
    {
        
        
        if(m1.flag == 0) m1.flag = 1; //第一次进来
        else if(m1.flag == 1){ 
            
          if( ++m1.time == 1000){//增加1ms
              
              //已经测了1s
              m1.time = 0;
              m1.flag = 0;
              freq = m1.ts;
              m1.ts = 0;
              
          } 
            
            
        }
    }
}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{

    
    if(htim->Instance == TIM2)
    {
        
        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
        {
            
 
            
         
            if(m1.flag == 1)  m1.ts++;
            
           
           
        }
        
    }
}

测试效果

通过定位器去控制脉冲发生器的输出频率以此测量:

基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)文章来源地址https://www.toymoban.com/news/detail-474135.html

到了这里,关于基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据

    ✨申明:本文章仅发表在 CSDN 网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创! 🍁对于文中所提供的相关资源链接将作不定期更换。 📌相关参考《HAL库教程9:串口接收不定长数据》 🎉对于串口接收不定长数据的处理方案网上有很多,个人觉得采用定时

    2024年02月09日
    浏览(29)
  • 2.基于正点原子STM32F103的定时器中断实验(HAL库实现)(cubeMX)

      基本上每一款MCU都会配备定时器这个外设,STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 同样,STM32F1系列的定时器功能也很强大,包括: TIM1和TIM8两个高级定时器; TIM2~TIM5是个通用寄存器; TIM7,TIM8,两个基本定时器。 由于本次实验适用于新手入门

    2023年04月26日
    浏览(138)
  • 基于CubeMX(hal库)stm32中hrtim高分辨率定时器的基本使用(自存)

    1、选通道 单通道输出or双通道输出 2、Timer A~F配置 (Master Timer不用管) 比较值Compare 个人感觉跟CCR差不多的意思, 注意不要大于上面的Period就行 设置上升沿和下降沿时间: 若想让上设Compare=CCR 如图设置 即可 即在 计数到Compare1时拉低,计数溢出时拉高 所以上图输出频率10kHz占

    2024年02月04日
    浏览(25)
  • STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    该篇文章中用到的步进电机闭环驱动器为Emm42_V4.0步进电机闭环驱动器。该闭环驱动器自带FOC矢量闭环控制算法,能实现力矩、速度、位置三环控制。 如下图所示,该42步进闭环电机驱动器的A+、A-、B+、B-连接步进电机,通过右侧的使能、脉冲、方向端对步进电机进行驱动控制

    2024年02月01日
    浏览(28)
  • STM32 HAL库-定时器中断

    关闭或开启所有中断;代码如下: STM32F407 有众多的定时器,其中包括 2 个基本定时器(TIM6 和 TIM7)、10 个通用定时 器(TIM2 ~ TIM5、TIM9 ~TIM14)、2 个高级控制定时器(TIM1 和 TIM8),这些定时器彼此完 全独立,不共享任何资源。 选择定时器,配置时钟源,设置预分频系数,计

    2024年01月25日
    浏览(35)
  • stm32——hal库学习笔记(定时器)

    使用纯软件(CPU死等)的方式实现定时(延时)功能 使用精准的时基,通过硬件的方式,实现定时功能 递增计数模式实例说明 中心对齐模式实例说明 TIM6 和TIM7 控制寄存器 1(TIMx_CR1) TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER) TIM6 和TIM7 状态寄存器(TIMx_SR) TIM6 和TIM7 计数器(TIMx_CNT)

    2024年02月21日
    浏览(29)
  • # HAL库STM32常用外设教程(四)—— 定时器 基本定时

    1、STM32F407ZGT6 2、STM32CubeMx软件 3、keil5 内容简述: 通篇文章将涉及以下内容,如有错误,欢迎指出 : 1、基础定时器特性 2、基础定时器的结构和功能 3、基础定时器HAL库驱动程序 (1)CubeMx配置 (2)TIM驱动程序   STM32F407有2个高级控制定时器(TIM1、TIM8)、8个通用定时器和

    2024年02月02日
    浏览(38)
  • STM32 HAL库 STM32CubeMX -- TIM(定时器中断)

    STM32F1 系列中,除了一些特殊的型号,大部分F1有8 个定时器,分为 基本定时器,通用定时器和高级定时器 。 基本定时器TIM6 和TIM7 是一个16 位的只能向上计数的定时器,只能定时,没有外部IO。 通用定时器TIM2/3/4/5 是一个16 位的可以向上/下计数的定时器,可以定时,可以输出

    2024年02月16日
    浏览(38)
  • 一文搞懂STM32定时器翻转模式(产生多路频率、占空比的PWM)

    在STM32定时器配置中,我们知道可以将定时器配置为PWM输出模式,也叫输出比较模式,通过修改ARR寄存器中的值可以改变PWM周期,通过修改CCR寄存器中的值可以修改,PWM的占空比,但是这种普通的PWM输出模式较为单一,能输出PWM的定时器有4个通道,这种方式只能够产生4路周期

    2024年02月12日
    浏览(23)
  • STM32 hal库编程定时器计数清零

    1、stm32定时器是有重装载功能的,所以定时器中断不关的话,就不需要计数清零 2、主要是应对单次计时使用,可能因为没有清零导致程序再次运行到相同位置时,中断立即出发,没有完成计时的功能。 顺便加一个读取定时器计数值得函数

    2024年02月03日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包