STM32CubeMX系列 | 输入捕获

发布者:DreamyEclipse最新更新时间:2023-03-21 来源: elecfans关键字:STM32CubeMX系列  输入捕获  测量频率 手机看文章 扫描二维码
随时随地手机看文章

1. 输入捕获简介

输入捕获模式可以用来测量脉冲宽度或者测量频率,下图以测量脉宽为例来说明输入捕获的原理

假定定时器工作在向上计数模式,图中t1-t2的时间就是我们需要测量的低电平时间。测量方法为:首先设置定时器通道x为下降沿捕获,在t1时刻就会捕获到当前的CNT值,然后立即清零CNT,并设置通道x为上升沿捕获,到t2时刻又会发送捕获事件,得到此时的CNT值(记为CCRx2)。在t1-t2之间可能产生N次定时器溢出,因此需要对定时器溢出做处理,防止低电平太长导致数据不准确。 t1-t2之间计数的次数为:N * ARR + CCRx2,再乘以CNT计数周期即可得到低电平持续时间

2. 硬件设计

本实验通过TIM5的通道1输入捕获功能捕获KEY_UP按键的高电平持续时间,并通过printf函数打印捕获到的高电平时间,用D1指示灯提示系统正常运行

  • D1指示灯

  • K_UP按键

  • USART1串口

  • TIM5

3. 软件设计

3.1 STM32CubeMX设置

  • RCC设置外接HSE,时钟设置为72M

  • PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平

  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位

  • 选择TIM5,设置定时器时钟源为内部时钟源、设置通道1为输入捕获模式(PA0自动被选中),NVIC设置中激活定时器中断,在GPIO设置里将PA0下拉保证没有信号输入的时候电平稳定

  • 预分频系数设置为72-1,向上计数,自动重装载值设为0xFFFF,则计时器时钟频率为1MHz,计时器周期为1us,定时器溢出周期为 65535 * 1 = 65535us

  • 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码

3.2 MDK-ARM编程

  • 在tim.c文件中编写定时器更新中断处理回调函数

/* TIM5CH1_CAP_STA 各数据位说明

** bit7   捕获完成标志

** bit6   捕获到高电平标志

** bit5~0 捕获高电平后定时器溢出的次数*/

uint8_t TIM5CH1_CAP_STA = 0;

uint16_t TIM5CH1_CAP_VAL;


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){

    if((TIM5CH1_CAP_STA & 0X80) == 0){  //还未成功捕获

        if(TIM5CH1_CAP_STA & 0X40){     //已经捕获到高电平

            if((TIM5CH1_CAP_STA & 0X3F) == 0X3F){   //高电平时间太长了

                TIM5CH1_CAP_STA |= 0X80;            //标记为完成一次捕获

                TIM5CH1_CAP_VAL = 0XFFFF;           //计数器值

            }

            else

                TIM5CH1_CAP_STA++;      //溢出次数加1            

        }   

    }

}

在tim.c文件中编写输入捕获中断处理回调函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){

    if((TIM5CH1_CAP_STA & 0X80) == 0){  //还未成功捕获

        if(TIM5CH1_CAP_STA & 0X40){     //捕获到上升沿后条件为真

            TIM5CH1_CAP_STA |= 0X80;    //标记为完成一次高电平捕获

            TIM5CH1_CAP_VAL = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);  //获取当前的计数器值

            TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);    //清除原来的设置       

            TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);    //设置上升沿捕获

        }

        else{

            TIM5CH1_CAP_STA = 0;

            TIM5CH1_CAP_VAL = 0;

            TIM5CH1_CAP_STA |= 0X40;    //标记捕获到上升沿

            __HAL_TIM_DISABLE(&htim5);  //关闭定时器

            __HAL_TIM_SET_COUNTER(&htim5,0);    //计数器值清零

            TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);    //清除原来的设置               

            TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);   //设置下降沿捕获

            __HAL_TIM_ENABLE(&htim5);   //使能定时器     

        }   

    }

}

此处的TIM_RESET_CAPTUREPOLARITY() 函数有一处HAL库函数错误,会导致编译该函数报错,解决办法是找到该函数在 stm32f1xx_hal_tim.h 文件中的定义,删除多余的一个反括号 ‘)’

stm32f1xx_hal_tim.h

//修改前

#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__)

  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP))) :

   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :

   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P)) :

   ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P)))

//修改后

#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__)

  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :

   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :

   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P)) :

   ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P)))

在main.c文件中编写高电平持续时间处理代码

int main(void){

  long long temp = 0;

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  MX_TIM5_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);    //一定要开启TIM5通道1的捕获中断

  __HAL_TIM_ENABLE_IT(&htim5,TIM_IT_UPDATE);    //一定要开启TIM5的更新中断

  printf("This is TIM_CAP test...n");

  /* USER CODE END 2 */

  while (1){

    HAL_Delay(500);

    if(TIM5CH1_CAP_STA & 0X80){     //完成一次高电平捕获

        temp = TIM5CH1_CAP_STA & 0X3F;

        temp *= 65536;              //溢出总时间

        temp += TIM5CH1_CAP_VAL;    //总的高电平时间

        printf("High level duration:%lld usrn",temp);

        TIM5CH1_CAP_STA = 0;        //准备下一次捕获

    }

    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);

  }

}

4. 下载验证

编译无误后下载到开发板,可以看到D1指示灯每500ms闪烁一次,按下KEY_UP后,串口会打印出相应的高电平持续时间


关键字:STM32CubeMX系列  输入捕获  测量频率 引用地址:STM32CubeMX系列 | 输入捕获

上一篇:STM32CubeMX系列 | PWM输出
下一篇:STM32CubeMX系列 | RTC实时时钟

推荐阅读最新更新时间:2024-11-06 18:42

TMS320F28335在电网频率测量中的应用(二)
2 系统硬件电路及其测量原理   2. 1 系统的组成   系统主要由互感器、低通滤波、过零检测、控制处理等模块组成。系统模块如图2 所示。      图2 系统硬件结构   在模拟通道的前端通过精密互感器对电网信号进行采集。低通滤波滤除信号的高次谐波, 以避免谐波对过零检测环节的影响, 提高测量精度。过零检测电路由电压比较器MAX474 和电阻等元件组成, 对正弦信号进行整形,得到与电网基波相同频率的方波信号, 提高信号边沿的捕捉精度。过零检测电路对正弦信号的陷波有一定的抑制能力。   2. 2 测量原理   采用TMS320F28335 的eCAP1 模块对方波的上升沿进行捕捉, 每次捕捉完上升沿后都对
[模拟电子]
TMS320F28335在电网<font color='red'>频率</font><font color='red'>测量</font>中的应用(二)
什么是频谱分析仪?频谱分析仪的工作原理
频谱分析仪从根本上说是一种测试仪器,可以在射频范围内测量电路或系统中的各种参数。 频谱分析仪是用于测量频率和许多其他参数的重要测试之一。有趣的是,频谱分析仪用于测量我们知道的信号并找到我们不知道的信号。由于其准确性,频谱分析仪已在电气和电子测量领域获得了许多应用。它用于测试许多电路和系统。这些电路和系统在射频级别上运行。 凭借其不同的模型配置,该设备在仪器仪表和测量领域具有其自身的多功能性。它具有不同的规格,尺寸,甚至可以根据特定应用提供。目前正在研究在甚高频范围内以超高频水平使用该设备。它甚至可以连接到计算机系统,并且测量结果可以记录在数字平台上。 什么是频谱分析仪? 频谱分析仪从根本上说是一种测试仪器,可以在射频范
[测试测量]
什么是频谱分析仪?频谱分析仪的工作原理
【STM32】HAL库 STM32CubeMX教程八---定时器输入捕获
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: PWM工作原理 STM32CubeMX创建PWM例程 HAL库定时器PWM函数库 PWM创建呼吸灯 什么是PWM 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非
[单片机]
【STM32】HAL库 <font color='red'>STM32CubeMX</font>教程八---定时器<font color='red'>输入</font><font color='red'>捕获</font>
lcr测量电感的频率选择
  lcr测量电感的频率选择   uF级陶瓷电容1Khz,nF级的几百KHz,pF级的不太容易测量准。总之在L和R和表足够精确时频率尽量低,减少线路、引脚电感和趋肤效应的影响。   lcr测量电感的频率参考条件   电容《200pF》100KHz并联   电容≥1μF(非电解电容)100Hz并联   电容≥1μF(电解电容)100Hz串联另加直流偏置,比如1V   电感<100nH》100KHz串联视情况加直流偏置   电感≥1H100Hz并联测量电平AC要低,如低至50mV。   电阻<100Ω1kHz串联   电阻≥10KΩ1KHz并联   其他元器件测试选用一般测试条件进行测试:电平AC选取1V,频率选取1KHz,
[测试测量]
lcr<font color='red'>测量</font>电感的<font color='red'>频率</font>选择
基于8051单片机的频率测量技术
0引言 随着无线电技术的发展与普及,"频率"已经成为广大群众所熟悉的物理量。而单片机的出现,更是对包括测频在内的各种测量技术带来了许多重大的飞跃,然而,小体积、价廉、功能强等优势也在电子领域占有非常重要的地位。为此.本文给出了一种以单片机为核心的频率测量系统的设计方法。 1 测频系统的硬件结构 测量频率的方法一般分为无源测频法、有源测频法及电子计数法三种。无源测频法(又可分为谐振法和电桥法),常用于频率粗测,精度在1%左右。有源比较法可分为拍频法和差频法,前者是利用两个信号线性叠加以产生拍频现象,再通过检测零拍现象进行测频,常用于低频测量,误差在零点几Hz;后者则利用两个非线性信号叠加来产生差频现象,然后通过检测零差现象进行
[单片机]
基于8051单片机的<font color='red'>频率</font><font color='red'>测量</font>技术
一种高可靠性的频率测量系统
  提出并研制了一种高可靠性、高精度、使用简单且便于维护的频率测量系统,该系统用于电力电子测量领域。其硬件系统以嵌入式PC104计算机为测控平台,软件系统以LabWindows/CVI为开发平台,采用测周期法,依据频率大小选用不同的基准频率。经实际测试证实,该设计满足精度和实时性的要求,检测效率高,便于操作与维护。该系统亦可用于其他要求高精度频率测量的领域中。   1 引言   频率是电力电子系统中1个基本的物理量,其测量问题在工程应用中非常重要。通常的测量方案是选用单片机或可编程逻辑器件。然而,在某些特殊场合,工作环境恶劣,要求测量精度高、可靠性强,使用常规的方案难以达到要求,或成本过高。本文提出了一种基于PC104测控计算机的
[测试测量]
一种高可靠性的<font color='red'>频率</font><font color='red'>测量</font>系统
STM32+FreeRTOS+CUBEMX_学习笔记(七 )输入捕获
前言 我们可以利用输入捕获模式来测量脉冲宽度或者测量频率。 1、cube设置 2、函数详解: /** * @brief Read the captured value from Capture Compare unit 读取通道捕获值 * @param htim TIM handle. * @param Channel TIM Channels to be enabled * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg T
[单片机]
STM32+FreeRTOS+CUBEMX_学习笔记(七 )<font color='red'>输入</font><font color='red'>捕获</font>
stm32定时器pwm模式输入捕获
stm32中的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。这种模式通常用在对输入信号频率frequency、占空比duty、高低脉宽的计算中,具有很广泛的用途。 STM32的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。 PWM模式捕获方法:利用TIM3_CH1作PWM输出,TIM2_CH2捕获上述PWM信号,并测出频率和占空比。设置PWM频率为1KHz,占空比50%。 具体步骤: 1. 为了实现PW
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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